如何使用sklearn成对比较两条ROC曲线?

Posted

技术标签:

【中文标题】如何使用sklearn成对比较两条ROC曲线?【英文标题】:How to pairwise compare two ROC curve using sklearn? 【发布时间】:2020-10-14 21:19:57 【问题描述】:

我必须评估两种分类算法的性能。我使用来自 sklearn (here documentation) 的 roc_curve 获得 假阳性率真阳性率。我使用了以下代码:

fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(2):
    fpr[i], tpr[i], _ = roc_curve(true_labels, pred_labels)
    roc_auc[i] = auc(fpr[i], tpr[i])

我有两个分类器的这些信息,现在我想比较它们。我知道可以使用 AUC 或其他指标,但 我真的很想了解 ROC 曲线超过另一条的次数百分比。因此,我想比较来自两条曲线。

我的第一个想法是比较每个 fpr 元素对应的 tpr。不幸的是,fprtpr 对象的大小不同,因为它们是插值步骤的输出。

你知道怎么做吗?为了使比较可行,我似乎无法对roc_curve 函数说我想要输出中有多少(以及哪些)点。使用 sklearn 不是强制性的。

【问题讨论】:

您能否阐明“ROC 曲线超过另一条曲线的次数百分比”是什么意思?百分比是指在 x 轴、阈值还是其他方面? 我的意思是(假设我有 100k 点)我想知道 Curve1 的 y 值比 Curve2 高多少倍 只是为了确定:100k 点是 x 值?所以你不在乎两个分类器之间的阈值如何比较? 【参考方案1】:

此解决方案并非特定于 sklearn,而是一种科学方法。使用蒙特卡罗方法。在一个单位正方形内生成 10K 个点,并计算两条 ROC 曲线下的点数,由c 表示。 c/10000等于这两条曲线的交点面积,因为单位正方形的面积是1

要在单位正方形内生成一个随机点,您可以使用以下代码:

import random 

x = random.random()
y = random.random()

ِ您可以通过在xsys 列表的尾部添加0 并使用以下代码来检查(x,y) 的点是否在曲线下方:

is_under = True
for i in range(1, len(xs)): # 0 is added to the tails of xs and ys
    m = (y[1] - y[0])/(x[1]-x[0])
    if y > m * (x - x[0]) + y[0]:
        is_under = False
        break

在上面的代码中,我们检查了给定点(x,y) 是否应该在曲线的任何段之下。如果是,则循环结束时is_under必须是True,否则必须是False

注意,如果增加点数,方法的精度会提高。

【讨论】:

我没有任何类型的函数来定义我的曲线。基本上每条曲线仅由点的子集定义(x 轴和 y 轴在 0-1 范围内或多或少 5k 个点),但这些点永远不会完全相同(每个坐标的数字精度非常高)。蒙特卡洛方法是一个不错的选择,但我不知道如何进行点采样 @AndreaM 在单位正方形内生成随机点很简单。请查看更新。 蒙特卡洛方法是个好主意。无论如何,让我们考虑一下我的“曲线”定义如下:x_1: [0, 0.01, 0.05, 0.08, ....]x_2: [0, 0.02, 0.04, 0.09, ...] 而对于 y:y_1: [0.2, 0.24, 0.26, ...]y_2: [0.3, 0.32, 0.35, ...] 正如你所看到的,x 值不一样,所以我不知道如何评估生成的随机点之一是否在两条曲线下 xsxy 是什么意思? @AndreaM xsys 是(x_1y_1)或(x_2y_2)。您需要为每个点运行此循环,如果它们都返回 true,则可以将其视为交集。 xy 是随机生成点的位置(如帖子中所述)。

以上是关于如何使用sklearn成对比较两条ROC曲线?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 如何计算二元分类器的 roc 曲线下面积?

使用sklearn画二分类模型ROC曲线,PR曲线

如何获得决策树的 ROC 曲线?

PR曲线,ROC曲线以及绘制,AUC

python使用sklearn的RocCurveDisplay来可视化ROC曲线(受试者工作特征曲线)

详解支持向量机-基于SVM的ROC曲线和AUC面积菜菜的sklearn课堂笔记