ROC vs. PRC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROC vs. PRC相关的知识,希望对你有一定的参考价值。

参考技术A 评价二元分类器性能的指标,常见的有:Accuracy,ROC curve(Sensitivity + Specificity)、AUC、PR curve(Precision + Recall)、F1 score。

其中,主要的争论在于,评价模型时应该选用ROC(即Sensitivity + Specificity)还是PRC(即Precision + Recall)。

把知乎上 「精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?」 下的回答都看了一遍,有人偏向ROC,有人偏向PRC。

但有两点基本是统一的:

这篇文章简单讨论一下不同情况下Sensitivity(也即Recall)、Specificity和Precision的变化情况,和由此得之的ROC、PRC选择偏好。

先放结论:总体而言,如果只能二选一,我会选择ROC。

先讲讲混淆矩阵。

混淆矩阵是用来总结一个分类器结果的矩阵。对于k元分类,它是一个k x k的表格,用来记录分类器的预测结果。

最常见的二元分类,它的混淆矩阵是一个2x2表:

二元分类器的大多数指标都是上述TP、FN、FP、TN的排列组合运算。

这篇文章涉及到ROC和PRC下的三个指标:

Sensitivity(Recall)指的是,真实的class 1被正确分类的比例。

Specificity指的是,真实的class 0被正确分类的比例。

Precision指的是,被分类为class 1的数据中,被判断正确的数据的比例。

在实际工作中使用分类器做预测的时候,目的一般是为了识别class 1,比如识别一封邮件是否为垃圾邮件(是:1,否:0)。即,我们想要高Sensitivity(或高Recall)。

以下,我基于数据是否平衡,以及Recall和Specificity或高或低的不同情况(双低的情况就不讨论了),简单设计了相应的混淆矩阵,并计算了每种情况下的Recall值、Specificity值和Precision值,具体如图(请无视其中的F1 score):

在数据平衡的情况中,实际的class 1和class 0在数量上都为100。在数据不平衡的情况中,实际的class 1有20个、class 0有180个。

在数据平衡和不平衡的情况中,都有Recall和Specificity双高(0.8)、或二者中一个高(0.8)一个低(0.2)三种情况。Precision根据不同情况所得的混淆矩阵计算。

通过比较上述六种情况下各指标的值可以发现:

下面我通过两个不同的应用场景,来分析具体情况在应该选择ROC还是PRC。

乍看之下,在这个场景里PRC是更好的选择,因为我们对Precision和Recall的要求高。但结合上述实验结果可以发现,在Recall相同的情况下,无论数据是否平衡,Specificity和Precision变化方向总是相同的,但Precision的变化幅度比Specificity小。换言之,Recall不变的时候,看Specificity比看Precision要更容易对比模型优劣。因此,ROC是更好的选择。

在这个场景下,数据显然是极度不平衡的 ,毕竟地震源很少,并且,我们希望Recall越高越好,即使出现误判,我们也不希望放过一个地震源。这个时候,无论是ROC还是PRC都是可选的。

通过对上述两类应用场景的简单分析,可以发现,在选择ROC还是PRC上,要结合具体情况来考虑,但如果二者只能选其一,ROC是更保险的选择。

随机森林:预测 vs predict_proba

【中文标题】随机森林:预测 vs predict_proba【英文标题】:random forest: predict vs predict_proba 【发布时间】:2021-06-23 05:31:03 【问题描述】:

我正在研究一个多类、高度不平衡的分类问题。我使用随机森林作为基础分类器。

我必须在考虑多个标准(指标:precision, recall conf_matrix, roc_auc)的评估集上给出模型性能报告。

模型火车:

rf = RandomForestClassifier(()
rf.fit(train_X, train_y)

为了获得精确/召回和混淆矩阵,我喜欢:

pred = rf.predict(test_X)
precision = metrics.precision_score(y_test, pred)
recall  = metrics.recall_score(y_test, pred)
f1_score = metrics.f1_score(y_test, pred) 
confusion_matrix = metrics.confusion_matrix(y_test, pred)

很好,但是计算roc_auc 需要类的预测概率而不是类标签。为此,我必须进一步这样做:

y_prob = rf.predict_proba(test_X)
roc_auc = metrics.roc_auc_score(y_test, y_prob)

但是我在这里担心rf.predict() 首先产生的结果可能与rf.predict_proba() 不一致,所以我报告的roc_auc 分数。我知道多次调用predict 会产生完全相同的结果,但我担心predict 然后predict_proba 可能会产生略有不同的结果,因此不适合与上述指标一起讨论。

如果是这种情况,有没有办法控制这种情况,确保predict() 用于确定预测标签的类概率在我调用predict_proab 时完全相同?

【问题讨论】:

作为一般评论,对于高度不平衡的分类,准确率、精度、召回率和 f1 分数是评估模型的较差指标。如果您想评估您的模型在不同类别之间的区分程度,请关注 roc-auc。如果您正在尝试针对业务问题进行优化并知道错误的成本(例如:将 A 标记为 B 比将 B 标记为 A 差 10 倍),请关注f_beta_score。 【参考方案1】:

predict_proba()predict() 是一致的。事实上,predict 使用 predict_proba 内部可以看到here in the source code

【讨论】:

以上是关于ROC vs. PRC的主要内容,如果未能解决你的问题,请参考以下文章

F1 分数 vs ROC AUC

使用FDDB人脸样本检测库,测试自己的人脸检测算法性能并生成ROC曲线。

VS2017 localdb 中文乱码

Deep Learning 9: Performance

PRC是什么 | 图解系列

PRC是什么 | 图解系列