我正在尝试执行离群值检测,并且我有15种不同的测试集和3种不同的模型(基于PCA的分类器,一个Class SVM和隔离林)。
对于基于PCA的分类,我编写了自己的代码来生成ROC曲线。我有2个列表pcafprs
和pcatprs
,每个列表都有15个子列表,每个子列表代表绘制ROC曲线所需的误报率和误报率。
对于一类SVM和隔离林,我可以从sklearn.metrics.roc_curve
获取(fpr,tpr)。与PCA相似,对于一类SVM,我有ocsvmfprs
和ocsvmtprs
,对于隔离林,我有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 :是否有一种方法可以在图形上绘制多条线的平均值,而无需方程式,而只有一些点位于线上,我们有一个每行可用的点数不同?
答案 0 :(得分:0)
通过选择一组固定的FPR来解决,然后对no.interp
返回的每对(fpr,tpr)使用sklearn.metrics.roc_curve
以获得相应的TPR,然后使用{{1}对所有ROC取平均值}