확률 추정치로 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

검증하려는 예측을 나타내지 않으며 검증 샘플 전체의 오염을 포함하기 때문에 평균 확률에 대해서는 올바르지 않습니다.

적절한 정밀도를 달성하기 위해 100 배의 10 배 교차 검증이 필요할 수 있습니다. 또는 동일한 정밀도를 위해 반복 횟수가 적은 Efron-Gong 낙관론 부트 스트랩을 사용하십시오 (예 : R rms패키지 validate기능 참조 ).

ROC 곡선은이 문제에 대해 전혀 통찰력이 없습니다. 적절한 정확도 점수를 사용하고 Wilcoxon-Mann-Whitney 통계량을 사용하여 쉽고 빠르게 계산하기 때문에 곡선보다 다루기가 훨씬 쉬운 인덱스 (concordance 확률; AUROC)와 함께 제공됩니다.


평균화가 왜 올바르지 않은지 더 자세히 설명해 주시겠습니까?
DataD'oh

이미 언급했다. 현장에서 사용할 측정 값을 확인해야합니다.
Frank Harrell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.