为什么我的precisionrecall和ROC曲线不平滑?

2024-09-20 07:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些标记为0或1的数据,我尝试使用随机林来预测这些类。每个实例都标记有20个用于训练随机林的特性(约30.000个训练实例和约6000个测试实例)。在

我正在使用以下代码绘制精度召回和ROC曲线:

precision, recall, _ = precision_recall_curve(y_test, y_pred)
plt.step(recall, precision, color='b', alpha=0.2,where='post')
plt.fill_between(recall, precision, step='post', alpha=0.2, color='b')

fpr, tpr, _ = roc_curve(y_test, y_pred)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')

到目前为止,我看到的所有PR和ROC曲线在精确度/召回率方面总是有参差不齐的/平滑的下降,而ROC曲线的平滑/参差不齐的增加。但我的PR和ROC曲线总是这样的:

PR curveROC curve 由于某些原因,它们只有一个改变方向的点。这是由于我的编码错误还是数据/分类问题固有的原因?如果是这样,如何解释这种行为?在


Tags: 数据实例标记testplt曲线precisioncolor
2条回答

precision_recall_curve内,y_pred必须是目标类probabilities,而不是实际的预测类。在

因为您使用的是RandomForestClassifier,所以使用predict_proba(X)来获得概率。在

rf = RandomForestClassifier()
probas_pred = rf.predict_proba(X_test)

precision, recall, _ = precision_recall_curve(y_true, probas_pred)
plt.step(recall, precision, color='b', alpha=0.2,where='post')
plt.fill_between(recall, precision, step='post', alpha=0.2, color='b')

我怀疑你用了RandomForestClassifier.predict()方法,根据预测的类生成0或1。在

要得到概率,即为特定类投票的树的分数,必须使用RandomForestClassifier.predict_proba()方法。在

使用这些概率作为曲线计算的输入应该可以解决这个问题。在

编辑:scikit learn的曲线生成方法首先根据预测得分对预测结果进行排序,然后根据实际值/观察值对预测值进行排序,因此曲线具有这些“弯折”。在

相关问题 更多 >