如何理解分析sklearn.metrics.classification_report()功能?
发布于 作者:苏南大叔 来源:程序如此灵动~本文回顾一下sklearn.metrics
对各种模型的精确度统计功能,即查准率precision_score()
、召回率(查全率)recall_score()
、f1得分f1_score()
。其实还有一个classification_report()
函数,能同时返回上述几个得分值,同时做进一步的均值分析。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程所见所闻。本文测试环境:win10
,python@3.12.0
,pandas@2.1.3
,scikit-learn@1.3.2
。
无论结果是二分类,还是多分类,只要预测值是个一维变量【非二维】,classification_report()
的返回值格式都是一样的。本文的统一适用标准:y_pred
是个一维的变量,非二维!对应到机器学习,就是说是基于一个标签的。
基础数据
数据预测范围限于“单标签二分类”或者“单标签多分类”【类似于鸢尾花数据集】。预测结果是个单标签【例如鸢尾花的归属】。
y_true = [0, 0, 0, 0, 1, 1, 2] # 真实值
y_pred = [0, 0, 1, 0, 1, 2, 2] # 预测结果
print("真实值 :", y_true)
print("预测值 :", y_pred)
import numpy as np
unique, counts = np.unique(y_true, return_counts=True)
_cnt = dict(zip(unique, counts))
for index,key in enumerate(_cnt):
print(f"分类{key}真实数 : {_cnt[key]}")
print("样本总数 :", len(y_pred))
输出:
真实值 : [0, 0, 0, 0, 1, 1, 2]
预测值 : [0, 0, 1, 0, 1, 2, 2]
分类0真实数 : 4
分类1真实数 : 2
分类2真实数 : 1
样本总数 : 7
模型得分项
对于预测结果,分别计算三个模型得分值和准确率(accuracy
)。(主要用于和classification_report()
的结果相互印证)
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
p = precision_score(y_true, y_pred, average=None) # 查准率
r = recall_score(y_true, y_pred, average=None) # 查全率
f1 = f1_score(y_true, y_pred, average=None) # f1得分(f1值越高,模型预测越有价值)
a = accuracy_score(y_true, y_pred) # 准确率
print("precision : ", p)
print("recall : ", r)
print("f1 : ", f1)
print("accuracy : ", a)
输出:
precision : [1. 0.5 0.5]
recall : [0.75 0.5 1. ]
f1 : [0.85714286 0.5 0.66666667]
accuracy : 0.7142857142857143
这里的三个得分指标,如果不传入average=None
的话,得到的就不是数组【范围是全部分类】而是普通的浮点数【范围是分类为1的阳性样本】了。
参考文章:
classification_report()
执行一下这个“报告”函数classification_report
:
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred))
输出:
precision recall f1-score support
0 1.00 0.75 0.86 4
1 0.50 0.50 0.50 2
2 0.50 1.00 0.67 1
accuracy 0.71 7
macro avg 0.67 0.75 0.67 7
weighted avg 0.79 0.71 0.73 7
可见,输出结果分为两部分,第一部分是对三个得分指标的展示,同时输出指标数据的支撑support
数据量。第二部分是对第一部分指标的进一步均分avg
统计。
设置labels标签
把数字分类,都换成好理解的中文标签,实际上就是对分类结果进行了一下解释。
from sklearn.metrics import classification_report
b = classification_report(y_true, y_pred,target_names=['分类'+ str(n) for n in np.array(_cnt.keys()).tolist() ])
# b = classification_report(y_true, y_pred,target_names=['分类0','分类1','分类2'])
print(b)
输出:
precision recall f1-score support
分类0 1.00 0.75 0.86 4
分类1 0.50 0.50 0.50 2
分类2 0.50 1.00 0.67 1
accuracy 0.71 7
macro avg 0.67 0.75 0.67 7
weighted avg 0.79 0.71 0.73 7
support支撑数
实际上就是说:真实结果(并非预测结果)中,属于各个分类的数量总数。
宏平均数(macro avg)
宏平均数,【不考虑】支撑数,其实就是大家所熟知的平均数的概念。例如:
0.67 = (1.00 + 0.50 + 0.50)/3
加权平均数(weighted avg)
加权平均数,就是要【考虑】支撑数。例如:
0.79 = (1.00*4 + 0.50*2 + 0.50*1)/7
结语
这个.classification_report()
功能,就是个加强版的模型得分指标的统计汇总功能。本文是针对“二分类”、“多分类”的.classification_report()
功能进行分析。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。