はじめに
ネストされた交差検証(Nested cross-validation)は、モデルとそのハイパーパラメータの汎化誤差を推定するために使用される手法です。異なるモデルを選択する場合やハイパーパラメータを最適化する必要がある場合に特に有用です。このチュートリアルでは、アヤメのデータセットを使用して、サポートベクター分類器モデルに対して非ネスト交差検証とネストされた交差検証を比較します。また、2 つの方法の性能の違いを可視化します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてNotebookタブに切り替え、Jupyter Notebook を開いて練習を行ってください。
時には、Jupyter Notebook の読み込みが完了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題が発生した場合は、いつでも Labby に質問してください。セッション終了後にフィードバックを提供していただければ、迅速に問題を解決します。
データセットの読み込み
最初のステップは、scikit-learn からアヤメのデータセットを読み込むことです。
from sklearn.datasets import load_iris
## Load the dataset
iris = load_iris()
X_iris = iris.data
y_iris = iris.target
ハイパーパラメータの定義
次に、サポートベクター分類器の最適化対象となるハイパーパラメータを定義します。この場合、コストパラメータ C とカーネル係数 gamma を最適化します。
## Set up possible values of parameters to optimize over
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}
モデルの定義
ガウシアンカーネル(radial basis function kernel)を持つサポートベクター分類器(Support Vector Classifier)を使用します。
from sklearn.svm import SVC
## We will use a Support Vector Classifier with "rbf" kernel
svm = SVC(kernel="rbf")
非ネスト交差検証(Non-Nested Cross-Validation)
非ネスト交差検証を使用してハイパーパラメータを調整し、モデルの性能を評価します。GridSearchCV 関数は、推定器(estimator)の指定されたパラメータ値に対して網羅的な探索を行います。ここでは 4 分割交差検証を使用します。
from sklearn.model_selection import GridSearchCV
## Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_
ネスト交差検証(Nested Cross-Validation)
ネスト交差検証を使用して、モデルとそのハイパーパラメータの汎化誤差を推定します。内側のループでは、各訓練セットに対してグリッドサーチを行い、最適なハイパーパラメータを見つけます。外側のループでは、テストセット上でモデルの性能を評価します。
from sklearn.model_selection import KFold, cross_val_score
## Number of random trials
NUM_TRIALS = 30
## Arrays to store scores
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)
## Loop for each trial
for i in range(NUM_TRIALS):
## Choose cross-validation techniques for the inner and outer loops,
## independently of the dataset.
inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)
## Nested CV with parameter optimization
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
nested_scores[i] = nested_score.mean()
score_difference = non_nested_score - nested_scores.mean()
結果の可視化
棒グラフを使用して、非ネスト交差検証とネスト交差検証の結果を可視化します。
from matplotlib import pyplot as plt
## Plot bar chart of the difference.
plt.bar(["Non-Nested", "Nested"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("Score")
plt.title("Non-Nested and Nested Cross-Validation Scores")
plt.show()
まとめ
ネスト交差検証(Nested cross-validation)は、モデルとそのハイパーパラメータの汎化誤差を推定する強力な手法です。過学習(overfitting)を防ぎ、モデルが新しいデータに対して良好な性能を発揮することを保証するのに役立ちます。このチュートリアルでは、アヤメのデータセットを使用して、サポートベクター分類器(Support Vector Classifier)モデルに対する非ネスト交差検証とネスト交差検証を比較しました。また、棒グラフを使用して 2 つの方法の性能の違いを可視化しました。