如何绘制 ROC 曲线的平均值?

Posted

技术标签:

【中文标题】如何绘制 ROC 曲线的平均值?【英文标题】:How to plot the average of ROC curves? 【发布时间】:2018-12-28 07:05:00 【问题描述】:

我正在尝试执行异常值检测,我有 15 个不同的测试集和 3 个不同的模型(基于 PCA 的分类器、一类 SVM 和隔离森林)。

对于基于 PCA 的分类,我编写了自己的代码来生成 ROC 曲线。我有 2 个列表 pcafprspcatprs,每个列表都有 15 个子列表,每个子列表代表绘制 ROC 曲线所需的假阳性率和真阳性率。

对于一类 SVM 和隔离森林,我可以从 sklearn.metrics.roc_curve 获得 (fpr, tpr)。与 PCA 类似,我有 ocsvmfprsocsvmtprs 用于一类 SVM,isoforestfprsisoforesttprs 用于隔离森林。

对于每个测试集,我可以遍历 FPR 和 TPR 列表并绘制 ROC 曲线。代码可能如下所示:for i in range(len(pcafprs)): plt.plot(pcafprs[i], pcatprs[i]) #Plot the ROC curve plt.show() 对于 3 个模型中的每一个,我希望能够在一张图中绘制 15 个测试集的所有 15 条 ROC 曲线的平均值。我不能简单地对包含 TPR 和 FPR 的数组执行 np.mean,因为 sklearn.metrics.roc_curve 返回的 FPR 对于每个测试集都是不同的点。

对于 PCA,我尝试使用 np.mean(pcatprs, axis=0)np.mean(pcafprs, axis=0) 来平均所有 TPR 和 FPR,以便我可以绘制一个表示所有测试集平均值的图形。这很有效,因为对于 PCA,我为每个测试集生成了相同数量的 FPR 和 TPR。 但是,我无法控制否。 sklearn.metrics.roc_curve 为每个测试集返回的 FPR 和 TPR 数量,事实证明它为每个测试集返回不同数量的值。因此,我无法使用np.mean 来查找平均 ROC 曲线。

tl,dr:有没有办法在图上绘制多条线的平均值,而不需要方程,而只有一些点位于线上,我们有一个 每条线的可用点数不同

【问题讨论】:

到目前为止您尝试过什么?可以create a Minimal, Complete, and Verifiable example吗? 嗨@Anthony,我已经更新了帖子以包含更多详细信息,请您再检查一次吗? 【参考方案1】:

通过选择一组固定的 FPR 来解决,然后对 sklearn.metrics.roc_curve 返回的每对 (fpr,tpr) 使用 no.interp 以获得相应的 TPR,然后使用 np.mean 对所有 ROC 进行平均

【讨论】:

以上是关于如何绘制 ROC 曲线的平均值?的主要内容,如果未能解决你的问题,请参考以下文章

绘制 K 折交叉验证的 ROC 曲线

从 R 中的交叉验证(训练)数据中绘制 ROC 曲线

机器学习框架及评估指标详解

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

如何从分类树概率中绘制 ROC 曲线

如何在 Gnuplot 中绘制噪声值的平均值