利用classification_report()评价多样本多特征二分类预测值
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔使用新的样本变量,再次分析sklearn.metrics.classification_report()
的模型预测得分报告功能。常见的情况下,输入的变量是一维的数据,它的返回值是accuracy
+macro avg
+weighted avg
。本文输入的是二维的多样本多特征变量,它的返回值是有所不同的。返回值是macro avg
+weighted avg
+micro avg
+samples avg
。那么,如何理解新的数据输出项目呢?这就是本文的主要讨论的内容。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程故事。本文测试环境:win10
,python@3.12.0
,pandas@2.1.3
,scikit-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]])
这里仅仅特别说明对这些数据的理解。这里的二维变量,和上面的一维变量理解是不同的,需要做一下顺时针旋转理解。上面的数据里面,表述的是:
- 两个样本(两行数据)。
- 五个特征(五列数据)。
- 每个特征(每列)里面,都有两种数据
0
和1
,属于【二分类】。
【情况三】:如果变成“多样本”+“多特征”+【多分类】的二维变量,会报错。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 avg
和samples 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
显然表述的是第几个特征,而不是每个特征里面的分类标签【重大不同】。
precision
precision
查准率,查出来的目标中,真目标所占比率。
- 第一个特征,第一列数据,预测阳性数1,真实数1,100%。
- 第二个特征,第二列数据,预测阳性数1,真实数1,100%。
- 第三个特征,第三列数据,预测阳性数1,真实数0,0%。
- ...
recall
recall
查全率,应该被查出来的目标中,真目标所占比率。
- 第一个特征,第一列数据,应该被查出来数1,真实数1,100%。
- ...
- 第四个特征,第四列数据,应该被查出来数2,真实数1,50%。
- ...
support
先来解读一下其中的support
,即如图所示的第一部分。
0,1,2,3,4
后面的support
表述的是,在真实特征列中有几个阳性数据,即【TP】或者【FP】的数据计数。- 四个
avg
后面的support
表述的就是:上述support
之和,也就是说avg
统计的范围是:【TP+FP】。
macro avg 和 weighted avg
macro avg
和weighted avg
的统计对象是:其数据上方的数据。
macro avg
是宏平均,也就是大家所基础的理解方式。本文里面特别好理解:
比如precision
的macro avg
:(1+1+0+1+0.5)/5=0.7
weighted avg
是加权平均,它是上方数据和support
共同作用的结果:
比如recall
的weighted avg
:(11+11+01+0.52+1*1)/6=0.67
微平均 micro avg
微平均micro avg
的统计对象是:样本,所以要抛弃上一组average
的思路。虽然位于对应数据的下方,但是它没有任何的直接关联。它的计算方法:
precision
的micro 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
recall
的micro 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
f1
的micro avg
,2 * p * r / (p + r)
。所以,20.670.67/(0.67+0.67) = 0.67。
样本平均 samples avg
样本平均samples avg
,针对样本,首先对每一个样本计算precision、recall指标然后对样本进行平均。
precision
的samples 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
recall
的samples 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
的经验文章,请参考苏南大叔的博客文章列表:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。