scikit-learn을 사용한 교차 검증 및 하이퍼 파라미터 튜닝

Minseop Jeong·2022년 1월 2일
0

scikit-learn의 model_select 모듈은 데이터 세트 분리, 교차 검증, 하이퍼 파라미터 튜닝과 관련된 함수들과 클래스를 제공한다. 아래와 같이 정리하였다.

Cross Validation

  • Overfitting 으로 인한 실제 prediction시 낮은 성능을 해결하고자 별도의 여러 세트로 구성된 training 데이터셋과 test 데이터셋에서 training & evaluation을 수행하는 것
  • training 데이터셋을 training용과 validation용으로 나누어 evaluation 전에 모델을 평가한다.

KFold

  • 가장 보편적으로 사용되는 cross validation 기법.
  • K개의 데이터 폴드 세트를 만들어 K번만큼 각 셋에 training과 validation을 수행하는 방법.

  • StratifiedKFold: target variable이 편향된 값을 보일 때 사용하는 cross validation 기법

Pipeline

  • pipeline으로 특정 sequence를 수행하도록 정의할 수 있다.
  • 예를 들어 (scaling → trainging) → (scaling → training)→ ... 을 반복할 때, 원본 데이터로 부터 scaling 하도록 작성 해야하는데 이 과정을 자동화 해준다.

GridSearchCV

  • cross validation + hyper parameter tuning을 같이 할 수 있게 지원하는 api
  • pipeline과도 결합이 가능하다.

estimator

estimator object.

This is assumed to implement the scikit-learn estimator interface. Either estimator needs to provide a score function, or scoring must be passed.

param_grid

dict or list of dictionaries

Dictionary with parameters names (str) as keys and lists of parameter settings to try as values, or a list of such dictionaries, in which case the grids spanned by each dictionary in the list are explored. This enables searching over any sequence of parameter settings.

  • param_grid 인자를 list로 넣어주면 list 내의 인자들에 대해서 cv를 수행한다.
  • estimater에 pipeline을 넣고, param_grid에 estimator를 변경하는 값들을 list로 넣어주면 각각의 estimator들에 대해 cv 수행 후, 최고의 성능을 내는 estimator를 get할 수 있다 → AutoML
  • __를 사용하여 estimator의 변수에 접근할 수 있다.
  • 아래에 GridSearchCV를 사용하는 예제를 코드로 정리하였다.
from sklearn.model_selection import KFold, GridSearchCV

pipe = Pipeline([('preprocessing', None), ('regressor', None)])
pre_list = [StandardScaler(), MinMaxScaler(), None]
hyperparam_grid = [
    # classification
    # LogisticRegression
    {'regressor': [LogisticRegression()], 'preprocessing': pre_list,
     'regressor__C': [0.0001, 0.001, 0.01, 0.1, 1, 10]},
    # DecisionTree
    {'regressor': [DecisionTreeClassifier()], 'preprocessing': pre_list,
     'regressor__max_depth': [3, 5, 7, 11], 'regressor__min_samples_split': [2, 3, 5],
     'regressor__min_samples_leaf': [1, 5, 8]},
    # RandomForest
    {'regressor': [RandomForestClassifier()], 'preprocessing': pre_list,
     'regressor__max_depth': [5, 6, 7, 8, 9], 'regressor__min_samples_split': [3, 4, 5],
     'regressor__min_samples_leaf': [1, 2]},
    # Support Vector Classifier
    {'regressor': [SVC()], 'preprocessing': pre_list,
     'regressor__C': [0.1, 1, 3, 5, 10], 'regressor__kernel': ['poly', 'rbf', 'sigmoid'],
     'regressor__gamma': ['scale', 'auto']},
    # Gradient Boosting Classifer
    {'regressor': [GradientBoostingClassifier()], 'preprocessing': pre_list,
     'regressor__learning_rate': [0.001, 0.01, 0.1, 1, 3, 5],
     'regressor__n_estimators': [30, 50, 100, 200]},
    # Gaussian Naive Bayes
    {'regressor': [GaussianNB()], 'preprocessing': pre_list}
        kfold = KFold(n_splits=7, shuffle=True, random_state=1)
]

grid = GridSearchCV(pipe, hyperparam_grid, scoring='accuracy', refit=True, cv=kfold)
grid.fit(train_x, train_y)

estimator = grid.best_estimator_
result_list = estimator.predict(test_x)
profile
Data Engineer

0개의 댓글