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

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

最佳答案

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

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

关于python - Precision-Recall 曲线或 ROC 曲线是否可能是一条水平线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31407844/

相关文章:

python - struct.unpack 和 struct.pack 是如何工作的?

matplotlib - seaborn "kde jointplot"在最新版本 (0.11.0) 中没有颜色映射

python-2.7 - 可以使用哪些 Networkx 图?

python - 无法使用 Apache 将 sklearn 导入 Google Compute Engine 上的 Flask 应用程序

python - Pandas 合并而不复制列

python - 爬行完成后运行自定义代码(scrapy)

python - 用于返回下一个特征以 split 树的决策树实现

python - Scikit-learn - 一次性交叉验证分数和预测?

python - 您可以在 lambda 中分配变量吗?

python - networkx 节点着色中的异常行为