Skip to main content

하이퍼 파라미터 튜닝

파라미터 vs. 하이퍼파라미터

  • 파라미터
    • 데이터로부터 학습되는 변수
    • 신경망에서 가중치
    • 역전파 알고리즘을 통해 학습
  • 하이퍼파라미터
    • 모형 또는 학습의 특성을 정의하는 변수
    • 학습 전에 결정
    • 종류:
      • 신경망의 구조: 은닉층의 수, 각 층의 폭, 활성화 함수
      • 학습 및 최적화: 학습률, 배치의 크기, 최적화 알고리즘, 에포크 수, 학습 중단 방식
      • 정칙화: 드롭아웃 방식, 데이터 증강 등

실습 준비

import pandas as pd
df = pd.read_excel('cancer.xlsx')
#전처리
target = 'diagnosis'
y = df[target].map({'B' : 0, 'M': 1})
X = df.drop(columns=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 = 42)

하이퍼파라미터 vs. 파라미터

# Support Vector Machine
from sklearn.svm import SVC
model = SVC(kernel='linear')
#하이퍼 파라미터
model.get_params()
#학습
model.fit(X_train, y_train)
#파라미터
model.coef_

하이퍼파라미터 튜닝 hyperparameter tuning

  • 하이퍼파라미터: 모형의 성격이나 학습 방법과 관련된 설정
  • 학습률, 은닉층의 수, 은닉층의 크기 등
  • 데이터로부터 학습될 수 없고 시행착오를 통해 튜닝
  • 보통 1, 2, 3, ...이 아니라 1, 10, 100, ... 등으로 탐색

Validation 또는 Development set

  • 테스트셋 데이터를 이용해서 결정하면 하이퍼파라미터가 테스트셋에 과적합될 우려
  • 별도의 Validataion 또는 Development set을 이용해서 하이퍼파라미터를 결정

하이퍼파라미터 튜닝

교차 검증 cross-validation

  • 하나의 검증셋만 사용할 경우, 하이퍼파라미터가 정확하지 않을 수 있음
  • 다양한 검증셋을 이용하여 검증
  • K-fold
    • 가장 많이 사용하는 방법
    • 훈련 데이터를 k개의 겹치지 않는 부분으로 나눔
    • k-1개로 훈련하고 나머지 하나로 검증하는 것을 k번 반복

교차 검증

#5-Fold
from sklearn.model_selection import KFold
kf = KFold(n_splits = 5)
for train, val in kf.split(X_train):
model.fit(X_train.iloc[train], y_train.iloc[train])
print(model.score(X_train.iloc[val], y_train.iloc[val]))
#간단하게
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X_train, y_train, cv=5)

격자 탐색과 무작위 탐색

  • 격자 탐색 grid search: 각 하이퍼파라미터의 설정값을 정하고, 이들을 조합하여 하나씩 시도
  • 무작위 탐색 random search: 하이퍼파라미터를 무작위로 조합하여 하나씩 시도
  • 하이퍼파라미터를 더 다양하고 촘촘하게 탐색하여 격자 탐색보다 더 높은 성능을 내는 경향

격자 탐색

#격자 탐색
from sklearn.model_selection import GridSearchCV
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
grid_cv = GridSearchCV (model, param_grid, cv=5, verbose = 2)
grid_cv.fit(X_train, y_train)
#가장 성능이 높은 하이퍼파라미터
grid_cv.best_params_
#가장 성능 높은 모델로 테스트
best_model = grid_cv.best_estimator_
best_model.score(X_test, y_test)

무작위 탐색

#격자 탐색
from sklearn.model_selection import RandomizedSearchCV
random_cv = RandomizedSearchCV(model, param_grid, n_iter = 10, cv=5, verbose = 2)
random_cv.fit(X_train, y_train)
#가장 성능이 높은 하이퍼파라미터
random_cv.best_params_
#가장 성능 높은 모델로 테스트
best_model = random_cv.best_estimator_
best_model.score(X_test, y_test)

난수 생성을 이용한 무작위 탐색

#1에서 10까지 균등 분포
import scipy
p = scipy.stats.randint(1, 10)
p.rvs(10)
#1에서 10까지 이산균등분포
p = scipy.stats.randint(1, 10)
# 10^-4 에서 10^-1 까지 로그 균등 분포
p = scipy.stats.loguniform(1e-4, 1e-1)

난수 생성을 이용한 무작위 탐색

#하이퍼파라미터를 분포로 설정
param_grid = [
{'C': scipy.stats.loguniform(1, 1000), 'kernel': ['linear']},
{'C': scipy.stats.loguniform(1, 1000),
'gamma': scipy.stats.loguniform(1e-4, 1e-3),
'kernel': ['rbf']},
]
#튜닝
random_cv = RandomizedSearchCV(model, param_grid, n_iter = 10, cv=2, verbose = 2)
random_cv.fit(X_train, y_train)

Sequential Model-Based Optimization

  • 무작위 탐색의 문제점:
    • 하이퍼파라미터의 종류가 많아질 수록 더 많은 탐색이 필요
    • 하이퍼파라미터는 학습 전체가 끝나야 성능을 알 수 있음 (비쌈)
    • 무작위 탐색은 이전의 학습 결과를 활용하지 않음
  • SMBO: 하이퍼파라미터와 성능의 관계를 모형화
    • 모형을 바탕으로 최적의 하이퍼파라미터를 선택하여 학습
    • 학습 결과를 바탕으로 모형을 업데이트하는 과정을 반복
    • 적은 데이터에서 높은 성능을 내는 모형을 사용
    • 기본적으로 어느 정도의 데이터를 요구하므로 다양한 하이퍼파라미터를 선제적으로 시도해야 함 → 효율성이 떨어짐

베이즈 오차 Bayes Error

  • 오차 0%는 다양한 이유로 실현 불가능(예: 테스트 이미지의 레이블이 잘못 붙어 있음. 식별 불가능한 이미지 등)
  • 베이즈 오차: 데이터로부터 도달할 수 있는 이론적으로 최소의 오차
  • 베이즈 오차를 실제로 추정하기는 불가능
  • 보통 사람의 오차를 베이즈 오차 대용으로 사용
  • 예: MNIST의 경우 사람의 오차 0.2% 수준

퀴즈

사용자 정보 입력
퀴즈를 시작하기 전에 이름과 소속을 입력해주세요.

Q&A