サーチ…


相互検証

予測関数のパラメータを学習して同じデータでテストするのは方法論的な誤りです。今見たサンプルのラベルを完全なスコアで繰り返しますが、見えないデータ。この状況をオーバーフィットといいます 。それを避けるために、利用可能なデータの一部をテストセット X_test, y_testとして保持する(監視された)機械学習実験を実行するのが一般的X_test, y_test 。 「実験」という言葉は、商業的な設定でさえ、機械学習が通常実験的に始まるため、学術的な使用のみを意味するものではないことに注意してください。

scikit-learnでは、 training_test_splitヘルパー関数を使用して、トレーニングセットとテストセットのランダムな分割を迅速に計算できます。虹彩データセットを線形サポートベクトルマシンに合わせてロードしましょう:

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

分類子をテスト(評価)するためにデータの40%を保持しながら、すぐにトレーニングセットをサンプリングすることができます。

>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

さて、私たちが訓練とテストセットを持っていれば、それを使うことができます:

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)   

K-Foldクロス検証

K倍クロスバリデーションは、列車/テストスプリットの単一の試行に関連する分散を低減するために、列車/テストスプリット手順を複数回繰り返すための体系的なプロセスです。基本的には、データセット全体をKの等しいサイズの「折り畳み」に分割し、各折り畳みはモデルをテストするために1回、モデルをトレーニングするためにK-1回使用されます。

Scikitライブラリでは複数の折りたたみ手法が利用できます。それらの使用法は、入力データ特性に依存します。いくつかの例があります

Kフォールド

基本的には、データセット全体をKの等しいサイズの「折り畳み」に分割し、各折り畳みはモデルをテストするために1回、モデルをトレーニングするためにK-1回使用されます。

from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = KFold(n_splits=3, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1 3] TEST: [2]
TRAIN: [0 1 2] TEST: [3]

StratifiedKFoldは、層別折り畳みを返すk倍のバリエーションです。各セットは、完全なセットと各ターゲットクラスのサンプルのほぼ同じパーセンテージを含みます

シャッフルスプリット

独立列車/試験データセット分割のユーザ定義数を生成するために使用されます。サンプルを最初にシャッフルしてから、トレインとテストセットのペアに分割します。

from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [3 1 0] TEST: [2]
TRAIN: [2 1 3] TEST: [0]
TRAIN: [0 2 1] TEST: [3]

StratifiedShuffleSplitはShuffleSplitのバリエーションです。階層化された分割を返します。つまり、完全なセットと同じターゲットクラスごとに同じパーセンテージを保持することで分割を作成します。

Leave One / p Out、TimeSeriesSplit(K倍のバリエーション)などの他の折りたたみ手法は、scikit model_selectionライブラリで利用できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow