#!/usr/bin/env python3
asymmetric parameter with grid search
이전 포스팅 참조하기
예를들어 SVC는 kernel parameter를 가지고 있는데 어떤 kernel을 사용하는지에 따라 관련있는 parameter들이 결정됩니다.
kernel='linear'이면 C parameter만 사용하고
kernel='rbf'이면 C와 gamma를 모두 사용합니다.
이런 경우에 kernel, C, gamma parameter의 모든 조합을 조사하는 것은 낭비입니다.
1. apply asymmetric parameter
이런 조건부 parameter조합을 적용하려면 GridSearchCV에 전달한 param_grid를 딕셔너리의 리스트로 만들기만 하면 됩니다.
# load library
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, KFold, GridSearchCV
from sklearn.svm import SVC
# datasets
cancer = load_breast_cancer()
# data paritition
x_train, x_test, y_train, y_test =\
train_test_split(cancer.data, cancer.target,
random_state=0, test_size=0.3, stratify=cancer.target)
# create class
svc = SVC()
kfold = KFold(n_splits=5, shuffle=True, random_state=0)
values = [0.001, 0.01, 0.1, 1, 10, 100]
param_grid = [{'kernel':['rbf'], 'C':values, 'gamma':values},
{'kernel':['linear'], 'C':values}]
grid_search = GridSearchCV(svc, param_grid, cv=kfold)
grid_search.fit(x_train, y_train)
# results
print('optimal parameter ==> {}'.format(grid_search.best_params_))
print('optimal parameter의 점수 ==> {:.3f}'.format(grid_search.best_score_))
print('optimal parameter로 일반화 점수 ==> {:.3f}'.format(grid_search.score(x_test, y_test)))
# optimal parameter ==> {'C': 100, 'kernel': 'linear'}
# optimal parameter의 점수 ==> 0.970
# optimal parameter로 일반화 점수 ==> 0.924
2. cv_results_ 결과 살펴보기
다음으로 cv_results_ 속성을 살펴보기 위해 pandas의 DataFrame으로 csv를 만든 후 일부만 보겠습니다.
# library import
import pandas as pd
results = pd.DataFrame(grid_search.cv_results_)
# write csv
results.T.to_csv('grid_search.cv_results_.csv')
cv_results_의 일부
>> kernel이 'linear'일 때는 'C'값만 변한 것을 확인할 수 있습니다.
참고 자료:
[1]Introduction to Machine Learning with Python, Sarah Guido
'모델 평가와 성능 향상 > 그리드 서치' 카테고리의 다른 글
nested cross-validation (1) | 2018.04.05 |
---|---|
cross-validation result analysis (2) | 2018.04.05 |
parameter overfitting (0) | 2018.04.04 |
simple grid search (1) | 2018.04.03 |