[ML] 교차검증과 하이퍼파라미터 튜닝
교차검증과 하이퍼파라미터 튜닝은 머신러닝 모델의 성능을 높이기 위해 사용하는 기법
교차검증
학습과 검증을 위해 train set, validation set, test set으로 데이터를 나눔
하지만 이러한 방법은 overfitting에 취약할 수 있고 데이터의 개수가 적을 때 어려움이 있음
그리고 고정된 train set와 test set으로 평가를 하다 보면 test set에서만 최적의 성능을 발휘하도록
편향될 수 있기에 이 문제를 해결하기 위해 나온 것이 교차검증

raw 데이터가 충분하지 않을 때 사용하는 방법이 k-fold cross validation
가장 보편적으로 사용되는 교차검증 기법으로 train set를 k개로 분할하여
1개의 validation fold를 나머지 k-1개의 training fold를 만들어 학습과 검증 평가를 반복적으로 수행
위의 사진을 참고하면 파란색으로 validation set이 설정되면 나머지 회색이 training set이 됨
하이퍼파라미터 튜닝
머신러닝 모델을 구성하는 하이퍼 파라미터를 조정해 알고리즘의 성능을 개선하는 것이 하이퍼파라미터 튜닝
그중 가장 보편적으로 사용되는 Grid Search를 알아볼 것
Grid Search는 하이퍼 파라미터의 집합을 만들어 이를 순차적으로 적용하여 최적화를 수행
지정해 준 여러 하이퍼 파라미터를 순차적으로 조합하여 최고의 성능을 나타내는 파라미터 조합을 찾아줌
이때 단점은 학습하고자 하는 파라미터 수에 따라 학습이 많이 늘어나서 시간이 오래 걸리는 것
교차검증 & 하이퍼 파라미터 튜닝 실습
import numpy as np
import pandas as pd
import sklearn
import warnings
warnings.filterwarnings('ignore')
from sklearn.datasets import load_iris
iris = load_iris()
X = iris['data']
y = iris['target']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=1234)
train set, test set 8:2로 분리하고 시드넘버를 1234로 지정
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(max_depth=1, random_state=1234)
model.fit(X_train, y_train)
pred = model.predict(X_test)
iris 데이터 자체가 아주 예쁜 데이터이므로 accuracy의 차이를 보이기 위해 max_depth를 1로 설정
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
print('-------------- RandomForest --------------')
print('RandomForest Accuracy : ', round(accuracy_score(y_test, pred) * 100, 2))
kfold = KFold(n_splits=5, random_state=1234, shuffle=True)
cross_result = cross_val_score(model, X_train, y_train, cv=kfold, scoring='accuracy')
print('RandomForest Cross Validation Accuracy : ', round(cross_result.mean() * 100, 2))
>>> -------------- RandomForest --------------
RandomForest Accuracy : 60.0
RandomForest Cross Validation Accuracy : 71.67
5-fold cross validation을 한 후 성능이 향상되는 것을 볼 수 있음
from sklearn.model_selection import GridSearchCV
model = RandomForestClassifier(max_depth=1, random_state=1234)
param_grid = {'n_estimators' : range(100, 1000, 100)}
model_rf = GridSearchCV(model, param_grid=param_grid, cv=5, scoring='accuracy')
model_rf.fit(X_train, y_train)
print('RandomForest Hyperparameter Tuning Accuracy : ', round(model_rf.best_score_ * 100, 2))
print('RandomForest Hyperparameter Tuning Parameter : ', model_rf.best_params_)
>>> RandomForest Hyperparameter Tuning Accuracy : 80.0
RandomForest Hyperparameter Tuning Parameter : {'n_estimators': 100}
Decision Tree의 앙상블 모형이 Random Forest인데 DT 몇 개를 앙상블 할 것인지를 결정하는
n_estimators의 개수를 range(100, 1000, 100)을 통해 100, 200... 900까지를 돌려본 결과
100개의 DT를 앙상블 했을 때의 RF의 accuracy가 제일 높게 나온 것을 확인할 수 있음