본문 바로가기
머신러닝, 딥러닝/머신러닝

[머신러닝] 하이퍼 파라미터 튜닝, Cross validation

by 장찐 2022. 4. 18.

📚 Hyperparameter란 

 일반적으로 모델에서 학습을 통해서 값이 결정되는 값을 파라미터라고 한다. 이 중에서 사용자가 값을 결정할 수 있는 파라미터를 하이퍼 파라미터라고 부른다. 하이퍼파라미터는 여러 가지 값을 대입해 보면서 최적의 값을 선택해야 한다. 이렇게 파라미터 값을 변경하면서 최적 값을 찾는 과정을 "모델 튜닝" 이라고 부른다. 

 

📌주의점! 

 하이퍼 파라미터 튜닝 시, test set을 사용해서는 안된다. Test set은 모델의 최종 성능 평가를 위해서 사용되므로 모델의 학습 과정에서는 절대 사용되어서는 안된다. 따라서 validation set을 추가하여 사용해야 한다. 

 


📚 K-fold crossvalidation 

Cross validation은 모델 과적합을 감소시키고 모형의 일반화 가능성을 높이기 위해서 사용한다. 

 학습 데이터를 K개의 데이터셋으로 나누고 번갈아 가면서 학습/테스트를 진행함. 일반적으로 k는 5~10 사이의 값을 사용한다. 

그리고 각 split마다 산출되는 평가 수치(accuracy, F1 score 등)의 평균값으로 최적의 파라미터를 선정한다. 

 k-fold로 최적의 파라미터 값을 선정한 후에는, 해당 파라미터로 다시 전체 train set으로 학습하고 test set으로 평가를 진행한다. 

 


📚 Grid Search 

 파라미터 값으로 입력할 수 있는 후보가 많을 때, 하나씩 값을 입력해보면서 최적의 파라미터 값을 구하는 방법.

Grid-search is used to find the optimal hyperparameters of a model which results in the most ‘accurate’ predictions

 

✅ Example 

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
iris = pd.read_csv('iris_data.csv')

iris_np = iris.values

#독립/종속변수 선택 
iris_features = iris_np[:,:-1]
iris_labels = iris_np[:,-1]

#기본 전처리 
from sklearn import preprocessing
le = preprocessing.LabelEncoder() # categorical 변수의 값을 숫자로 변환
input_classes =['versicolor','virginica']
le.fit(input_classes)
iris_labels = le.transform(iris_labels

#train/test 분리 
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_features, iris_labels, test_size = 0.3, random_state=0)

 iris 데이터를 불러오고 전처리, 학습데이터 분리 등을 진행한다. 

 

lr_model = LogisticRegression(max_iter=10000) 

from sklearn.model_selection import GridSearchCV
LR_params = {
    'penalty' : ['l1', 'l2'], # 'none' 포함 가능
    'C': [0.01, 0.05, 0.1, 0.5, 1, 5, 10],
    'solver':['saga']
}

grid_search = GridSearchCV(lr_model, param_grid=LR_params, cv=5)

grid_search.fit(X_train, y_train)

penalty = none인 경우에는 자동으로 C 값을 무시하고 그리드서치를 진행한다. 

 

 

#최적 파라미터 값 출력
grid_search.best_params_

 

#최적 파라미터로 trainset 다시 학습 
best_model2 = LogisticRegression(C=0.1, penalty='l1', solver='saga', max_iter=2000) 
best_model2.fit(X_train, y_train)
y_preds = best_model2.predict(X_test)

accuracy_score(y_test, y_preds)

 최적의 파라미터로 다시 전체 trainset에 대해서 학습을 진행하고, test set에 대해서 평가를 진행한다. 

 

 trainset으로 다시 학습하지 않고 그냥 Grid search의 결과를 그대로 사용하고자 하는 경우 위와 같이 적용 가능 

 


📚  Reference

 이상엽, 연세대학교 언론홍보영상학부 부교수, 22-1학기 기계학습 이론과 실습 

 

 

댓글