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

Is it possible that Precision-Recall curve or a ROC curve is a horizontal line?

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

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

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

ROC图如下:

以及 Precision-Recall 图表:

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

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

这是我的代码片段:

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()

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

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

是的,你可以。如果您将数据完美地分成两堆,那么当您的阈值超过您的真阳性堆时,您会从零垂直变为 1 真阳性率而没有任何误报(垂直线),然后从 0 到 1 假阳性率当您的阈值超过您的真负数堆时,阳性率。

如果你能从测试集中得到相同的 ROC 曲线,那你就是黄金。如果你能得到在 5 个不同的 k 折交叉验证测试集上评估的相同 ROC 曲线,你就是白金。

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

如果你在PR曲线中看到一条水平线,它一定在顶部,这意味着阈值范围内的例子都是TP。而且线越长,TP越多(因为线越长recall越大)

证明:

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

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

  1. 召回率增加了一些 ->
  • TP 增加一定数量
  • 假设TP的增加量最小,1。假设x是PP的增加量。根据定义 x>=1.
  1. 精度不变->
  • (TP+1)/(PP+x)=TP/PP 求解 x 得到 x=TP/PP。因为 precision = TP/PP <=1,而我们刚才说“根据定义 x>=1”,x 必须是 1.

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