roc_curve 在 sklearn 中:为什么它不能正常工作?



我正在解决多类分类的任务,并希望在sklearn中使用roc曲线估计结果。据我所知,如果我设置一个正标签,它允许在这种情况下绘制曲线。我尝试使用正标签绘制 roc 曲线,结果很奇怪:类的"正标签"越大,roc 曲线就越接近左上角。然后,我绘制了一条 roc 曲线,其中包含数组的先前二进制标记。这两个情节不同!我认为第二个构建正确,但在二元类的情况下,该图只有 3 个点,这没有信息。

我想了解,为什么二元类的roc曲线和带有"正标签"的roc曲线看起来不同,以及如何正确绘制具有正标签的roc曲线。

这是代码:

from sklearn.metrics import roc_curve, auc
y_pred = [1,2,2,2,3,3,1,1,1,1,1,2,1,2,3,2,2,1,1]
y_test = [1,3,2,2,1,3,2,1,2,2,1,2,2,2,1,1,1,1,1]
fp, tp, _ = roc_curve(y_test, y_pred, pos_label = 2)
from sklearn.preprocessing import label_binarize
y_pred = label_binarize(y_pred, classes=[1, 2, 3])
y_test = label_binarize(y_test, classes=[1, 2, 3])
fpb, tpb, _b = roc_curve(y_test[:,1], y_pred[:,1])
plt.plot(fp, tp, 'ro-', fpb, tpb, 'bo-', alpha = 0.5)
plt.show()
print('AUC with pos_label', auc(fp,tp))
print('AUC binary variant', auc(fpb,tpb))

这是情节的例子

红色曲线表示roc_curve pos_label,蓝色曲线表示"二进制大小写"中的roc_curve

正如评论中所解释的,ROC 曲线不适合评估阈值预测(即硬类(,因为您的y_pred; 此外,在使用AUC时,记住一些对许多从业者来说并不明显的限制是很有用的 - 有关更多详细信息,请参阅获得低ROC AUC分数但高精度中自己答案的最后一部分。

您能否给我一些建议,我可以使用哪些指标来评估这种具有"硬"类的多类分类的质量?

最直接的方法是混淆矩阵和scikit-learn随时提供的分类报告:

from sklearn.metrics import confusion_matrix, classification_report
y_pred = [1,2,2,2,3,3,1,1,1,1,1,2,1,2,3,2,2,1,1]
y_test = [1,3,2,2,1,3,2,1,2,2,1,2,2,2,1,1,1,1,1]
print(classification_report(y_test, y_pred)) # caution - order of arguments matters!
# result:
             precision    recall  f1-score   support
          1       0.56      0.56      0.56         9
          2       0.57      0.50      0.53         8
          3       0.33      0.50      0.40         2
avg / total       0.54      0.53      0.53        19
cm = confusion_matrix(y_test, y_pred) # again, order of arguments matters
cm
# result:
array([[5, 2, 2],
       [4, 4, 0],
       [0, 1, 1]], dtype=int64)

从混淆矩阵中,您可以提取其他感兴趣的数量,例如每个类的真假阳性等 - 有关详细信息,请参阅如何在 Python 中的混淆矩阵中获得精度、召回率和 f 测量中的答案

相关内容

  • 没有找到相关文章

最新更新