混沌矩阵中如何选择F1-score

F1-score
F1分数(F1-score)是分类问题的一个衡量指标。一些多分类问题的机器学习竞赛,常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数,最大为1,最小为0。

1、weight-F1
这种方式是在macro-F1的基础上考虑到类别不平衡的问题,假设有三类,样本数分别为c1,c2和c3,那么每一类的权重分别为ci/(c1+c2+c3),则precision的计算方式是每个类别的precision和其权重的加权平均,recall也同理,F1则直接由precision和recall计算得到。
2、micro-F1
这种方式是以样本为基本单位,直接根据公式计算全局的precision和recall,
3、指标的选择问题
从计算公式来看,micro-F1依赖于每个类别的识别准确度,而对于那些样本比较小的类别,可能会拉高precision,所以类别不平衡时用这个指标不怎么合适。在这篇文章:分类问题的评估指标一览——老宋的茶书会,中给出了类别不均衡带来的指标影响,以及指标选择的结论,部分如下:

“我们看到,对于 Macro 来说, 小类别相当程度上拉高了 Precision 的值,而实际上, 并没有那么多样本被正确分类,考虑到实际的环境中,真实样本分布和训练样本分布相同的情况下,这种指标明显是有问题的, 小类别起到的作用太大,以至于大样本的分类情况不佳。 而对于 Micro 来说,其考虑到了这种样本不均衡的问题, 因此在这种情况下相对较佳。

总的来说, 如果你的类别比较均衡,则随便; 如果你认为大样本的类别应该占据更重要的位置, 使用Micro; 如果你认为小样本也应该占据重要的位置,则使用 Macro; 如果 Micro << Macro , 则意味着在大样本类别中出现了严重的分类错误; 如果 Macro << Micro , 则意味着小样本类别中出现了严重的分类错误。

为了解决 Macro 无法衡量样本均衡问题,一个很好的方法是求加权的 Macro, 因此 Weighed F1 出现了。

示例程序:

from sklearn.metrics import f1_score
 
y_pred = [0, 1, 1, 1, 2, 2]
y_true = [0, 1, 0, 2, 1, 1]
 
print(f1_score(y_true, y_pred, average='macro'))  
print(f1_score(y_true, y_pred, average='weighted'))  

分析上述代码,

对于类0:TP=1,FP=0,FN=1,precision=1,recall=1/2,F1-score=2/3,Weights=1/3

对于类1:TP=1,FP=2,FN=2,precision=1/3,recall=1/3,F1-score=1/3,Weights=1/2

对于类2:TP=0,FP=2,FN=1,precision=0,recall=0,F1-score=0,Weights=1/6

宏平均分数为:0.333;加权平均分数为:0.389

你可能感兴趣的:(机器学习入门,python,机器学习)