クロス検証の原理と使い方


引用する


機械学習では,クロス検証(cross validation)はモデル選択のための方法である.与えられたサンプルデータが十分である場合、データセットをランダムに訓練セット、検証セット、およびテストセットに分割することができ、訓練セットはモデルを訓練するために使用され、検証セットはモデルの選択に使用され、テストセットは最終的に方法を評価するために使用される.しかし、実際の状況ではデータが不十分であることが多く、モデルをよりよく選択するために、クロス検証の方法を使用することができる.

げんり


具体的には、機械学習のモデリング作業を開始すると、まずデータセットをトレーニングセットとテストセットに分割し、トレーニングセットでモデルのトレーニングとパラメータのチューニングを行い、最終的にテストセットでモデルの効果を検証します.最適なモデルとパラメータを選択できるように,通常,訓練セットで検証セットとして一部を切り出し,検証セットでのモデルの効果を観察することによってその良し悪しを評価する.しかし、トレーニングセットの数があまり多くない場合、異なる検証セットの選択方法がモデルの効果に大きな影響を及ぼす可能性があります.したがって、クロス検証方式を採用することができます.最もよく用いられるのはK-fold交差検証法であり,我々はランダムに訓練セットをK部に分け,訓練のたびにその中の1部を検証セットとし,残りを訓練セットとし,K回の実験におけるモデルの各指標の平均値を観察することにより,検証セットの選択方式の影響を受けることなくモデルの効果を比較的正確に理解することができる.異なるモデルパラメータを設定し,それらの平均効果を逐一観察することができ,最終的には最適なパラメータのセットを選択してテストセットに適用することができる.

テストセットの選択


前に,パラメータ選択のためにクロス検証を用いることについて述べたが,実際にはテストセットとトレーニングセットの分割に対してクロス検証の方法を適用することもできる.データセット全体が小さい場合、適切なテストセットをどのように選択するかも問題です.ランダムに分割する場合、比較的予測しやすいデータポイントをテストセットとして選択することができます.これにより、モデルの最終的な効果はよく見えますが、これは実際の状況ではありません.このような試験セットの選択方式によるモデル効果の変動の問題を回避するために,交差検証方式を用いて,複数の試験セットにおけるモデルの平均効果を観察することによってモデルの効果を全体的に評価することもできる.

正負サンプル比


もう1つの注目すべき問題は,二分類問題では,データセットの正負サンプル比が低い場合,モデルの訓練に挑戦するが,実際の状況は往々にしてそうである.この場合、通常、トレーニングセットとテストセットの正負のサンプル比が全体の割合と一致し、アンバランスデータセットによる影響を低減できることを望んでいるので、テストセットを階層的に分割します.具体的には,25%のデータをテストセットとして分割することを望むと仮定すると,25%の正例と25%の負例をそれぞれランダムにテストセットとして選択し,残りをトレーニングセットとして選択する.このような階層サンプリングの方式は実際には非常に必要である.
幸いなことに、Scikit-Liarnでは、StratifiedKFoldが直接私たちを助けることができます.

定義#テイギ#

class sklearn.model_selection.StratifiedKFold(n_splits=3, shuffle=False, random_state=None)

パラメータ

n_splits : int, default=3

Number of folds. Must be at least 2.

shuffle : boolean, optional

Whether to shuffle each stratification of the data before splitting into batches.

random_state : int, RandomState instance or None, optional, default=None

If int, random_state is the seed used by the random number generator; If RandomState instance, random_state is the random number generator; If None, the random number generator is the RandomState instance used by np.random. Used when shuffle == True.

≪インスタンス|Instance|emdw≫

>>> from sklearn.model_selection import StratifiedKFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> skf = StratifiedKFold(n_splits=2)
>>> skf.get_n_splits(X, y)
2
>>> print(skf)  
StratifiedKFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in skf.split(X, y):
...    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 3] TEST: [0 2]
TRAIN: [0 2] TEST: [1 3]

リファレンス


『統計学習方法』李航sklearn.model_selection.StratifiedKFold
以上が本文のすべての内容で、もしあなたがこの文章が好きならば、それを友达に分かち合うことを歓迎します.
全文は作者のオリジナルで、学習の参考に供するだけで、転載の授権は私信に連絡してください.そうしないと権利侵害行為と見なされます.コードワードは容易ではありません.サポートに感謝します.
読書に感謝します.楽しい生活をしてください.
作者:小美哥2018-06-23