Precision-Recall曲线或ROC曲线是不是可能是一条水平线?

Posted

技术标签:

【中文标题】Precision-Recall曲线或ROC曲线是不是可能是一条水平线?【英文标题】:Is it possible that Precision-Recall curve or a ROC curve is a horizontal line?Precision-Recall曲线或ROC曲线是否可能是一条水平线? 【发布时间】:2015-10-03 03:53:32 【问题描述】:

我正在处理不平衡数据的二元分类任务。

因为在这种情况下准确度没有太大意义。 我使用 Scikit-Learn 计算 Precision-Recall 曲线和 ROC 曲线以评估模型性能。

但是当我使用带有大量估计器的随机森林时,我发现两条曲线都是一条水平线,当我使用 SGD 分类器来拟合它时也会发生这种情况。

ROC图表如下:

还有 Precision-Recall 图表:

由于随机森林的行为是随机的,我不会在每次运行时都得到一条水平线,有时我也会得到一条规则的 ROC 和 PR 曲线。但水平线更常见。

这正常吗?还是我在代码中犯了一些错误?

这是我的代码的 sn-p:

classifier.fit(X_train, Y_train)
try:
    scores = classifier.decision_function(X_test)
except:
    scores = classifier.predict_proba(X_test)[:,1]

precision, recall, _ = precision_recall_curve(Y_test, scores, pos_label=1)
average_precision = average_precision_score(Y_test, scores)

plt.plot(recall, precision, label='area = %0.2f' % average_precision, color="green")
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision Recall Curve')
plt.legend(loc="lower right")
plt.show()

【问题讨论】:

它看起来有点好得令人难以置信。 :-) 您能否通过保管箱共享链接或谷歌驱动程序上传您的示例数据文件? 花点时间想想情节实际上告诉你什么。您基本上对测试集进行了完美的预测。 Is this normal? 不。通常用机器学习技术解决的问题要困难得多。完美的预测通常是不可能的。 Or did I make some mistakes in my code? 在您的代码中?可能不是。在你的测试中?可能是。我们不知道。我建议尝试交叉验证。也许你的问题很容易学习。也许您的测试集有问题。交叉验证将显示这一点。 谢谢你们!这真的很有帮助。我会尝试交叉验证。如果我仍然无法获得常规曲线,我将上传数据。 重复stats.stackexchange.com/questions/161314/… Cel:确实是测试数据的选择问题。我碰巧选择了一组简单的测试。这就是为什么我有一条水平线。谢谢! 【参考方案1】:

是的,你可以。如果你将数据完美地分成两堆,那么当你的阈值越过你的一堆真阳性时,你就会从零垂直上升到 1 的真阳性率,而没有任何假阳性(垂直线),然后从 0 到 1 假阳性。当你的阈值超过你的一堆真正的否定时,积极率。

如果您可以从测试集中获得相同的 ROC 曲线,那么您就是黄金。如果您可以在 5 个不同的 k 折交叉验证测试集上评估相同的 ROC 曲线,那么您就是白金级了。

【讨论】:

经过 10 次交叉验证 Stratified Shuffle Split,我得到了规则曲线。感谢您的精彩回答!【参考方案2】:

与其他答案一起,您可能已将标签复制为数据集中的特征。因此,当在 RF 中进行采样时,您并不总是将该特征作为预测变量并获得“看起来正常”的 ROC 曲线(即其他特征无法准确预测标签);当您确实在样本中获得重复的标签/特征时,您的模型根据定义具有 100% 的准确度。

SGD 可能有同样的问题,线性回归会失败。在线性回归中,您将有一个奇异/近奇异矩阵,并且估计会失败。使用 SGD,由于您是根据到达的每个下一个点重新估计,因此数学不会失败(不过,您的模型仍然值得怀疑)。

【讨论】:

我的特征中没有“答案特征”,但这仍然是一个很好的见解,谢谢分享!【参考方案3】:

其他 2 个答案只是看到水平线的充分条件(也就是水平线的可能原因,但它们不是唯一的可能性)。下面是充要条件:

如果您在 PR 曲线中看到一条水平线,则它必须在顶部,这意味着阈值范围内的示例都是 TP。而且线越长,TP越多(因为线越长召回率越大)。

证明:

让我们将“TP”表示为真阳性,将“PP”表示为预测阳性,因此精度 = TP/PP。

水平线表示召回率增加了一定数量,而精度保持不变。让我们分别讨论这两件事:

    召回率增加了一些 ->
TP 增加了一些 假设 TP 增加了最小的量,1。假设 x 是 PP 的增加量。根据定义 x>=1。
    精度不变->
(TP+1)/(PP+x)=TP/PP 为 x 解决这个问题,我们有 x=TP/PP。因为精度 = TP/PP =1”,x 必须为 1。

这意味着 TP 和 PP 的增量都是 1,即只添加了正例。由于 x=TP/PP,我们也有精度 TP/PP=1。 QED。

【讨论】:

以上是关于Precision-Recall曲线或ROC曲线是不是可能是一条水平线?的主要内容,如果未能解决你的问题,请参考以下文章

Recall值与Precision-Recall曲线的关系

ROC曲线怎么做啊

SGD 分类器 Precision-Recall 曲线

在 scikit-learn 中使用交叉验证时绘制 Precision-Recall 曲线

R中PRROC包的Precision-Recall曲线计算

R语言deLong‘s test:使用自定义函数检验两个ROC曲线的差异是否具有统计显著性比较两个或多个相关ROC曲线的AUC的非参数检验