クロスバリデーション
モデルを調整するとき、目に見えないデータに対する全体的なモデルのパフォーマンスを向上させることを目指しています。ハイパーパラメーターの調整により、テストセットのパフォーマンスが大幅に向上する可能性があります。ただし、テスト セットのパラメーターを最適化すると、情報漏えいが発生し、目に見えないデータに対するモデルのパフォーマンスが低下する可能性があります。これを修正するために、相互検証を実行できます。
CVをよりよく理解するために、虹彩データセットに対してさまざまな方法を実行します。最初にデータをロードして分離しましょう。
from sklearn import datasetsX, y = datasets.load_iris(return_X_y=True)
クロスバリデーションには多くの方法がありますが、k分割交差検証から始めます。
*K*-Fold
モデルで使用されるトレーニングデータは、モデルの検証に使用されるk個の小さなセットに分割されます。次に、モデルはトレーニングセットのk-1フォールドでトレーニングされます。残りのフォールドは、モデルを評価するための検証セットとして使用されます。
さまざまな種類のアヤメの花を分類しようとするため、DecisionTreeClassifier
(分類子モデル)をインポートする必要があります。また、sklearn
からCVモジュールをインポートする必要もあります。
from sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import KFold, cross_val_score
データがロードされたので、評価用のモデルを作成して適合させることができます。
clf = DecisionTreeClassifier(random_state=42)
それでは、モデルを評価して、それぞれの*k*-foldでどのように機能するかを見てみましょう。
k_folds = KFold(n_splits = 5)scores = cross_val_score(clf, X, y, cv = k_folds)
また、すべてのフォールドのスコアを平均して、CVが全体的にどのように機能したかを確認することもお勧めします。
例
k-foldのCVを実行します。
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFold, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
k_folds = KFold(n_splits = 5)
scores = cross_val_score(clf, X, y, cv = k_folds)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
実行例 »
広告
階層化されたK-Fold
クラスが不均衡な場合、訓練セットと検証セットの両方で不均衡を説明する方法が必要です。そうするために、ターゲットクラスを階層化できます。つまり、両方のセットがすべてのクラスの割合が等しくなります。
例
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
sk_folds = StratifiedKFold(n_splits = 5)
scores = cross_val_score(clf, X, y, cv = sk_folds)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
実行例 »
階層化されたクラスがあることを確認すると、フォールドの数は同じですが、平均CVは基本的なk-Foldから増加します。
リーブワンアウト(LOO)
k-fold LeaveOneOutのようにトレーニングデータセットの分割数を選択する代わりに、1つの観測を使用して検証し、n-1の観測をトレーニングに使用します。この方法は完全な技法です。
例
LOO CVを実行します。:
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import LeaveOneOut, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
loo = LeaveOneOut()
scores = cross_val_score(clf, X, y, cv = loo)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
実行例 »
実行された交差検証スコアの数は、データセット内の観測数と同じであることがわかります。この場合、アイリスデータセットには150の観測値があります。
平均CVスコアは94%です。
Leave-P-Out(LPO)
Leave-P-Outは、検証セットで使用するpの数を選択できるという点で、Leave-One-Outアイデアとの微妙な違いです。
例
LPO CVを実行します。
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import LeavePOut, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
lpo = LeavePOut(p=2)
scores = cross_val_score(clf, X, y, cv = lpo)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
実行例 »
これが網羅的な方法であることがわかるように、p=2の場合でも、Leave-One-Outよりもはるかに多くのスコアが計算されますが、ほぼ同じ平均CVスコアが達成されます。
シャッフルスプリット
KFold
とは異なり、ShuffleSplit
ではデータの一部が除外されトレーニングまたは検証セットで使用されません。そのためには、トレーニングとテストのサイズ、分割数を決定する必要があります。
例
ShuffleSplit CVを実行します。
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import ShuffleSplit, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
ss = ShuffleSplit(train_size=0.6, test_size=0.3, n_splits = 5)
scores = cross_val_score(clf, X, y, cv = ss)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
実行例 »
終わりに
これらは、モデルに適用できるCVメソッドのほんの一部です。多くの相互検証クラスがあり、ほとんどのモデルには独自のクラスがあります。より多くのCVオプションについては、sklearnsの相互検証を確認してください。