F1-micro 与 F1-macro区别和计算

技术F1-micro 与 F1-macro区别和计算 F1-micro 与 F1-macro区别和计算二分类使用Accuracy和F1-score,多分类使用Accuracy和宏F1。
最近在使用skl

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

(0)

相关推荐

  • Sun的新Java脚本语言是什么

    技术Sun的新Java脚本语言是什么本篇文章给大家分享的是有关Sun的新Java脚本语言是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

    攻略 2021年12月2日
  • c++和Python哪个好(g++工程师工资)

    技术Idea SpringMVC+Spring+MyBatis+Maven怎么使用本篇内容介绍了“Idea SpringMVC+Spring+MyBatis+Maven怎么使用”的有关知识,在实际案例的操作过程中,不少人

    攻略 2021年12月14日
  • SQL如何实现增删改查

    技术SQL如何实现增删改查这篇文章给大家分享的是有关SQL如何实现增删改查的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SQL 是用于访问和处理数据库的标准的计算机语言。注意哟,SQL是一门语

    攻略 2021年12月1日
  • 自制柚子茶,家庭自制蜂蜜柚子茶要怎么做

    技术自制柚子茶,家庭自制蜂蜜柚子茶要怎么做在冬天这个时候,是吃柚子的最佳时节,柚子皮具有很好的清热去火功能,并且柚子皮在擦拭水龙头等厨具上面还可以很好的清洁污渍,所以小编的柚子皮都是充分利用的,最喜欢的就是用它来做蜂蜜柚

    生活 2021年10月28日
  • Hibernate会话工厂怎么建立

    技术Hibernate会话工厂怎么建立这篇文章主要讲解了“Hibernate会话工厂怎么建立”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate会话工厂怎么建

    攻略 2021年12月4日
  • 如何进行Nginx静态文件服务器搭建及怎么解析autoindex模块

    技术如何进行Nginx静态文件服务器搭建及怎么解析autoindex模块这期内容当中小编将会给大家带来有关如何进行Nginx静态文件服务器搭建及怎么解析autoindex模块,文章内容丰富且以专业的角度为大家分析和叙述,

    攻略 2021年10月29日