はじめに
機械学習において、我々はしばしばスコアを用いて分類モデルの性能を評価します。しかしながら、我々はまた、モデルの性能が単に偶然によるものでないことを確認するために、スコアの有意性をテストする必要があります。ここで、順列検定スコアが役に立ちます。これは、データセットの 1000 個の異なる順列に対する分類器の精度を計算することによって、空分布を生成します。その後、経験的な p 値は、得られたスコアが元のデータを使用して得られたスコアよりも大きい順列の割合として計算されます。この実験では、sklearn.model_selection からの permutation_test_score 関数を使用して、順列を用いた交差検証スコアの有意性を評価します。
VM のヒント
VM の起動が完了した後、左上隅をクリックして ノートブック タブに切り替えて、Jupyter Notebook にアクセスして練習します。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。そうすれば、迅速に問題を解決します。
データセットを読み込み、ランダムな特徴量を生成する
我々は、3 種類のアヤメから測定されたデータからなるアヤメデータセットを使用し、アヤメデータセットのクラスラベルと相関のないいくつかのランダムな特徴量データ(すなわち、20 個の特徴量)を生成します。
from sklearn.datasets import load_iris
import numpy as np
iris = load_iris()
X = iris.data
y = iris.target
n_uncorrelated_features = 20
rng = np.random.RandomState(seed=0)
X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))
元のデータに対する順列検定スコア
次に、元のアヤメデータセットと accuracy スコアを持つ SVC 分類器を使用して、permutation_test_score を計算して、各ラウンドでモデルを評価します。
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import permutation_test_score
clf = SVC(kernel="linear", random_state=7)
cv = StratifiedKFold(2, shuffle=True, random_state=0)
score_iris, perm_scores_iris, pvalue_iris = permutation_test_score(
clf, X, y, scoring="accuracy", cv=cv, n_permutations=1000
)
ランダムデータに対する順列検定スコア
次に、ランダムに生成された特徴量とアヤメのラベルを使用して permutation_test_score を計算します。これらの特徴量とラベルの間には依存関係がないはずです。
score_rand, perm_scores_rand, pvalue_rand = permutation_test_score(
clf, X_rand, y, scoring="accuracy", cv=cv, n_permutations=1000
)
結果をプロットする
元のアヤメデータセットとランダマイズされたデータの両方について、順列スコア(空分布)のヒストグラムをプロットします。また、赤色の線を使って、元のデータで分類器が得たスコアを示します。各グラフには p 値が表示されます。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
## 元のデータ
ax.hist(perm_scores_iris, bins=20, density=True)
ax.axvline(score_iris, ls="--", color="r")
score_label = f"Score on original\ndata: {score_iris:.2f}\n(p-value: {pvalue_iris:.3f})"
ax.text(0.7, 10, score_label, fontsize=12)
ax.set_xlabel("Accuracy score")
_ = ax.set_ylabel("Probability density")
plt.show()
fig, ax = plt.subplots()
## ランダムデータ
ax.hist(perm_scores_rand, bins=20, density=True)
ax.set_xlim(0.13)
ax.axvline(score_rand, ls="--", color="r")
score_label = f"Score on original\ndata: {score_rand:.2f}\n(p-value: {pvalue_rand:.3f})"
ax.text(0.14, 7.5, score_label, fontsize=12)
ax.set_xlabel("Accuracy score")
ax.set_ylabel("Probability density")
plt.show()
まとめ
この実験では、sklearn.model_selection からの permutation_test_score 関数を使用して、順列を用いた交差検証スコアの有意性を評価する方法を学びました。データセットの 1000 個の異なる順列に対する分類器の精度を計算することで空分布を生成し、得られたスコアが元のデータを使用して得られたスコアよりも大きい順列の割合として経験的な p 値を計算しました。また、結果をプロットして、空分布と元のデータで得られたスコアを視覚化しました。