web-dev-qa-db-ja.com

sklearnを使用したグリッド検索のための明示的な(事前定義された)検証セットの使用

私は以前に3つのセットに分割されたデータセットを持っています:トレーニング、検証、テスト。これらのセットは、異なるアルゴリズム間でパフォーマンスを比較するために、指定されたとおりに使用する必要があります。

次に、検証セットを使用してSVMのパラメーターを最適化したいと思います。しかし、検証セットをsklearn.grid_search.GridSearchCV()に明示的に入力する方法が見つかりません。以下は、トレーニングセットでK分割交差検証を行うために以前使用したコードの一部です。ただし、この問題については、指定された検証セットを使用する必要があります。どうやってやるの?

from sklearn import svm, cross_validation
from sklearn.grid_search import GridSearchCV

# (some code left out to simplify things)

skf = cross_validation.StratifiedKFold(y_train, n_folds=5, shuffle = True)
clf = GridSearchCV(svm.SVC(tol=0.005, cache_size=6000,
                             class_weight=penalty_weights),
                     param_grid=tuned_parameters,
                     n_jobs=2,
                     pre_dispatch="n_jobs",
                     cv=skf,
                     scoring=scorer)
clf.fit(X_train, y_train)
30
pir

PredefinedSplit を使用します

ps = PredefinedSplit(test_fold=your_test_fold)

次に、GridSearchCVcv=psを設定します

test_fold:「配列のような形(n_samples、)

test_fold [i]は、サンプルiのテストセットのフォールドを提供します。値-1は、対応するサンプルがテストセットのフォールドの一部ではなく、常にトレーニングフォールドに配置されることを示します。

こちらもご覧ください

検証セットを使用する場合は、検証セットの一部であるすべてのサンプルについてtest_foldを0に設定し、他のすべてのサンプルについて-1に設定します。

29
yangjie

hypopt Pythonパッケージ(pip install hypopt)私は著者です。これは、検証セットを使用してパラメーターを最適化するために特別に作成されたプロフェッショナルパッケージです。すぐに使用できるscikit-learnモデルで動作し、Tensorflow、PyTorch、Caffe2などでも使用できます。

# Code from https://github.com/cgnorthcutt/hypopt
# Assuming you already have train, test, val sets and a model.
from hypopt import GridSearch
param_grid = [
  {'C': [1, 10, 100], 'kernel': ['linear']},
  {'C': [1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
 ]
# Grid-search all parameter combinations using a validation set.
opt = GridSearch(model = SVR(), param_grid = param_grid)
opt.fit(X_train, y_train, X_val, y_val)
print('Test Score for Optimized Parameters:', opt.score(X_test, y_test))

編集:私が書いたパッケージを提案しているので、私(私は私が思う)がこの応答で-1を受け取りました。パッケージがこの種の問題を解決するために特別に作成されたので、これは残念です。

8
cgnorthcutt
# Import Libraries
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.model_selection import PredefinedSplit

# Split Data to Train and Validation
X_train, X_val, y_train, y_val = train_test_split(X, y, train_size = 0.8, stratify = y,random_state = 2020)

# Create a list where train data indices are -1 and validation data indices are 0
split_index = [-1 if x in X_train.index else 0 for x in X.index]

# Use the list to create PredefinedSplit
pds = PredefinedSplit(test_fold = split_index)

# Use PredefinedSplit in GridSearchCV
clf = GridSearchCV(estimator = estimator,
                   cv=pds,
                   param_grid=param_grid)

# Fit with all data
clf.fit(X, y)