我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文回顾一下sklearn.metrics对各种模型的精确度统计功能,即查准率precision_score()、召回率(查全率)recall_score()、f1得分f1_score()。其实还有一个classification_report()函数,能同时返回上述几个得分值,同时做进一步的均值分析。

苏南大叔:如何理解分析sklearn.metrics.classification_report()功能? - classification_report
如何理解分析sklearn.metrics.classification_report()功能?(图4-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程所见所闻。本文测试环境:win10python@3.12.0pandas@2.1.3scikit-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

苏南大叔:如何理解分析sklearn.metrics.classification_report()功能? - 统计基本数据
如何理解分析sklearn.metrics.classification_report()功能?(图4-2)

模型得分项

对于预测结果,分别计算三个模型得分值和准确率(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)

苏南大叔:如何理解分析sklearn.metrics.classification_report()功能? - 计算模型得分
如何理解分析sklearn.metrics.classification_report()功能?(图4-3)

输出:

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统计。

苏南大叔:如何理解分析sklearn.metrics.classification_report()功能? - 统计结果
如何理解分析sklearn.metrics.classification_report()功能?(图4-4)

设置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()功能进行分析。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    sklearn