【发布时间】: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?在您的代码中?可能不是。在你的测试中?可能是。我们不知道。我建议尝试交叉验证。也许你的问题很容易学习。也许您的测试集有问题。交叉验证将显示这一点。 -
谢谢你们!这真的很有帮助。我会尝试交叉验证。如果我仍然无法获得常规曲线,我将上传数据。
-
Cel:确实是测试数据的选择问题。我碰巧选择了一组简单的测试。这就是为什么我有一条水平线。谢谢!
标签: python matplotlib scikit-learn roc precision-recall