我需要评估两个分类算法的性能。我使用sklearn的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()
你可以通过在xs
和ys
列表末尾添加0
,并使用以下代码来检查点(x,y)
是否在曲线下方:
is_under = Truefor 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
。
请注意,如果增加点的数量,方法的精度会提高。