F1微观与F1宏观的区别与计算
精度和F1-score用于第二分类,精度和宏F1用于多分类。
最近,当使用sklearn进行分类时,使用了度量中评估函数,其中最重要的评估函数之一是F1值。
sklearn中计算f1的函数是f1_score,其中用一个参数平均值来控制F1的计算方法。今天我们就来说说微观和宏观的区别。
1、准确度、精密度、召回率,F1值:
对于二元分类问题,样本可以分为:
真正(TP):真类别为正,预测类别为正。
假阳性(FP):真实类别为阴性,预测类别为阳性。
假阴性(FN):真实类别为阳性,预测类别为阴性。
真负(TN):真类别为负,预测类别为负。
然后,您可以构建一个混淆矩阵,如下表所示。
精度(Acc):
精度,也称为精度(P):
召回率,也称为召回率(R):
F1值:
F1的一般形式:
#二分类
从sklearn.metrics导入精确度分数、精确度分数、召回分数、f1分数
y_true=[0,1,1,0,1,0]
y_pred=[1,1,1,0,0,1]
精度=精度_分数(y _ true,y _ pred) #注意没有平均参数。
精度=精度分数(y_true,y_pred,平均值='二进制')
recall=recall_score(y_true,y_pred,average='binary ')
f1分数=f1分数(y_true,y_pred,average='binary ')
如果只有一个二元混淆矩阵,那么可以用上述指标进行评价,没有争议。但是,当我们综合考察N个二元混淆矩阵上的评价指标时,我们会用到宏观平均和微观平均。
2、F1_score中关于参数average的用法描述和理解:
micro通过计算总的真阳性、假阴性和假阳性来计算全局指标。
Micro':在计算F1之前计算TP、FN和FP的总数。
宏' :计算每个标签的度量,并找到它们的未加权平均值。这没有考虑到标签不平衡。
Macro':分布计算每个类别的F1,然后取平均值(每个类别的F1具有相同的权重)
通过对参数用法的描述,想必大家都能明白他字面上的意思。微观是先计算出所有TP、FN和FP的个数,然后用上面提到的公式计算F1。
宏其实就是先计算每个品类的F1值,然后取平均值。例如,在下面的多分类问题中,有四个类别:1、2、3和4。我们可以先计算1的f 1,2的F1,3的F1,4的F1,然后取平均值(F1 F2 F3 F4)/4。
y_true=[1,1,1,1,1,2,2,2,2,3,3,3,4,4]
y_pred=[1,1,1,0,0,2,2,3,3,3,4,3,4,3]
3.微平均
首先,计算总TP值。这个很好,就是数有多少类别是正确分类的。例如,1在这个类别中有三个正确的点,2有两个,3有两个,4有一个,那么TP=3 2 2 1=8。
其次,计算总FP值。简单地说,不属于某个类别的元素数量被分配给这个类别。例如,不属于上面四个类别的元素之一被分配给四个。
如果你还疑惑的话,我们可以保留4,其他的在计算的时候都改成0,这样我们就可以更清楚的看到4类下的FP数了。其实这个原则就是One-vs-All (OvA),把4看成正范畴,把其他看成负范畴。
因此,micro的精度p为TP/(TP FP)=8/(8 ^ 4)=0.666,召回率R TP/(TP FN)=8/(8 ^ 6)=0.571,因此F1-micro的值为0.6153。
你可以通过sklearn查询,将平均值设置为微。
y_
true = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4]
y_pred = [1, 1, 1, 0, 0, 2, 2, 3, 3, 3, 4, 3, 4, 3]
print(f1_score(y_true,y_pred,labels=[1,2,3,4],average='micro'))
# 0.615384615385
4、宏平均(Macro-averaging)
先在各混淆矩阵上分别计算各类的查准率,查全率和F1,然后再计算平均值。 这样就得到“宏查准率”(macro-P)、“宏查全率”(macro-R)、“宏F1”(macro-F1) 正常最终求得就是“宏F1”
宏查准率
宏查全率
宏F1 (我们要求的就是宏F1,每个类别的F1值的平均)
macro先要计算每一个类的F1,有了上面那个表,计算各个类的F1就很容易了,比如1类,它的精确率P=3/(3+0)=1 召回率R=3/(3+2)=0.6 F1=2*(1*0.5)/1.5=0.75
可以sklearn,来计算核对,把average设置成macro
#average=None,取出每一类的P,R,F1值 p_class, r_class, f_class, support_micro=precision_recall_fscore_support( y_true=y_true, y_pred=y_pred, labels=[1, 2, 3, 4], average=None) print('各类单独F1:',f_class) print('各类F1取平均:',f_class.mean()) #各类单独F1: [ 0.75 0.66666667 0.5 0.5 ] #各类F1取平均: 0.604166666667 #注意这里,输出《宏F》 print(f1_score(y_true,y_pred,labels=[1,2,3,4],average='macro')) #0.604166666667
5、sklearn实现
注意:分类报告最后一行为加权平均值。0.64就是加权平均F1-score
https://blog.csdn.net/baidu_38945893/article/details/82141975
f1_score (y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)
关键参数是 average: string, [None, ‘binary’ (default), ‘micro’, ‘macro’, ‘weighted’, ‘samples’],This parameter is required for multiclass/multilabel targets.
①None:返回每一类各自的f1_score,得到一个array。
②'binary': 只对二分类问题有效,返回由pos_label指定的类的f1_score。
Only report results for the class specified by pos_label. This is applicable only if targets (y_{true,pred}) are binary.
③'micro': 设置average='micro'时,Precision = Recall = F1_score = Accuracy。
注意:这是正确的, 微查准率、微查全率、微F1都等于Accuracy。
下例中为什么不等于因为预测中有几个0,出现错误了。
Note that for “micro”-averaging in a multiclass setting with all labels included will produce equal precision, recall and F_beta.
Calculate metrics globally by counting the total true positives, false negatives and false positives.
④'macro': 对每一类别的f1_score进行简单算术平均(unweighted mean), with assumption that all classes are equally important。
Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.
⑤'weighted': 对每一类别的f1_score进行加权平均,权重为各类别数在y_true中所占比例。
Calculate metrics for each label, and find their average, weighted by support (the number of true instances for each label). This alters ‘macro’ to account for label imbalance; it can result in an F-score that is not between precision and recall.
⑥'samples':Calculate metrics for each instance, and find their average (only meaningful for multilabel classification where this differs from accuracy_score)
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://www.230890.com/zhan/100415.html