データセットを分割するための適切な戦略は何ですか?
私は、次のアプローチにフィードバックを求める(ないような個々のパラメータのtest_size
かn_iter
、私が使用している場合X
、y
、X_train
、y_train
、X_test
、およびy_test
適切かつシーケンスは理にかなっている場合):
(scikit-learnドキュメントからこの例を拡張)
1.データセットをロードする
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2.トレーニングとテストセットに分割(例:80/20)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3.推定量を選択
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4.相互検証イテレーターを選択します
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5.ハイパーパラメーターの調整
トレーニングセットで相互検証イテレータを適用する
from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)
6.学習曲線を使用したアルゴリズムのデバッグ
X_train
トレーニングとテストセットに10回ランダムに分割されn_iter=10
ます()。トレーニングスコア曲線の各ポイントは、モデルが最初のi個のトレーニング例でトレーニングおよび評価された10個のスコアの平均です。交差検定スコア曲線の各ポイントは、モデルが最初のi個のトレーニング例でトレーニングされ、テストセットのすべての例で評価された10個のスコアの平均です。
from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()
plot_learning_curve()は、scikit-learnの現在の開発バージョン(0.15-git)にあります。
7.テストセットの最終評価
classifier.score(X_test, y_test)
7a。ネストされた交差検証を使用したモデル選択での過剰適合のテスト(データセット全体を使用)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
追加の質問: 手順7を入れ子にした相互検証で置き換えることは理にかなっていますか?または、ネストされたcvは手順7を補完するものと見なされるべきです
(コードはscikit-learnのk-fold cross validationで機能するようですが、shuffle&splitでは機能cv
しないようです。コードを機能させるには上記を変更する必要があります)
8.データセット全体で最終モデルをトレーニングする
classifier.fit(X, y)
編集:私は今、ステップ7aはこのシーケンスではあまり意味をなさないというcbeleitesに同意します。だから私はそれを採用しません。