본문으로 바로가기

HPO (Hyper-Parameter Optimization) == Model Tuning

1) Grid-Search

- 직접 후보군을 만들 수 있다.
- 후보군이 많아질수록 시간이 많이 걸린다.
- 딥러닝에서 많이 쓰인다.

 

2) Randomized-Search

- 분포를 만든다. (distribution, mean, std 설정)
- 딥러닝에서 더 권장 but 잘 시키지 않음
- 머신러닝 돌릴 때 더 많이 쓰인다.

 

3) Bayesian-Search

- 사전분포 깔고 실험에 들어가서, hyperparameter 바꿔가며 성능 측정
- 후보 분포를 끄집어낸다.
- AutoML의 기반

 


GridSearch

- 최적의 하이퍼파라미터를 찾아준다.

- 5-fold cross validation으로 5개의 validation set으로 평균을 낸 결과를 보여준다.

- GridSearchCV(사용할 모델, param_grid, refit, verbose)
- refit : 찾아진 가장 좋은 params로 estimator를 setting할 지 여부 (setting해줘야 곧바로 predict가 가능)
- verbose(수다쟁이) : 설명의 자세한 정도 verbose를 3과 같이 바꿔보면 더 자세하게 매 param set 마다의 결과를 확인 가능 (작게주면 작게줄수록 silent, 크게주면 크게줄수록 detailed)

from sklearn.model_selection import GridSearchCV
# train_test_split, kFold, ...

# 아래 param_grid dict 의 C & gamma 에 후보 Hyper-params 값들을 리스트업
# 따로 params만 적어줄 때는 str 형태로 넣어주어야 한다.
param_grid = {'C' : [0.1, 1, 10, 100, 1000], 
             'gamma' : [1, 0.1, 0.01, 0.001, 0.0001],
             'kernel' : ['rbf']}

grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1)
# GridSearchCV(사용할 모델, param_grid, refit, verbose)
# refit : 찾아진 가장 좋은 params로 estimator를 setting할 지 여부 (setting해줘야 곧바로 predict가 가능)
# verbose : 설명의 자세한 정도 (verbose를 3과 같이 바꿔보면 더 자세하게 매 param set 마다의 결과 확인 가능)
# verbose(수다쟁이): 작게주면 작게줄수록 silent, 크게주면 크게줄수록 detailed

grid.fit(X_train_scaled, y_train)
print('The best parameters are ', grid.best_params_)

# 다시 모델 만들었을 때, 정확도가 더 떨어졌을 수 있다
# 이는 GridSearchCV가 5-fold이기 때문
# 하지만 k-fold가 나으니 하는 것이 더 나음

 

refit=True로, 가장 좋은 하이퍼파라미터는 grid에 저장된 상태이다.

다시 학습 데이터를 train시켜주고 다시 예측시킨다.

classification_report(y_test, grid_predictions)를 통해 Precision, Recall, F-1 score 확인 가능

# refit=True -> best_params로 다시 train 시켜준다
from sklearn.metrics import classification_report

grid_predictions = grid.predict(X_test_scaled)
print(classification_report(y_test, grid_predictions)) # Precision, Recall, F1-score 등을 확인

 

다시 성능을 평가해보면, Grid Search를 해서 찾아낸 결과가 대체적으로 성능이 좋은 것을 알 수 있다.

print("Accuracy on Training set: {:.3f}".format(grid.score(X_train_scaled, y_train)))
print("Accuracy on Test set: {:.3f}".format(grid.score(X_test_scaled, y_test)))