OvR则是每次将一个类的样例作为正例、所有其他类的样例作为反例来训练N个分类器.在测试时若仅有一个分类器预测为正类,则对应的类别标记作为最终分类结果如图3.4所示若有多个分类器预测为正类、则通常考虑分类器的预测置信度,选择置信度最大的类别标记作为分类结果.
容易看出,OvR只需训练N个分类器,而且训练时,OvR的每个分类器均使用全部训练样例,因此,在类别很多时,至于预测性能,则取决于具体的数据分布,在多数情形下两者差不多.
实例分析,数据如下:
一、数据
真实类别:A, A, A, A, B, B, B, C, C
通过OVR预测类别:A, A, B, C, B, B, C, B, C
首先介绍二分类混淆矩阵:
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合分为真正例(true positive)、假正例(false positive)、 真反例(rue negativer假反例(false negative)四种情形,令TP、FP、TN、FN分别表示其对应的样例数,则显然有TP+FP+ TN +FN =样例总数.分类结果的“混淆矩阵如表所示.
查准率:在预测结果正例中,真正例所占比例。
查全率:在真实正例中,预测正例所占比例
查准率和查全率是一对矛盾的度量.上般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低.
根据上图的思想则各个类别的真假阳阴性:
A B C 总计
TP 2 2 1 5
FP 0 2 2 4
FN 2 1 1 4
# 计算各个类别的准确率,召回率,与F1-score
from sklearn.metrics import precision_recall_fscore_support
y_true = [1, 1, 1, 1, 2, 2, 2, 3, 3]
y_pred = [1, 1, 2, 3, 2, 2, 3, 2, 3]
p_class, r_class, f_class, support_micro = precision_recall_fscore_support(y_true,y_pred,labels=[1,2,3])
print(p_class)
print(r_class)
print(f_class)
print(support_micro)
[1. 0.5 0.33333333]
[0.5 0.66666667 0.5 ]
[0.66666667 0.57142857 0.4 ]
[4 3 2]
from sklearn.metrics import f1_score
y_true = [1, 1, 1, 1, 2, 2, 2, 3, 3]
y_pred = [1, 1, 2, 3, 2, 2, 3, 2, 3]
f1_macro = f1_score(y_true,y_pred,average='macro')
print('f1_macro: {0}'.format(f1_macro))
f1_macro: 0.546031746031746
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
# 预测分类结果
y_pred = clf.predict(X_test)
# 你可以打印一下预测结果和分类结果
print("y_test: ", y_test)
print("y_pred: ", y_pred)
# 得到混淆矩阵(confusion matrix,简称cm)
# confusion_matrix 需要的参数:y_true(真实标签),y_pred(预测标签)
cm = confusion_matrix(y_true=y_test, y_pred=y_pred)
# 打印混淆矩阵
print("Confusion Matrix: ")
print(cm)
# 画出混淆矩阵
# ConfusionMatrixDisplay 需要的参数: confusion_matrix(混淆矩阵), display_labels(标签名称列表)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)
disp.plot()
plt.show()