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

苏南大叔使用新的样本变量,再次分析sklearn.metrics.classification_report()的模型预测得分报告功能。常见的情况下,输入的变量是一维的数据,它的返回值是accuracy+macro avg+weighted avg。本文输入的是二维的多样本多特征变量,它的返回值是有所不同的。返回值是macro avg+weighted avg+micro avg+samples avg。那么,如何理解新的数据输出项目呢?这就是本文的主要讨论的内容。

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - classification_report-2
利用classification_report()评价多样本多特征二分类预测值(图8-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程故事。本文测试环境:win10python@3.12.0pandas@2.1.3scikit-learn@1.3.2

前文回顾/一维输入

【情况一】:普通情况下,输入项目是个二分类或者多分类的一维变量。

y_true = [0, 0, 0, 0, 1, 1, 2]           # 真实值
y_pred = [0, 0, 1, 0, 1, 2, 2]           # 预测结果

这是个横向排列多分类(0,1,2)的情况。【注意这里的特征分类值是横向排列的】参考文章:

这里表述的是:

  • 七个样本【七列数据】
  • 三个标签【有0/1/2三种取值】,属于【多分类】。
  • 如果是【二分类】的话,也是可以处理的,不影响结论。

二维输入

【情况二】:本文中输入项目是个“多样本”+“多特征”+“二分类”的二维变量。
数据类型是ndarray,还是list,并不重要。因为他们都属于array-like类型。

import numpy as np
y_true = np.array([[1, 0, 1, 1, 0],
                   [0, 1, 0, 1, 1]])
y_pred = np.array([[1, 0, 0, 1, 1],
                   [0, 1, 1, 0, 1]])

这里仅仅特别说明对这些数据的理解。这里的二维变量,和上面的一维变量理解是不同的,需要做一下顺时针旋转理解。上面的数据里面,表述的是:

  • 两个样本(两行数据)。
  • 五个特征(五列数据)。
  • 每个特征(每列)里面,都有两种数据01,属于【二分类】。

【情况三】:如果变成“多样本”+“多特征”+【多分类】的二维变量,会报错。
sklearn.metrics.classification_report()无法处理“multiclass-multioutput”的情况。(其实就是多了第三个分类2的情况)。

# 这是个错误的数据,无法处理
y_true = [[1, 0, 2], [0, 1, 0]])
y_pred = [[1, 0, 0], [0, 1, 1]])

报错输出:

ValueError: multiclass-multioutput is not supported

输出项预览

代码还一样,但是输出值却有了比较大的变化,没有了精确值accuracy,多了micro avgsamples avg

from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred, digits=5))

输出:

              precision    recall  f1-score   support
           0    1.00000   1.00000   1.00000         1
           1    1.00000   1.00000   1.00000         1
           2    0.00000   0.00000   0.00000         1
           3    1.00000   0.50000   0.66667         2
           4    0.50000   1.00000   0.66667         1

   micro avg    0.66667   0.66667   0.66667         6
   macro avg    0.70000   0.70000   0.66667         6
weighted avg    0.75000   0.66667   0.66667         6
 samples avg    0.66667   0.66667   0.66667         6

对比一维的时候的输出项目,二维数据输入的输出,这里的行0,1,2,3,4显然表述的是第几个特征,而不是每个特征里面的分类标签【重大不同】。

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - 数据结果
利用classification_report()评价多样本多特征二分类预测值(图8-2)

precision

precision查准率,查出来的目标中,真目标所占比率。

  • 第一个特征,第一列数据,预测阳性数1,真实数1,100%。
  • 第二个特征,第二列数据,预测阳性数1,真实数1,100%。
  • 第三个特征,第三列数据,预测阳性数1,真实数0,0%。
  • ...

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - report-查准率
利用classification_report()评价多样本多特征二分类预测值(图8-3)

recall

recall查全率,应该被查出来的目标中,真目标所占比率。

  • 第一个特征,第一列数据,应该被查出来数1,真实数1,100%。
  • ...
  • 第四个特征,第四列数据,应该被查出来数2,真实数1,50%。
  • ...

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - report-查全率
利用classification_report()评价多样本多特征二分类预测值(图8-4)

support

先来解读一下其中的support,即如图所示的第一部分。

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - report-support
利用classification_report()评价多样本多特征二分类预测值(图8-5)

  • 0,1,2,3,4后面的support表述的是,在真实特征列中有几个阳性数据,即【TP】或者【FP】的数据计数。
  • 四个avg后面的support表述的就是:上述support之和,也就是说avg统计的范围是:【TP+FP】。

macro avg 和 weighted avg

macro avgweighted avg的统计对象是:其数据上方的数据。

macro avg是宏平均,也就是大家所基础的理解方式。本文里面特别好理解:
比如precisionmacro avg:(1+1+0+1+0.5)/5=0.7

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - report-p-r
利用classification_report()评价多样本多特征二分类预测值(图8-6)

weighted avg是加权平均,它是上方数据和support共同作用的结果:
比如recallweighted avg:(11+11+01+0.52+1*1)/6=0.67

微平均 micro avg

微平均micro avg的统计对象是:样本,所以要抛弃上一组average的思路。虽然位于对应数据的下方,但是它没有任何的直接关联。它的计算方法:

precisionmicro avg,每一个【样本(横向数据)】里面,所有样本的TP加起来除以所有类别(TP+FP)。

  • 第一个样本,TP(真1测1)计数2,FP(真0测1)计数1。
  • 第二个样本,TP(真1测1)计数2,FP(真0测1)计数1。
  • (2+2)/((2+1)+(2+1)) = 0.67

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - report-micro-avg
利用classification_report()评价多样本多特征二分类预测值(图8-7)

recallmicro avg,每一个【样本(横向数据)】里面,所有样本的TP加起来除以所有类别(TP+FN)。

  • 第一个样本,TP(真1测1)计数2,FN(真1测0)计数1。
  • 第二个样本,TP(真1测1)计数2,FN(真1测0)计数1。
  • (2+2)/((2+1)+(2+1)) = 0.67

f1micro avg2 * p * r / (p + r)。所以,20.670.67/(0.67+0.67) = 0.67。

样本平均 samples avg

样本平均samples avg,针对样本,首先对每一个样本计算precision、recall指标然后对样本进行平均。

precisionsamples avg,每一个【样本(横向数据)】里面,(TP/(TP+FP)+ ... +TP/(TP+FP))/N 。

  • 第一个样本,TP(真1测1)计数2,FP(真0测1)计数1,P1=2/3=0.67。
  • 第二个样本,TP(真1测1)计数2,FP(真0测1)计数1,P2=2/3=0.67。
  • (2/3+2/3)/2 = (0.67+0.67)/2 = 0.67

苏南大叔:利用classification_report()评价多样本多特征二分类预测值 - report-samples-avg
利用classification_report()评价多样本多特征二分类预测值(图8-8)

recallsamples avg,每一个【样本(横向数据)】里面,(TP/(TP+FN)+ ... +TP/(TP+FN))/N 。

  • 第一个样本,TP(真1测1)计数2,FN(真1测0)计数1,R1=2/3=0.67。
  • 第二个样本,TP(真1测1)计数2,FP(真0测1)计数1,R2=2/3=0.67。
  • (2/3+2/3)/2 = (0.67+0.67)/2 = 0.67

结语

更多机器学习sklearn的经验文章,请参考苏南大叔的博客文章列表:

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

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

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

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