본문 바로가기

Data Science : Study/1. Python

하이퍼파라미터 튜닝 : Coarse & Fine Search

반응형

 

 

모델의 가장 성능의 좋은 파라미터를 선택하기 위해, 하이퍼파라미터 튜닝 작업을 거친다.

이 때 Coarse & Fine Search를 사용하여 파라미터를 찾는다.

  • Coarse Search
    Random Search를 하되, 이론상으로 존재 가능한 모든 하이퍼파라미터 범위를 집어넣는다.
    가장 좋은 하이퍼파라미터를 찾는 것은 어렵지만, 좋지 않은 하이퍼파라미터를 정렬해서 후순위로 높을 수 있다.
  • Fine Search
    Coarse Search를 통해 좋지 않은 하이퍼파라미터를 버린 뒤 다시 한 번 Random Search를 진행한다.

Kaggle의 샌프란시스코 범죄발생율 데이터를 이용하여 하이퍼파라미터 튜닝 과정을 확인해보자.

▶ 샌프란시스코 범죄발생율 예측?

 

캐글 샌프란시스코 범죄발생률 예측 : train & test

▶이전글 : EDA 캐글 샌프란시스코 범죄발생률 예측 : EDA 파이썬으로 진행하였고, 데이터 분석 강의 4주차를 마무리하고 캐글에 최종적으로 제출한 버전을 기반으로 코드를 설명했다. (중간 과정

hellominji.tistory.com

 

 

 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