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)

相关推荐

  • Linux安装heartbeat 3.0集群源码怎么写

    技术Linux安装heartbeat 3.0集群源码怎么写Linux安装heartbeat 3.0集群源码怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题

    攻略 2021年10月22日
  • ERROR: Maven JVM terminated unexpectedly with exit code 137的解决方法是什么

    技术ERROR: Maven JVM terminated unexpectedly with exit code 137的解决方法是什么这期内容当中小编将会给大家带来有关ERROR: Maven JVM termina

    攻略 2021年10月23日
  • 怎么才能持久,如何才能获得长久的幸福

    技术怎么才能持久,如何才能获得长久的幸福美国著名的心理学家马丁塞利格曼
    说:幸福快乐的人生有三种怎么才能持久。
    第一种,是愉快的人生。
    这样的人生所拥有的快乐多得不能再多了,积极情绪多得不能再多了。学习快乐的技巧,在时间

    生活 2021年10月27日
  • 铁与盐酸反应的化学方程式,铁和盐酸反应的离子方程式

    技术铁与盐酸反应的化学方程式,铁和盐酸反应的离子方程式铁与盐酸反应生成氯化亚铁和氢气,氯化氢、氯化亚铁为强电解质,完全拆成离子形式。离子方程式铁与盐酸反应的化学方程式:Fe+2H+=Fe2++H2↑。铁是比较活泼的金属,

    生活 2021年10月24日
  • 怎么刷抖音粉丝,刷抖音粉丝网站最便宜?

    技术怎么刷抖音粉丝,刷抖音粉丝网站最便宜?抖音便宜刷粉网站,刷抖音粉丝网站最便宜抖音刷粉丝的平台网站搜索应该也很多,价格差异也很大,原因主要是看做单的号的质量,有的机器刷单,有的是真人接单,有的是群派单,还有的是真机养的

    测评 2021年10月20日
  • 月亮思乡的古诗,关于月亮思乡的古诗大全

    技术月亮思乡的古诗,关于月亮思乡的古诗大全【古朗月行】李白小时不识月,呼作白玉盘.又疑瑶台镜,飞在白云端.仙人垂两足,桂树作团团.白兔捣药成,问言与谁餐.
    蟾蜍蚀圆影,大明夜已残.羿昔落九乌,天人清且安.
    阴精此沦惑,去

    生活 2021年10月22日