如何使用sklearn成对比较两条ROC曲线?
How to pairwise compare two ROC curve using sklearn?
我要评估两种分类算法的性能。我使用来自 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。不幸的是,fpr
和 tpr
对象具有不同的大小,因为它们是插值步骤的输出。
知道怎么做吗?似乎我不能对 roc_curve
函数说出我想要在输出中有多少(和哪些)点,以使比较可行。不强制使用 sklearn。
此解决方案并非特定于 sklearn,而是一种科学方法。使用蒙特卡洛方法。在一个单位正方形内生成 10K 个点,并计算在两条 ROC 曲线下的点数,用 c
表示。 c/10000
等于这两条曲线的交点面积,因为一个单位正方形的面积是1
.
要在单位正方形内生成随机点,您可以使用以下代码:
import random
x = random.random()
y = random.random()
ِ你可以检查 (x,y)
的点是否在 xs
和 ys
列表的曲线下,方法是将 0
添加到它们的尾部并使用以下代码:
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
。
请注意,如果增加点数,方法的精度也会提高。
我要评估两种分类算法的性能。我使用来自 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。不幸的是,fpr
和 tpr
对象具有不同的大小,因为它们是插值步骤的输出。
知道怎么做吗?似乎我不能对 roc_curve
函数说出我想要在输出中有多少(和哪些)点,以使比较可行。不强制使用 sklearn。
此解决方案并非特定于 sklearn,而是一种科学方法。使用蒙特卡洛方法。在一个单位正方形内生成 10K 个点,并计算在两条 ROC 曲线下的点数,用 c
表示。 c/10000
等于这两条曲线的交点面积,因为一个单位正方形的面积是1
.
要在单位正方形内生成随机点,您可以使用以下代码:
import random
x = random.random()
y = random.random()
ِ你可以检查 (x,y)
的点是否在 xs
和 ys
列表的曲线下,方法是将 0
添加到它们的尾部并使用以下代码:
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
。
请注意,如果增加点数,方法的精度也会提高。