我正在解决一个多类分类的任务,并希望使用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))
红色曲线表示带有pos_label的roc_curve,蓝色曲线表示“二进制”下的roc_curve
答案 0 :(得分:0)
如评论中所述,ROC曲线不不适合作为您的y_pred
来评估阈值预测(即硬类);此外,使用AUC时,请记住一些对许多从业人员而言并不容易理解的限制,这很有用-有关更多详细信息,请参见Getting a low ROC AUC score but a high accuracy中自己回答的最后一部分。
能否给我一些建议,我可以使用哪些指标来评估这种具有“硬”类的多类分类的质量?
最直接的方法是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)
从混淆矩阵中,您可以提取其他数量的兴趣,例如每个类别的真假肯定率-详情,请参见How to get precision, recall and f-measure from confusion matrix in Python中的答案