Modelの選び方 - k分割交差検証(k-fold Cross Validation by Validation Curve)とグリッドサーチ(Grid Search)
どのようにModelを選ぶか
- Validation Curveを使って仮定した選んだModelに対して、サンプルのとり方の影響を排除した評価値をだす
- よさげなModelについてGrid Searchにより最適なparemeterを導出
- 最適なparameterでもう一回Validation Curveを使ってModel間の評価をする
Validation Curveを使う
下記で取り上げたようにValidation Curveを使うことで、サンプルのとり方による影響を排除したModelの評価値(Accuracy, Precision等)を導出できる。ホールドアウト法(train_test_split)と比べて小さいデータの時に有効
singapp.hatenablog.com
Structure
sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs', error_score=nan)
from sklearn.model_selection import validation_curve
主なParameters
Parameters | Description |
scoring | 評価値を選択 accuracy, roc_aucとか sklearn.metricsの関数を選択できる |
cv | データセットの分割個数 |
Usage
- Model のオブジェクトを作成(SampleではDecisionTree)
- Grcross_val_scoreオブジェクトを作成し、Modelを学習データとともに渡す
- 各思考のscoreを取得
- 「平均+/-標準偏差」をこのModelの評価値として用いる
Sample
from sklearn.datasets import load_breast_cancer from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score cancer = load_breast_cancer() cn_data = pd.DataFrame(cancer.data, columns=cancer.feature_names) cn_target= pd.Series(cancer.target) tree = DecisionTreeClassifier(criterion='gini', max_depth=5, random_state=0) scores = cross_val_score(tree, cn_data, cn_target, cv=5) print('Cross Validation Scores: {}'.format(scores)) print('Cross Validation Mean: {:.3f}'.format(scores.mean())) print('Cross Validation Standard Deviation: {:.3f}'.format(scores.std())) print('Cross Validation Score Range: {:.3f}+/-{:.3f}'.format(scores.mean(), scores.std()))
Furthermore
scoringに複数の指標を同時に使いたいときはcross_val_scoreのかわりにcross_validateを使う
from sklearn.model_selection import cross_validate
選択可能なscoring parameter一覧はこちら
Grid Search
指定したモデルの最適パラメータをいろんな評価値で計算する。
Structure
sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, iid='deprecated', refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score=nan, return_train_score=False)
from sklearn.model_selection import GridSearchCV
主なParameters
Parameters | Description |
estimator | 評価するモデル SVCとか |
param_grid | 探索するパラメータ |
scoring | 評価値を選択 accuracy, roc_aucとか |
cv | 試行回数 |
Usage
- GridSearchCVオブジェクトを作成
- GridSearchCV.fit()に学習データを渡す
- 最もよいパラメータを取得 best_estimator_
Sample
from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV from sklearn.metrics import roc_auc_score from sklearn.datasets import load_digits dataset = load_digits() X, y = dataset.data, dataset.target == 1 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) clf = SVC(kernel='rbf') grid_values = {'gamma': [0.001, 0.01, 0.05, 0.1, 1, 10, 100]} # default metric to optimize over grid parameters: accuracy grid_clf_acc = GridSearchCV(clf, param_grid = grid_values) grid_clf_acc.fit(X_train, y_train) y_decision_fn_scores_acc = grid_clf_acc.decision_function(X_test) print('Grid best parameter (max. accuracy): ', grid_clf_acc.best_params_) print('Grid best score (accuracy): ', grid_clf_acc.best_score_) # alternative metric to optimize over grid parameters: AUC grid_clf_auc = GridSearchCV(clf, param_grid = grid_values, scoring = 'roc_auc') grid_clf_auc.fit(X_train, y_train) y_decision_fn_scores_auc = grid_clf_auc.decision_function(X_test) print('Test set AUC: ', roc_auc_score(y_test, y_decision_fn_scores_auc)) print('Grid best parameter (max. AUC): ', grid_clf_auc.best_params_) print('Grid best score (AUC): ', grid_clf_auc.best_score_)