求AUC 95%置信区间

求AUC 95%置信区间

直接上 代码

def bootstrap_auc(y, pred, classes, bootstraps = 100, fold_size = 1000):
    statistics = np.zeros((len(classes), bootstraps))

    for c in range(len(classes)):
        df = pd.DataFrame(columns=['y', 'pred'])
        # df.
        df.loc[:, 'y'] = y
        df.loc[:, 'pred'] = pred
        df_pos = df[df.y == 1]
        df_neg = df[df.y == 0]
        prevalence = len(df_pos) / len(df)
        for i in range(bootstraps):
            pos_sample = df_pos.sample(n = int(fold_size * prevalence), replace=True)
            neg_sample = df_neg.sample(n = int(fold_size * (1-prevalence)), replace=True)

            y_sample = np.concatenate([pos_sample.y.values, neg_sample.y.values])
            pred_sample = np.concatenate([pos_sample.pred.values, neg_sample.pred.values])
            score = roc_auc_score(y_sample, pred_sample)
            statistics[c][i] = score
    return statistics
y = np.array([1, 1, 0, 0])
scores = np.array([0.1, 0.4, 0.35, 0.8])
statistics = bootstrap_auc(y,scores,[0,1])
print("均值:",np.mean(statistics,axis=1))
print("最大值:",np.max(statistics,axis=1))
print("最小值:",np.min(statistics,axis=1))
//均值: [0.24828344 0.2484288 ]
//最大值: [0.281912 0.286216]
//最小值: [0.204516 0.205208]

这里statistics 是一个2*100的矩阵,一共做了两次、每次采样100次得到的结果,我们可以取两次中效果最好的一次作为我们的AUC 95%置信区间(即 0.2484(0.2052-0.2862))。

注意
这里的输入scores 应该是预测为正类的概率,而非预测类的概率。
比如array中的0.8应该是指预测为1的概率为0.8,而非预测0的概率是0.8。

关于输入

输入y,scores的类型可以是array,也可以是list

你可能感兴趣的:(评价指标,机器学习,python,分类,auc)