对于多标签分类的评价指标比较复杂,一般对于n个二分类混淆矩阵要引入宏平均、微平均、权重评价即Macro-average、Micro-Average,Weighted-Average,近期正好应用,所以就总结一下。
Macro-averaging:指所有类别的每一个统计指标值的算数平均值,则对应的macro F1为多个F1值的算数平均数。
Micro-averaging:将各个混淆矩阵对应元素平均,得到TP、FP、TN、FN,然后计算相应的平均值。
weighted-F1:在样本不平衡的时候,有时我们希望根据每个类别的样本数量,给不同的类赋予不同的权重。
下面先给出F1相关的指标公式:
python 中可以导入包计算
print f1_score(test_labels, preds, average='macro')
print f1_score(test_labels, preds, average='micro')
print f1_score(test_labels, preds, average='weighted')
来一个例子:
y_true=[0,1,2,0,1,2]
y_pred=[0,2,1,0,0,1]
macro:
A:以label 0作为正类,label 1和label 2作为负类, 所对应的TP FN FP TN如下表:
T\P | positive | negative |
True | 2(TP) | 0(FN) |
False | 1(FP) | 3(TN) |
则:P=2/(2+1)=2/3
R=2/(2+0)=1
F1=(P * R * 2) / (P + R) = 0.8
B:以label 1作为正类,label 0和label 2作为负类, 所对应的TP FN FP TN如下表:
T\P | positive | negative |
True | 0(TP) | 2(FN) |
False | 2(FP) | 2(TN) |
则:
P=0/(0+2)=0
R=0/(0+2)=0
F1=(P * R * 2) / (P + R) = 0
C:以label 2作为正类,label 0和label 1作为负类, 所对应的TP FN FP TN如下表
T\P | positive | negative |
True | 0(TP) | 2(FN) |
False | 1(FP) | 4(TN) |
则:
P=0/(0+1)=0
R=0/(0+2)=0
F1=(P * R * 2) / (P + R) = 0
Macro-F1=(0.8+0+0)/3=0.26
Micro-F1:
将三个表格中的所有TP相加,得到总TP = 2 + 0 + 0 = 2
将三个表格中的所有FN相加,得到总FN = 0 + 2 + 2 = 4
将三个表格中的所有FP相加,得到总FP = 1 + 2 + 1 = 4
总P = 总TP / (总TP + 总FP) = 2 / (2 + 4) = 1 / 3
总R = 总TP / (总TP + 总FN) = 2 / (2 + 4) = 1 / 3
Micro-F1= (总P * 总R * 2) / (总P + 总R) = 1 / 3 = 0.33
另外看到一个宏平均和微平均的对比:
更新,看到一个代码,很全
from sklearn import metrics
y_test = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4]
y_predict = [1, 1, 1, 3, 3, 2, 2, 3, 3, 3, 4, 3, 4, 3]
print('准确率:', metrics.accuracy_score(y_test, y_predict)) #预测准确率输出
print('宏平均精确率:',metrics.precision_score(y_test,y_predict,average='macro')) #预测宏平均精确率输出
print('微平均精确率:', metrics.precision_score(y_test, y_predict, average='micro')) #预测微平均精确率输出
print('加权平均精确率:', metrics.precision_score(y_test, y_predict, average='weighted')) #预测加权平均精确率输出
print('宏平均召回率:',metrics.recall_score(y_test,y_predict,average='macro'))#预测宏平均召回率输出
print('微平均召回率:',metrics.recall_score(y_test,y_predict,average='micro'))#预测微平均召回率输出
print('加权平均召回率:',metrics.recall_score(y_test,y_predict,average='micro'))#预测加权平均召回率输出
print('宏平均F1-score:',metrics.f1_score(y_test,y_predict,labels=[1,2,3,4],average='macro'))#预测宏平均f1-score输出
print('微平均F1-score:',metrics.f1_score(y_test,y_predict,labels=[1,2,3,4],average='micro'))#预测微平均f1-score输出
print('加权平均F1-score:',metrics.f1_score(y_test,y_predict,labels=[1,2,3,4],average='weighted'))#预测加权平均f1-score输出
print('混淆矩阵输出:\n',metrics.confusion_matrix(y_test,y_predict,labels=[1,2,3,4]))#混淆矩阵输出
print('分类报告:\n', metrics.classification_report(y_test, y_predict,labels=[1,2,3,4]))#分类报告输出
输出:
准确率: 0.571428571429
宏平均精确率: 0.696428571429
微平均精确率: 0.571428571429
加权平均精确率: 0.775510204082
宏平均召回率: 0.566666666667
微平均召回率: 0.571428571429
加权平均召回率: 0.571428571429
宏平均F1-score: 0.579166666667
微平均F1-score: 0.571428571429
加权平均F1-score: 0.615476190476
混淆矩阵输出:
[[3 0 2 0]
[0 2 2 0]
[0 0 2 1]
[0 0 1 1]]
分类报告:
precision recall f1-score support
1 1.00 0.60 0.75 5
2 1.00 0.50 0.67 4
3 0.29 0.67 0.40 3
4 0.50 0.50 0.50 2
avg / total 0.78 0.57 0.62 14
https://blog.csdn.net/lyb3b3b/java/article/details/84819931