確率推定による繰り返し10倍相互検証の平均ROC


15

機械学習アルゴリズムを使用して、約10,000件のケースで繰り返し(10回)成層10倍クロス検証を使用する予定です。繰り返しは、異なるランダムシードで行われます。

このプロセスでは、各ケースの確率推定値のインスタンスを10個作成します。10倍交差検証の10回の繰り返しごとの確率推定の1つのインスタンス

各ケースで平均10個の確率を平均し、新しい平均ROC曲線(反復10倍CVの結果を表す)を作成して、ペア比較により他のROC曲線と比較できますか?

回答:


13

あなたの説明から、それは完全に理にかなっているようです。平均ROC曲線を計算するだけでなく、信頼区間を構築するためにその周りの分散も計算できます。それはあなたのモデルがどれほど安定しているかのアイデアを与えるはずです。

たとえば、次のように:

ここに画像の説明を入力してください

ここでは、個々のROC曲線、平均曲線、信頼区間を配置します。曲線が一致する領域があるため、分散が少なくなり、曲線が一致しない領域があります。

繰り返されるCVの場合、複数回繰り返すだけで、個々のすべてのフォールドの合計平均を取得できます。

ここに画像の説明を入力してください

前の図と非常に似ていますが、平均と分散のより安定した(つまり信頼できる)推定値を提供します。

プロットを取得するコードは次のとおりです。

import matplotlib.pyplot as plt
import numpy as np
from scipy import interp

from sklearn.datasets import make_classification
from sklearn.cross_validation import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve

X, y = make_classification(n_samples=500, random_state=100, flip_y=0.3)

kf = KFold(n=len(y), n_folds=10)

tprs = []
base_fpr = np.linspace(0, 1, 101)

plt.figure(figsize=(5, 5))

for i, (train, test) in enumerate(kf):
    model = LogisticRegression().fit(X[train], y[train])
    y_score = model.predict_proba(X[test])
    fpr, tpr, _ = roc_curve(y[test], y_score[:, 1])

    plt.plot(fpr, tpr, 'b', alpha=0.15)
    tpr = interp(base_fpr, fpr, tpr)
    tpr[0] = 0.0
    tprs.append(tpr)

tprs = np.array(tprs)
mean_tprs = tprs.mean(axis=0)
std = tprs.std(axis=0)

tprs_upper = np.minimum(mean_tprs + std, 1)
tprs_lower = mean_tprs - std


plt.plot(base_fpr, mean_tprs, 'b')
plt.fill_between(base_fpr, tprs_lower, tprs_upper, color='grey', alpha=0.3)

plt.plot([0, 1], [0, 1],'r--')
plt.xlim([-0.01, 1.01])
plt.ylim([-0.01, 1.01])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.axes().set_aspect('equal', 'datalim')
plt.show()

反復CVの場合:

idx = np.arange(0, len(y))

for j in np.random.randint(0, high=10000, size=10):
    np.random.shuffle(idx)
    kf = KFold(n=len(y), n_folds=10, random_state=j)

    for i, (train, test) in enumerate(kf):
        model = LogisticRegression().fit(X[idx][train], y[idx][train])
        y_score = model.predict_proba(X[idx][test])
        fpr, tpr, _ = roc_curve(y[idx][test], y_score[:, 1])

        plt.plot(fpr, tpr, 'b', alpha=0.05)
        tpr = interp(base_fpr, fpr, tpr)
        tpr[0] = 0.0
        tprs.append(tpr)

インスピレーションの源:http : //scikit-learn.org/stable/auto_examples/model_selection/plot_roc_crossval.html


3

平均化する確率は、検証しようとしている予測を表しておらず、検証サンプル全体の汚染を伴うため、正しくありません。

適切な精度を達成するには、10回の交差検定を100回繰り返す必要があることに注意してください。または、同じ精度での反復回数が少ないEfron-Gong楽観的ブートストラップを使用します(たとえば、R rmsパッケージvalidate関数を参照)。

c


平均化が正しくない理由について詳しく説明してください。
-DataD'oh

すでに述べた。フィールドで使用するメジャーを検証する必要があります。
フランクハレル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.