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

本文主要讨论目标还是在sklearn.metrics里面,里面有个非常高大上的名词,叫做“混淆矩阵”(confusion_matrix)。那么,混淆矩阵是做什么用的呢?它的值可以表述什么样的问题呢?这就是本文中,苏南大叔将要谈论的问题。

苏南大叔:如何获得实际值预测值的混淆矩阵?快速获得TP/FP值 - 混淆矩阵
如何获得实际值预测值的混淆矩阵?快速获得TP/FP值(图5-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程故事。本文测试环境:win10python@3.12.0pandas@2.1.3scikit-learn@1.3.2。本文表面上说的是求混淆矩阵的事情,实际上是个快速求TP/FP的事情。

什么是混淆矩阵

在机器学习中, 混淆矩阵是一个误差矩阵, 常用来可视化地评估监督学习算法的性能. 混淆矩阵大小为 (n_classes, n_classes) 的方阵, 其中n_classes表示类的数量。这个矩阵的每一行表示真实类中的实例, 而每一列表示预测类中的实例。

代码测试

“混淆矩阵”定义总是让人听得头大,下面用代码实例来看看效果。

from sklearn.metrics import confusion_matrix
y_true = ["fox","cat","fox","fox","fox","fox","cat", "dog", "dog", "cat", "cat"]
y_pred = ["dog","fox","dog","cat","fox","dog","dog", "dog", "fox", "cat", "dog"]
print(confusion_matrix(y_true, y_pred))

输出:

[[1 2 1]
 [0 1 1]
 [1 3 1]]

苏南大叔:如何获得实际值预测值的混淆矩阵?快速获得TP/FP值 - 混淆矩阵结果
如何获得实际值预测值的混淆矩阵?快速获得TP/FP值(图5-2)

混淆矩阵含义

举例数据里面,有三个类。按着unicode编码顺序依次为cat/dog/fox。混淆矩阵就是这三个类的混合体,再次具象化。

            [pred] [pred] [pred]
            cat    dog    fox   
[true] cat   1     2    1
[true] dog   0     1    1
[true] fox   1     3    1

TP表示:预测为目标类,实际也为目标类。
FP表示:预测为目标类,实际并不是目标类。
TN表示:预测不是目标类,实际上也不是目标类。
FN表示:预测不是目标类,但实际上是目标类。

苏南大叔:如何获得实际值预测值的混淆矩阵?快速获得TP/FP值 - 混淆矩阵结果-cat
如何获得实际值预测值的混淆矩阵?快速获得TP/FP值(图5-3)

所以,看TPFP,就是一列一列的看。看TNFN实际就看另外的两列。

  • 对于cat,TP就是1,FP=0+1=1。TN=1+1+3+1=6,FN=2+1=3。
  • 对于dog,TP就是1,FP=2+3=5。TN=1+1+1+1=4,FN=0+1=1。
  • 对于fox,TP就是1,FP=1+1=2。TN=1+2+0+1=4,FN=1+3=4。

苏南大叔:如何获得实际值预测值的混淆矩阵?快速获得TP/FP值 - 混淆矩阵结果-dog
如何获得实际值预测值的混淆矩阵?快速获得TP/FP值(图5-4)

计算precision和recall

下面来验证上面的分析对不对。参考文章:

from sklearn.metrics import precision_score,recall_score
p = precision_score(y_true, y_pred, average=None) 
print(p)   #  [0.5        0.16666667 0.33333333]
r = recall_score(y_true, y_pred, average=None) 
print(r)   #  [0.25 0.5  0.2 ]

公式:

  • precision_score = TP/(TP+FP)
  • recall_score = TP/(TP+FN)

苏南大叔:如何获得实际值预测值的混淆矩阵?快速获得TP/FP值 - 混淆矩阵结果-fox
如何获得实际值预测值的混淆矩阵?快速获得TP/FP值(图5-5)

计算一下:

  • 对于cat,p=1/(1+1)=0.5,r=1/(1+3)=0.25
  • 对于dog,p=1/(1+5)=0.16,r=1/(1+1)=0.5
  • 对于fox,p=1/(1+2)=0.33,r=1/(1+4)=0.2

验证成功!

结语

苏南大叔的更多sklearn经验文章,请参考:

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

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

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

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