机器学习之分类问题的评估指标2---准确率、精确率、召回率以及F1值

本节主要了解一下sklearn.metrics下计算准确率、精确率、召回率和F1值的函数以及对于多分类问题计算时的理解

1、sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
normalize:bool型值,默认为True;如果为False,则表示正确分类的样本数

2、klearn.metrics.recall_score(y_true, y_pred, labels=None, pos_label=1,average=’binary’, sample_weight=None)
     klearn.metrics.precision_score(y_true, y_pred, labels=None, pos_label=1,average=’binary’, sample_weight=None) 
     klearn.metrics.f1_score(y_true, y_pred, labels=None, pos_label=1,average=’binary’, sample_weight=None) 
labels:多类问题时候的标签集,可以去掉一些存在的标签,比如忽略掉多数负样例的多类平均值。
pos_label:str或int。如果是二分类,用于指定的类(0或1);如果是多分类或多标签,通常会忽略,但如果设置pos_label=关心的类和average!=‘binary’时,则返回该标签的分数。
average : string, [None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]
                 当应用于多类或多标签问题时,需要设置这些参数
                1)默认值为binary,计算指定的pos_label的结果,用于二分类问题
                2)None:返回每个类的分数
                3)micro:微平均---通过计算总的TP、FN和FP来计算指标(常用)
                4)macro:宏平均---通过计算各个类的TP、FN和FP然后求平均来计算指标(不会考虑标签的不平衡性)
                5)weighted:加权平均---按每个标签的真实实例数来加权(考虑标签不平衡问题,同时它可能导致F不在P和R之间)
                5)samples:计算每个实例的指标,并找出它们的平均值(仅对多标签分类有意义)
返回值:如果average=None,返回一个float型的数组,长度为标签数目;否则返回一个float值

3、sklearn.metrics.fbeta_score(y_true, y_pred, beta, labels=None, pos_label=1, average=’binary’, sample_weight=None)
sklearn.metrics.precision_recall_fscore_support(y_true, y_pred, beta=1.0, labels=None, pos_label=1, average=None, sample_weight=None)
比其它多了一个beta参数,主要用于调节P和R的重要性,默认为1,代表P和R同等重要。

下面看代码实现:

from sklearn.metrics import accuracy_score,recall_score,precision_score,f1_score,precision_recall_fscore_support

y_true = [0, 1, 2, 1, 1, 1, 2, 2]
y_pred = [0, 2, 1, 1, 0, 1, 2, 1]
print(accuracy_score(y_true, y_pred)) #0.5
print(accuracy_score(y_true, y_pred,normalize=False)) #4
#1)average=None计算每个类的分数
print(precision_score(y_true, y_pred, average=None)) 
print(recall_score(y_true, y_pred, average=None)) 
print(f1_score(y_true, y_pred, average=None)) 
print(fbeta_score(y_true, y_pred, beta=0.5,average='macro')) 
print(precision_recall_fscore_support(y_true, y_pred, average=None))
print(precision_recall_fscore_support(y_true, y_pred, beta=0.5,average='macro')) 

结果如下:
1)None:[ 0.5  0.5  0.5]                                          #1/2   2/4  1/2
                  [ 1.          0.5         0.33333333]               #1/1   2/4  1/3
                  [ 0.66666667  0.5         0.4       ]             
                 (array([ 0.5,  0.5,  0.5]), array([ 1.        ,  0.5       ,  0.33333333]), array([ 0.66666667,  0.5       ,  0.4       ]), array([1, 4, 3], dtype=int64))
2)‘micro’:0.5                                                         #4/8
                   0.5                                                         #4/8
                   0.5                                                         #2*0.5*0.5/(0.5+0.5)
                   (0.5, 0.5, 0.5, None)

3)'macro':0.5                                                       #(1/2+2/4+1/2)/3
                    0.611111111111                                  #(1/1+2/4+1/3)/3
                    0.522222222222                                  #[(2*0.5*1/1.5)+(2*0.5*0.5/1)+(2*0.5*0.3/0.8)]/3
                    (0.5, 0.61111111111111105, 0.50336700336700335, None)    
                    (0.5, 0.61111111111111105, 0.52222222222222214, None)
                    (0.5, 0.61111111111111105, 0.50336700336700335, None)    
                    #F1=[(1.25*0.5*1/(0.25*0.5+1))+(1.25*0.5*0.5/(0.25*0.5+0.5))+(1.25*0.5*0.3)/(0.25*0.5+0.3)]/3

4)'weighted':0.5                                                   #[(1/2*1)+(2/4*4)+(1/2*3)]/8
                        0.5                                                    #[(1/1*1)+(2/4*4)+(1/3*3)]/8
                        0.483333333333                              #[(2*0.5*1/1.5)*1+(2*0.5*0.5/1)*4+(2*0.5*0.3/0.8)*3]/8
                       (0.5, 0.5, 0.48333333333333334, None)    

5)'samples' :主要解决多标签问题,这部分有时间再补充!

对多类问题,可能需要去除'Negative Class';同理,在做宏平均运算时,即使有些标签在样本中并不存在,但还是要参与计算。

y_true = [0, 1, 2, 1, 1, 1, 2, 2, 3]
y_pred = [0, 2, 1, 1, 0, 1, 2, 1, 0]
print(recall_score(y_true, y_pred, labels=[1, 2, 3], average='micro'))
print(precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro'))

结果为:0.375                     #3/8
              0.333333333333   #(1/3+2/4+1/2)/4

附上一个链接,对于average=“ ”的各种计算说明的很清楚:
http://scikit-learn.org/stable/modules/model_evaluation.html#precision-recall-f-measure-metrics
下面我将其中一部分重要的内容截下来如下所示:
机器学习之分类问题的评估指标2---准确率、精确率、召回率以及F1值_第1张图片

机器学习之分类问题的评估指标2---准确率、精确率、召回率以及F1值_第2张图片

               

你可能感兴趣的:(Machine,Learning)