本节主要了解一下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
下面我将其中一部分重要的内容截下来如下所示: