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

时间:2015-07-14 13:19:42

标签: python matplotlib scikit-learn roc precision-recall

我正在研究不平衡数据的二进制分类任务。

由于在这种情况下准确性不那么有意义。 我使用Scikit-Learn计算Precision-Recall曲线和ROC曲线,以评估模型性能。

但是当我使用随机森林和很多估算器时,我发现两条曲线都是水平线,当我使用SGD分类器来适应它时也会发生这种情况。

ROC图表如下:

enter image description here

Precision-Recall图表:

enter image description here

由于随机森林行为随机,我不会在每次运行中得到一条水平线,有时我也得到一个常规的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()

2 个答案:

答案 0 :(得分:2)

除了其他答案之外,您可能已将标签复制为数据集中的要素。因此,当在RF中进行采样时,您并不总是将该功能作为预测器并获得正常外观" ROC曲线(即其他特征无法准确预测标签);当您获得样本中的重复标签/特征时,您的模型根据定义具有100%的准确度。

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

答案 1 :(得分:0)

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

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

证明:

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

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

  1. 回忆增加了一些 ->
  • TP 增加了一些
  • 假设 TP 增加的量最小,为 1。假设 x 是 PP 的增加量。根据定义 x>=1。
  1. 精度不变 ->
  • (TP+1)/(PP+x)=TP/PP 解决这个 x 我们有 x=TP/PP。因为精度 = TP/PP <=1,而且我们刚刚说“根据定义 x>=1”,x 必须是 1。

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