如何使用sklearn对两个ROC曲线进行成对比较?

我需要评估两个分类算法的性能。我使用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。不幸的是,fprtpr对象的大小不同,因为它们是插值步骤的输出。

有什么方法可以做到这一点吗?似乎我无法告诉roc_curve函数我想要输出多少(以及哪些)点,以使比较可行。使用sklearn并不是必需的。


回答:

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

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

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

你可以通过在xsys列表末尾添加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

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注