我正在研究不平衡数据的二进制分类任务。
由于在这种情况下准确性不那么有意义。 我使用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()
答案 0 :(得分:2)
除了其他答案之外,您可能已将标签复制为数据集中的要素。因此,当在RF中进行采样时,您并不总是将该功能作为预测器并获得正常外观" ROC曲线(即其他特征无法准确预测标签);当您获得样本中的重复标签/特征时,您的模型根据定义具有100%的准确度。
SGD可能会遇到同样的问题,线性回归会失败。在线性回归中,您具有奇异/近似奇异矩阵,并且估计将失败。对于SGD,由于您根据到达的每个下一个点重新估算,因此数学不会失败(但是,您的模型仍然会被怀疑)。
答案 1 :(得分:0)
其他 2 个答案只是看到水平线的充分条件(也就是它们是水平线的可能原因,但不是唯一的可能性)。以下是充要条件:
如果您在 PR 曲线中看到一条水平线,则它必须在顶部,这意味着阈值范围内的示例都是 TP。并且线越长,TP越大(因为线越长召回率越大)。
证明:
让我们将“TP”表示为真阳性,将“PP”表示为预测阳性,因此精度 = TP/PP。
水平线意味着召回率增加了一定数量,而精度不变。让我们分别讨论这两件事:
这意味着 TP 和 PP 的增加都是 1,即只添加了正例。由于 x=TP/PP,我们也有精度 TP/PP=1。 QED。