반응형
모델의 가장 성능의 좋은 파라미터를 선택하기 위해, 하이퍼파라미터 튜닝 작업을 거친다.
이 때 Coarse & Fine Search를 사용하여 파라미터를 찾는다.
- Coarse Search
Random Search를 하되, 이론상으로 존재 가능한 모든 하이퍼파라미터 범위를 집어넣는다.
가장 좋은 하이퍼파라미터를 찾는 것은 어렵지만, 좋지 않은 하이퍼파라미터를 정렬해서 후순위로 높을 수 있다. - Fine Search
Coarse Search를 통해 좋지 않은 하이퍼파라미터를 버린 뒤 다시 한 번 Random Search를 진행한다.
Kaggle의 샌프란시스코 범죄발생율 데이터를 이용하여 하이퍼파라미터 튜닝 과정을 확인해보자.
▶ 샌프란시스코 범죄발생율 예측?
Coarse Search
1. 필요한 변수 세팅
import numpy as np
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import log_loss # 해당 대회의 측정공식
X_train_kf, X_test_kf, y_train_kf, y_test_kf = \
train_test_split(X_train, y_train, test_size = 0.3, random_state = 37)
n_estimators = 100
num_loop = 100
early_stopping_rounds = 20
n_estimators : 트리의 개수
num_loop : Random Search 반복 횟수
2. 모델 생성 및 학습
▶ 이론 상으로 존재하는 모든 하이퍼파라미터 범위 탐색
learning_rate = 10 ** np.random.uniform(low = -10, high = 1)
num_leaves = np.random.randint(2, 500)
max_bin = np.random.randint(2, 500)
min_child_samples = np.random.randint(2, 500)
subsample = np.random.uniform(low = 0.1, high = 1.0)
colsample_bytree = np.random.uniform(low = 0.1, high = 1.0)
▶ LGBMClassifier
model = LGBMClassifier(n_estimators = n_estimators,
learning_rate = learning_rate,
num_leaves = num_leaves,
max_bin = max_bin,
min_child_samples = min_child_samples,
subsample = subsample,
subsample_freq = 1,
colsample_bytree = colsample_bytree,
class_type = 'balanced',
random_state = 37)
▶ 모델 학습
model.fit(X_train_kf, y_train_kf,
eval_set = [(X_test_kf, y_test_kf)],
verbose = 0,
early_stopping_rounds = early_stopping_rounds)
▶ 가장 좋은 점수와 이에 해당하는 n_estimators를 저장
best_iteration = model.best_iteration
score = model.best_score_['valid_0']['multi_logloss']
▶ hyperparameter 탐색 결과를 리스트에 저장
coarse-hyperparameters_list.append({
'loop': loop,
'n_estimators': best_iteration,
'learning_rate': learning_rate,
'num_leaves': num_leaves,
'max_bin': max_bin,
'min_child_samples': min_child_samples,
'subsample': subsample,
'subsample_freq': 1,
'colsample_bytree': colsample_bytree,
'class_type': 'balanced',
'random_state': 37,
'score': score
})
3. 최적 파라미터 확인
coarse_hyperparameters_list = pd.DataFrame(coarse_hyperparameters_list)
coarse_hyperparameters_list = coarse_hyperparameters_list.sort_values(by = "score")
Fine Search
1. 필요한 변수 세팅: Coarse Sesarch와 동일
2. 모델 생성 및 학습
▶ Coarse search를 통해 좁힌 하이퍼파라미터 범위 탐색
learning_rate = 10 ** np.random.uniform(low = 0.030977, high = 0.047312)
num_leaves = np.random.randint(16, 483)
max_bin = np.random.randint(135, 454)
min_child_samples = np.random.randint(111, 482)
subsample = np.random.uniform(low = 0.411598, high = 0.944035)
colsample_bytree = np.random.uniform(low = 0.603785, high = 0.929522)
그 이후의 과정은 동일.
리스트의 이름을 fine_hyperparameters_list로 설정하는 것만 주의.
최종모델 생성
Fine Search로 찾은 가장 좋은 파라미터를 이용하여 최종 모델 생성
best_hyperparameters = fine_hyperparameters_list.iloc[0]
model = LGBMClassifier(n_estimators = best_hyperparameters['n_estimators'],
learning_rate = best_hyperparameters['learning_rate'],
num_leaves = best_hyperparameters['num_leaves'],
max_bin = best_hyperparameters['max_bin'],
min_child_samples = best_hyperparameters['min_child_samples'],
subsample = best_hyperparameters['subsample'],
subsample_freq = best_hyperparameters['subsample_freq'],
colsample_bytree = best_hyperparameters['colsample_bytree'],
class_type = best_hyperparameters['class_type'],
random_state = best_hyperparameters['random_state'])
반응형
'Data Science : Study > 1. Python' 카테고리의 다른 글
Python : Dictionary (0) | 2022.08.28 |
---|---|
Python : list (0) | 2022.08.27 |
모델 : LightGBM (1) | 2020.11.16 |
Python : csr_matrix (데이터의 수를 줄이는 방법) (0) | 2020.07.07 |
Python : (pandas) One- hot encoding (0) | 2020.05.29 |