如何绘制 ROC 曲线的平均值?
Posted
技术标签:
【中文标题】如何绘制 ROC 曲线的平均值?【英文标题】:How to plot the average of ROC curves? 【发布时间】:2018-12-28 07:05:00 【问题描述】:我正在尝试执行异常值检测,我有 15 个不同的测试集和 3 个不同的模型(基于 PCA 的分类器、一类 SVM 和隔离森林)。
对于基于 PCA 的分类,我编写了自己的代码来生成 ROC 曲线。我有 2 个列表 pcafprs
和 pcatprs
,每个列表都有 15 个子列表,每个子列表代表绘制 ROC 曲线所需的假阳性率和真阳性率。
对于一类 SVM 和隔离森林,我可以从 sklearn.metrics.roc_curve
获得 (fpr, tpr)。与 PCA 类似,我有 ocsvmfprs
和 ocsvmtprs
用于一类 SVM,isoforestfprs
和 isoforesttprs
用于隔离森林。
对于每个测试集,我可以遍历 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 曲线的平均值?的主要内容,如果未能解决你的问题,请参考以下文章