一、引言
在深度学习中,分类任务评价指标是很重要的,一个好的评价指标对于训练一个好的模型极其关键;如果评价指标不对,对于任务而言是没有意义的。
一般都是用准确率来作为评价指标,然而对于类别不均衡的任务来说,或者在任务中某一个类的准确率非常重要。如果再使用单纯的准确率肯定是不合理的,对任务来说 没有意义。所以我们需要一个好的评价指标来。目前一般都是用精准率,召回率,F1分数来评价模型;
在sklearn中有自动生成这些指标的的工具,就是 sklearn.metrics.classification_report模块
二、sklearn.metrics.classification_report模块使用
sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False)
参数:y_true: 类别的真实标签值,类标签的列表
y_pred: 预测值的标签,类标签的列表
labels: 报告中要包含的标签索引的可选列表;这个参数一般不需要设置(如果要设置,比如200个类别,那么就应该如此设置:lable= range(200); 然后在sklearn.metrics.classification_report中将labels=label),可是有的时候不设置就会出错,之所以会出错是因为:比如你总共的类别为200个类,但是,你的测试集中真实标签包含的类别只有199个,有一个类别缺失数据,如果不设置这个参数就会报错;
target_name: 与标签匹配的名称,就是一个字符串列表,在报告中显示;也即是显示与labels对应的名称
sample_weight:设置权重的参数,一般不用,需要就可以用;
digits:这个参数是用来设置你要输出的格式位数,就是几位有效数字吧,大概就是这个意思,即指定输出格式的精确度;
output_dict:我一般不用,好像没啥用;如果为True,则将输出作为dict返回
三、classification_report 的指标分析
>>> from sklearn.metrics import classification_report
>>> y_true = [0, 1, 2, 2, 2]
>>> y_pred = [0, 0, 2, 2, 1]
>>> target_names = ['class 0', 'class 1', 'class 2']
>>> print(classification_report(y_true, y_pred, target_names=target_names))
precision recall f1-score support
class 0 0.50 1.00 0.67 1
class 1 0.00 0.00 0.00 1
class 2 1.00 0.67 0.80 3
micro avg 0.60 0.60 0.60 5
macro avg 0.50 0.56 0.49 5
weighted avg 0.70 0.60 0.61 5
在这个报告中:
- y_true 为样本真实标签,y_pred 为样本预测标签;
- support:当前行的类别在测试数据中的样本总量,如上表就是,在class 0 类别在测试集中总数量为1;
- precision:精度=正确预测的个数(TP)/被预测正确的个数(TP+FP);人话也就是模型预测的结果中有多少是预测正确的
- recall:召回率=正确预测的个数(TP)/预测个数(TP+FN);人话也就是某个类别测试集中的总量,有多少样本预测正确了;
- f1-score:F1 = 2*精度*召回率/(精度+召回率)
- micro avg:计算所有数据下的指标值,假设全部数据 5 个样本中有 3 个预测正确,所以 micro avg 为 3/5=0.6
- macro avg:每个类别评估指标未加权的平均值,比如准确率的 macro avg,
(0.50+0.00+1.00)/3=0.5
- weighted avg:加权平均,就是测试集中样本量大的,我认为它更重要,给他设置的权重大点;比如第一个值的计算方法,
(0.50*1 + 0.0*1 + 1.0*3)/5 = 0.70
结束!