具有概率估计值的重复10倍交叉验证的平均ROC


15

我计划使用机器学习算法对大约10,000个案例使用重复(10次)分层10倍交叉验证。每次重复将使用不同的随机种子进行。

在此过程中,我为每种情况创建了10个概率估计实例。10倍交叉验证的10次重复中的每一次重复的概率估计的1个实例

我是否可以为每种情况平均10个概率,然后创建新的平均ROC曲线(代表重复10倍CV的结果),可以通过配对比较将其与其他ROC曲线进行比较?

Answers:


13

从您的描述看来,这似乎是很合理的:不仅可以计算平均ROC曲线,还可以计算其周围的方差以建立置信区间。它应该使您了解模型的稳定性。

例如,像这样:

在此处输入图片说明

在这里,我放置了各个ROC曲线以及均值曲线和置信区间。在某些区域中曲线是一致的,所以我们的方差较小,在某些区域中它们是不一致的。

对于重复的简历,您可以重复多次,并获得所有单折的总平均值:

在此处输入图片说明

它与上一张图片非常相似,但是给出了平均值和方差的更稳定(即可靠)的估计。

这是获取绘图的代码:

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()

对于重复的简历:

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 rmsvalidate函数)。

ROC曲线绝不能洞悉此问题。使用适当的准确度得分,并附带指数(一致性概率; AUROC),该指数比曲线更容易处理,因为可以使用Wilcoxon-Mann-Whitney统计信息轻松快速地进行计算。C


您能否进一步说明平均为何不正确?
DataD'oh

已经说过了。您需要验证将在现场使用的度量。
Frank Harrell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.