하이퍼 파라미터 (Hyperparameter)
많은 머신 러닝 알고리즘은 학습을 하기 전에 미리 정해주어야 하는 변수 또는 파라미터들이 있다.
여기서 하이퍼 파라미터란 학습을 하기 전에 미리 정해줘야 하는 변수 또는 파라미터들을 의미하는데 scikit-learn에서 보통 모델을 만들 때 옵셔널 파라미터로 정해주는 변수들이다.
하이퍼 파라미터에 어떤 값을 넣어주느냐에 따라 성능에 큰 차이가 있을 수 있기 때문에 모델의 성능을 높여주는 좋은 하이퍼 파라미터를 고르는게 굉장히 중요하다.
예를 들면, Lasso는 L1 정규화를 해주는 회귀 모델인데, scikit-learn에서 Lasso 모델을 만들 때 alpha와 max_iter라는 옵셔널 파라미터를 지정해 준다.
model = Lasso(alpha=0.001, max_iter=1000)
여기서 alpha는 손실 함수의 정규화 항에 곱해지는 상수를 뜻하는데, 보통은 그리스 문자 λ를 쓴다.
그리고 max_iter는 경사 하강을 최대한 몇 번 할지를 정하는 값인데, 이 두 값은 모델이 직접 학습해서 배우는게 아닌 모델을 만드는 사람이 정해주어야 한다.
이처럼 하이퍼 파라미터에 어떤 값을 넣느냐에 따라 모델의 성능에 큰 차이가 있을 수 있으므로 모델의 성능을 최대한 높여주는 하이퍼 라라미터를 고르는게 굉장히 중요하다.
좋은 하이퍼 파라미터를 고르는 방법 중 하나인 그리드 서치를 알아보자.
그리드 서치(Grid Search)
그리드 서치는 정해줘야 하는 각 하이퍼 파라미터에 넣어보고 싶은 후보 값을 몇 개씩 정한 후, 모든 후보 값의 조합으로 모델을 학습시켰을 때 성능이 가장 좋았떤 하이퍼 파라미터 조합을 고르는 것이다.
예를 들면, Lasso 회귀 모델을 기준으로 alpha와 max_iter값을 찾기 위해 아래와 같은 표를 그리게 되는데 표의 원소들을 해당 행과 열에 있는 하이퍼 파라미터 조합으로 모델을 학습시켰을 때의 성능으로 채워준다.
그리고 각 성능은 k-겹 교차 검증을 사용하여 조금 더 정확하고 공평하게 계산한다.
그럼 성능을 모두 계산했을 때, 아래와 같은 표가 완성된다.
위 표에서 성능이 가장 좋게 나오는 칸(평균 제곱 오차근이 낮을수록 성능이 좋음)에 해당하는 행과 열인 하이퍼 파라미터값을 선택하면 된다. 이런 방법으로 grid(격자 모양)을 만들고 여기서 성능이 가장 좋은 하이퍼 파라미터를 찾는 방법이기 때문에 grid search라고 부른다.
예제
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV # 그리드서치
import numpy as np
import pandas as pd
import warnings
warnings.simplefilter(action='ignore')
GENDER_FILE_PATH = './datasets/gender.csv'
gender_df = pd.read_csv(GENDER_FILE_PATH)
X = pd.get_dummies(gender_df.drop(['Gender'], axis=1)) # 입력 변수를 one-hot encode한다
y = gender_df[['Gender']].values.ravel()
# 로지스틱 회귀 모델 정의
logistic_model = LogisticRegression()
# 하이퍼 파라미터 조합을 파이썬 딕셔너리로 정의
hyper_parameters = {
'penalty': ['l1', 'l2'],
'max_iter': [500, 1000, 1500, 2000]
}
# GridSearchCV를 이용하여 최적의 파라미터 조합을 찾음
hyper_parameter_tuner = GridSearchCV(estimator=logistic_model, param_grid=hyper_parameters, cv=5)
# estimator: 사용할 모델
# param_grid: 사용할 파라미터
# cv: k-fold
hyper_parameter_tuner.fit(X, y)
# 최적의 파라미터 조합을 변수 best_params에 저장
best_params = hyper_parameter_tuner.best_params_
best_params
# 출력 결과
# {'max_iter': 500, 'penalty': 'l2'}
# max_iter 변수가 500이고 penalty변수가 l2 일 때 저희의 로지스틱 모델의 성능이 가장 좋다는 걸 알 수 있다.