sklearn.model_selection.GridSearchCVでカスタム検証セットを使用してモデルを参照

9122 ワード

このリンクは次のとおりです.http://blog.csdn.net/ismarvellous/article/details/78195010
モデルパラメータは玄学である.モデル最適パラメータを得るためには,異なるパラメータを絶えず試みる必要があり,この過程はかなり煩雑である.幸いpythonのsklearnパッケージにはGridSearchCVが提供されており、パラメータ調整プロセスを大幅に便利にしています.この文書では、実際のインスタンスを使用してGridSearchCVの使用を簡単に説明し、カスタム検証セットを使用してモデルパラメータを調整する方法を示します.まず、カスタム検証セットを使用してモデルパラメータを調整する方法について説明します.GridSearchCVのデフォルトで使用されるモデル検証方法はKFoldクロス検証ですが、検証セットが事前に割り当てられている場合が多いので、この検証セットでモデルの良し悪しを評価する必要があります(わがままな場合もあります)、GridSearchCVが自動的に検証セットを生成する必要はありません.これは、カスタム検証セットを使用してモデルパラメータを調整することです.では、まずGridSearchCVの使用を簡単に認識してみましょう.
1.問題の背景
次に、配列train_features、ラベルtrain_labelsを特徴とするトレーニングセットがあると仮定します.配列test_featuresでラベルがないテストセットもあります.トレーニングセットで線形SVMを学び、テストセットラベルを予測したいです.SVMにはいくつかのスーパーパラメータが人工的に設定される必要があることを知っています.線形SVMでは、最も重要なのはパラメータCを罰することです.どのようにして最適なCを見つけますか?通常、KFoldクロス検証を使用します.簡単にご紹介します.
2.GridSearchCV使用概要
直接コード:
import numpy as np
from sklearn.grid_search import GridSearchCV
from sklearn.svm import LinearSVC
from sklearn.externals import joblib

train_features = np.load('train_features.npy')
train_labels = np.load('train_labels.npy')
test_features = np.load('test_features.npy')

clf = LinearSVC(random_state=0)
params_search = {'C':[1,10,100,1000]}               #          
grid_search_params = {'estimator': clf,             #      
                      'param_grid': params_search,  #               
                      'cv': 3,                      #     split  
                      'n_jobs': -1,                 #         ,-1      CPU
                      'verbose': 32}                #     ,          
grsearch = GridSearchCV(**grid_search_params)
grsearch.fit(train_features, train_labels)
joblib.dump(grsearch, 'grsearch.model')

bst = grsearch.best_estimator_
preds = bst.predict(test_features)

上記のコードでは,3−foldクロス検証ポリシーを用いてCの最適値を探す必要があり,各検証セットは全訓練セットからランダムに生成される.
3.カスタム検証セットの使用
訓練セットと検証セットの区分方式をいくつかの方法で定義したと仮定します.それぞれtrain_featuresval_featuresです.ランダムな区分は使いたくありません.この場合どうすればいいですか.PredefinedSplitを使用できます.
import numpy as np
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import PredefinedSplit
from sklearn.svm import LinearSVC
from sklearn.externals import joblib

train_features = np.load('train_features.npy')
train_labels = np.load('train_labels.npy')
val_features = np.load('val_features.npy')
val_labels = np.load('val_labels.npy')
test_features = np.load('test_features.npy')

#          
train_val_features = np.concatenate((train_features,val_features ),axis=0)
train_val_labels = np.concatenate((train_labels,val_labels ),axis=0)

clf = LinearSVC(random_state=0)
test_fold = np.zeros(train_val_features.shape[0])   #    index    0,0         
test_fold[:train_features.shape[0]] = -1            #        index  -1,            
ps = PredefinedSplit(test_fold=test_fold)
params_search = {'C':[1,10,100,1000]}
grid_search_params = {'estimator': clf,             #      
                      'param_grid': params_search,  #               
                      'cv': ps,                     #         split    
                      'n_jobs': -1,                 #         ,-1      CPU
                      'verbose': 32}                #     ,          
print train_features.shape
print train_labels.shape
grsearch = GridSearchCV(**grid_search_params)
grsearch.fit(train_test_features, train_test_labels)

joblib.dump(grsearch, model_save_path)
bst = grsearch.best_estimator_
preds = bst.predict(test_features)

ここでtest_foldは、データセットを分割するためのインデックスリストである.上記で使用した固定検証セットに加えて、多重検証セットを分割することもできます.データセットに4つのサンプルが追加されると、test_fold = [0, 1, -1, 1]は、1番目の検証セットにインデックス値が0のサンプルが含まれ、2番目の検証セットにインデックス値が1のサンプルが含まれていることを示し、このようにしてカスタム多重検証セットを確立する.この区分方法を示すコードがあります.
>>> from sklearn.cross_validation import PredefinedSplit
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> ps = PredefinedSplit(test_fold=[0, 1, -1, 1])
>>> len(ps)
2
>>> print(ps)       
sklearn.cross_validation.PredefinedSplit(test_fold=[ 0  1 -1  1])
>>> for train_index, test_index in ps:
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
TRAIN: [1 2 3] TEST: [0]
TRAIN: [0 2] TEST: [1 3]

関連リンク
  • http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV
  • http://scikit-learn.org/stable/modules/generated/sklearn.grid_search.GridSearchCV.html
  • http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.PredefinedSplit.html
  • https://stackoverflow.com/questions/31948879/using-explict-predefined-validation-set-for-grid-search-with-sklearn