하이퍼파라미터 튜닝
- Hyperparameter의 개수가 많은 경우 조합할 경우의 수가 너무 많으므로 자동화가 필요.
sklearn의 튜닝 자동화 클래스
- RandomizedSearchCV
- GridSearchCV
적용 방법
- 사용할 search 방법을 선택한다.
- hyperparameter 도메인을 설정한다(max_depth, n_estimators 등).
- 학습을 시킨다.
- 도출된 결과 값을 모델에 적용하고 성능을 비교한다.
RandomizedSearchCV
- 모든 매개 변수 값이 시도되는 것이 아니라 지정된 분포에서 고정된 수의 매개 변수 설정이 샘플링 됨
- 시도 된 매개 변수 설정의 수는 n_iter에 의해 제공됨
주요 Hyperparameter (LGBM)
- random_state : 랜덤 시드 고정 값. 고정해두고 튜닝할 것.
- n_jobs : CPU 사용 개수
- learning_rate : 학습률. default=0.1, n_estimators와 여관지어 튜닝.
- n_estimators : 부스팅 스테이지 수(랜덤포레스트의 트리 개수 설정과 비슷한 개념). default=100
- max_depth : 트리의 깊이. 과대적합 방지용. default=3
- colsample_bytree : 샘플 사용 비율(max_features와 비슷한 개념). 과대적합 방지용. default=1.0
params= {
'n_estimators' : [200, 500, 1000, 20000],
'learning_rate' : [0.1, 0.05, 0.01],
'max_depth' : [6, 7, 8],
'colsample_bytree' : [0.8, 0.9, 1.0],
'subsample' : [0.8, 0.9, 1.0]
}
from sklearn.model_selection import RandomizedSearchCV
- n_iter 값을 조절하여 총 몇회의 시도를 진행할 것인지 정의한다.
- 회수가 늘어나면 더 좋은 파라미터를 찾을 확률은 높아지나 시간이 오래 걸린다.
clf = RandomizedSearchCV(LGBMRegressor(), params, random_state=42, cv=3, n_iter=25, scoring='neg_mean_squared_error')
clf.fit(x_train, y_train)
clf.best_score_
'''
출력
-13.642938938945603
'''
clf.best_params_
'''
출력
{'colsample_bytree': 0.8,
'learning_rate': 0.1,
'max_depth': 6,
'n_estimators': 500,
'subsample': 1.0}
'''
lgbm = LGBMRegressor(random_state=42, learning_rate=0.1, n_estimators=500, colsample_bytree=0.8, subsample=1.0, max_depth=6)
lgbm.fit(x_train, y_train)
lgbm_pred = lgbm.predict(x_test)
GridSearchCV
- 모든 매개 변수 값에 대하여 완전 탐색을 시도함
- 따라서, 대상 파라미터가 많다면 시간이 매우 오래 걸림
params= {
'n_estimators' : [500, 1000],
'learning_rate' : [0.1, 0.05, 0.01],
'max_depth' : [7, 8],
'colsample_bytree' : [0.8, 0.9],
'subsample' : [0.8, 0.9]
}
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(LGBMRegressor(), params, cv=3, n_jobs=-1, scoring='neg_mean_squared_error')
grid_search.fit(x_train, y_train)
grid_search.best_score_
'''
출력
-13.6851764785058
'''
grid_search.best_params_
'''
출력
{'colsample_bytree': 0.9,
'learning_rate': 0.01,
'max_depth': 7,
'n_estimators': 1000,
'subsample': 0.8}
'''
lgbm = LGBMRegressor(random_state=42, learning_rate=0.01, n_estimators=1000, colsample_bytree=0.9, subsample=0.8, max_depth=7)
lgbm.fit(x_train, y_train)
lgbm_pred = lgbm.predict(x_test)