Table of Contents

ML

하이퍼파라미터 튜닝 Hyperparameter tunning

꼬꼬마코더 2024. 5. 29. 15:16
728x90

하이퍼파라미터 튜닝은 머신러닝 모델의 성능을 최적화하기 위해 하이퍼파라미터 값을 조정하는 과정입니다. 하이퍼파라미터는 학습 알고리즘의 동작을 제어하는 설정 값으로, 모델 학습 과정에서 직접적으로 학습되는 파라미터가 아닙니다. 하이퍼파라미터 튜닝은 모델의 성능에 큰 영향을 미칠 수 있으며, 이를 효과적으로 수행하기 위한 여러 가지 방법이 있습니다.

주요 하이퍼파라미터 튜닝 방법

  1. 그리드 탐색 (Grid Search)
    • 모든 가능한 하이퍼파라미터 조합을 시도하여 최적의 하이퍼파라미터를 찾는 방법입니다.
    • 탐색 공간이 커질수록 계산 비용이 증가하지만, 모든 조합을 시도하므로 최적의 조합을 찾을 확률이 높습니다.
  2. 랜덤 탐색 (Random Search)
    • 그리드 탐색과 달리, 하이퍼파라미터 공간에서 무작위로 조합을 선택하여 탐색하는 방법입니다.
    • 탐색 공간이 크더라도 상대적으로 적은 계산 비용으로 좋은 결과를 찾을 수 있는 가능성이 있습니다.
  3. 베이지안 최적화 (Bayesian Optimization)
    • 이전의 평가 결과를 바탕으로 다음 탐색 지점을 선택하여 하이퍼파라미터를 튜닝하는 방법입니다.
    • 탐색 과정을 모델링하여 최적의 하이퍼파라미터를 더 효율적으로 찾을 수 있습니다.
    • 대표적인 라이브러리: Hyperopt, Optuna, BayesianOptimization
  4. 진화 알고리즘 (Evolutionary Algorithms)
    • 진화론적 원리에 기반한 알고리즘으로, 자연 선택 과정과 유사하게 하이퍼파라미터를 최적화하는 방법입니다.
    • 대표적인 알고리즘: Genetic Algorithm, Particle Swarm Optimization
  5. 하이퍼밴드 (Hyperband)
    • 랜덤 탐색과 빌딩(blocking) 방식을 결합하여 효율적으로 하이퍼파라미터를 최적화하는 방법입니다.
    • 모델의 성능을 빠르게 평가하고, 성능이 낮은 하이퍼파라미터 조합을 빨리 배제합니다.

그리드 탐색 (Grid Search) 예시

Scikit-learn의 GridSearchCV를 사용하여 그리드 탐색을 수행하는 예제입니다.

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import classification_report

# 데이터 로드 및 분할
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# 하이퍼파라미터 그리드 설정
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': [2, 5, 10]
}

# 랜덤 포레스트 모델 생성
rf = RandomForestClassifier(random_state=42)

# 그리드 탐색 수행
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, scoring='f1_macro')
grid_search.fit(X_train, y_train)

# 최적의 하이퍼파라미터 출력
print("Best Parameters:", grid_search.best_params_)

# 테스트 데이터에 대한 성능 평가
y_pred = grid_search.predict(X_test)
print("Classification Report:\n", classification_report(y_test, y_pred))

랜덤 탐색 (Random Search) 예시

Scikit-learn의 RandomizedSearchCV를 사용하여 랜덤 탐색을 수행하는 예제입니다.

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV, train_test_split
from sklearn.metrics import classification_report
from scipy.stats import randint

# 데이터 로드 및 분할
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# 하이퍼파라미터 분포 설정
param_dist = {
    'n_estimators': randint(50, 200),
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': randint(2, 11)
}

# 랜덤 포레스트 모델 생성
rf = RandomForestClassifier(random_state=42)

# 랜덤 탐색 수행
random_search = RandomizedSearchCV(estimator=rf, param_distributions=param_dist, n_iter=50, cv=5, scoring='f1_macro', random_state=42)
random_search.fit(X_train, y_train)

# 최적의 하이퍼파라미터 출력
print("Best Parameters:", random_search.best_params_)

# 테스트 데이터에 대한 성능 평가
y_pred = random_search.predict(X_test)
print("Classification Report:\n", classification_report(y_test, y_pred))

베이지안 최적화 예시 (Optuna)

Optuna 라이브러리를 사용하여 베이지안 최적화를 수행하는 예제입니다.

import optuna
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import make_scorer, f1_score

# 데이터 로드 및 분할
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

def objective(trial):
    # 하이퍼파라미터 탐색 공간 설정
    n_estimators = trial.suggest_int('n_estimators', 50, 200)
    max_depth = trial.suggest_categorical('max_depth', [None, 10, 20, 30])
    min_samples_split = trial.suggest_int('min_samples_split', 2, 10)

    # 모델 생성
    rf = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, min_samples_split=min_samples_split, random_state=42)

    # 교차검증을 통한 성능 평가
    score = cross_val_score(rf, X_train, y_train, cv=5, scoring=make_scorer(f1_score, average='macro')).mean()

    return score

# 최적화 실행
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)

# 최적의 하이퍼파라미터 출력
print("Best Parameters:", study.best_params_)

# 최적 모델로 학습 및 테스트 데이터 평가
best_rf = RandomForestClassifier(**study.best_params_, random_state=42)
best_rf.fit(X_train, y_train)
y_pred = best_rf.predict(X_test)
print("Classification Report:\n", classification_report(y_test, y_pred))

요약

  • 그리드 탐색 (Grid Search): 모든 가능한 하이퍼파라미터 조합을 시도하여 최적의 조합을 찾습니다.
  • 랜덤 탐색 (Random Search): 하이퍼파라미터 공간에서 무작위로 조합을 선택하여 탐색합니다.
  • 베이지안 최적화 (Bayesian Optimization): 이전 평가 결과를 바탕으로 효율적으로 하이퍼파라미터를 탐색합니다.
  • 진화 알고리즘 (Evolutionary Algorithms): 자연 선택 과정을 모방하여 하이퍼파라미터를 최적화합니다.
  • 하이퍼밴드 (Hyperband): 모델의 성능을 빠르게 평가하고, 효율적으로 하이퍼파라미터를 최적화합니다.

각 방법은 상황에 따라 장단점이 있으므로, 데이터의 크기와 모델의 복잡성에 맞춰 적절한 방법을 선택하는 것이 중요합니다.

'ML' 카테고리의 다른 글

클러스터링에서 거리 계산 방법  (0) 2024.05.29
클러스터링 Clustering  (0) 2024.05.29
교차검증(Cross-Validation)  (0) 2024.05.29
Classification Model 평가 및 지표 해석  (0) 2024.05.29
Validation set  (0) 2024.05.29