PyInv

プログラミングのメモ、海外投資のメモ

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
  1. Model のオブジェクトを作成(SampleではDecisionTree)
  2. Grcross_val_scoreオブジェクトを作成し、Modelを学習データとともに渡す
  3. 各思考のscoreを取得
  4. 「平均+/-標準偏差」をこの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()))


f:id:singapp:20200918131427p:plain

Furthermore

scoringに複数の指標を同時に使いたいときはcross_val_scoreのかわりにcross_validateを使う

from sklearn.model_selection import cross_validate


選択可能なscoring parameter一覧はこちら


指定したモデルの最適パラメータをいろんな評価値で計算する。

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
  1. GridSearchCVオブジェクトを作成
  2. GridSearchCV.fit()に学習データを渡す
  3. 最もよいパラメータを取得 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_)



f:id:singapp:20200918131606p:plain