Hyper Parameter Tuning

모형 최적화

머신러닝 예측 모형을 완성한 후에는 최적화 과정을 통해 성능을 향상시킨다. 이 과정을 하이퍼 파라미터 튜닝(hyper parameter tuning)이라고 한다.

scikit-learn패키지에서 제공하는 하이퍼파라미터 튜닝 도구들은 다음과 같다.

  • validation curve
    • 단일 하이퍼 파라미터 최적화
  • GridSearchCV
    • 그리드를 사용한 복수 하이퍼 파라미터 최적화
  • ParameterGrid
    • 복수 파라미터 최적화용 그리드

validadtion_curve

validation_curve 함수는 최적화할 파라미터의 이름과 범위, 성능평가기준을 param_name,param_range,scoring 인수로 받아, 지정해준 범위의 모든 경우에 대해 설정한 성능평가기준에 따라 성능을 계산한다.

1
2
3
4
5
6
7
8
from sklearn.datasets import load_digits
from sklearn.svm import SVC
from sklearn.model_selection import validation_curve

digits = load_digits()
X, y = digits.data, digits.target

param_range = np.logspace(-6, -1, 10)
1
2
3
train_scores, test_scores = validation_curve(SVC(), X, y, 
param_name="gamma", param_range=param_range,
cv=10, scoring="accuracy", n_jobs=1)

설정한 범위 내에서 감마값이 커질수록 오버피팅이 돼서 trainingscore가 올라간다. 그러나 감마가 일정 값 이상으로 커지게 되면 아래 그래프에서 볼 수 있듯이 trainingscore가 더이상 올라가지 않고 머무른다. cross-validation 점수는 어느 순간 아예 감소하는 현상을 보인다.

GridSearchCV

GridSearchCV 클래스는 파라미터, 성능평가기준 등을 지정해준 객체를 만들어 사용한다. 생성한 클래스 객체에 fit 메서드를 호출하면 grid search를 사용하여 자동으로 모형들을 만들고 실행해 최적 파라미터를 찾아준다. 모형들과 실행결과는 다음 속성에 저장된다.

  • grid_scores_

    • param_grid로 설정해준 모든 파라미터 조합에 대한 성능 결과.
  • best_score_

    • 설정한 성능평가기준의 최고 점수
  • best_params_

    • 최고 점수를 낸 파라미터 조합
  • best_estimator_

    • 최고점수를 낸 파라미터를 가진 모형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

pipe_svc = Pipeline([('scl', StandardScaler()), ('clf', SVC(random_state=1))]) #pipeline 안에도 scl, clf의 두 파라미터가 있다

param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]
# 8개
param_grid = [
{'clf__C': param_range, 'clf__kernel': ['linear']},
{'clf__C': param_range, 'clf__gamma': param_range, 'clf__kernel': ['rbf']}]
# 파라미터를 이런식으로 집어넣어준다. linear일 때 8개, rbf일 때 8개 총 64회 + 8

gs = GridSearchCV(estimator=pipe_svc, param_grid=param_grid, scoring='accuracy', cv=10, n_jobs=1) #총 72회 * 10번
gs = gs.fit(X, y)

최고 점수와 최적 파라미터 값을 출력하면 위와 같지만, 이 값들을 너무 믿으면 안 된다. 과최적화되었을 수도 있기 때문에 직접 플롯을 그려서 피팅이 잘 됐는지 확인해봐야 한다.

ParameterGrid

ParameterGridGridSearchCV 에서 param_grid 라는 인수로 사용되었던 것이다. 그리드서치 방법을 사용할 수 없을 때 직접 그리드를 생성하는 iterator역할을 한다.

1
2
3
from sklearn.model_selection import ParameterGrid
param_grid = [{'kernel': ['linear']}, {'kernel': ['rbf'], 'gamma': [1, 10]}]
list(ParameterGrid(param_grid))

병렬처리 / 분산처리

1) 병렬처리

병렬처리는 어떤 명령을 수행할 때 프로세스를 단일로 사용하지 않고 여러 개 사용해서 처리 속도를 빠르게 하는 것이다. scikit-learn에서는 분산처리는 지원하지 않지만 병렬처리는 지원한다. 이 병렬처리를 수행할지 여부를 결정하는 인수가 GridSearchCVn_jobs 라는 인수다. 디폴트 값은 1이고, 최대로는 내가 사용하는 CPU코어의 수만큼 늘려주면 그리드서치 속도가 빨라진다.

2) 분산처리

분산처리는 병렬처리를 여러 동일한 환경들에 분산해서 계산량이 많은 것들을 처리하는 방법이다. 분산처리를 해주는 도구들이 따로 있는데, aws나 구글클라우드 등 서버를 통해 할 수 있다..

Share