如何获得实际值预测值的混淆矩阵?快速获得TP/FP值
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文主要讨论目标还是在sklearn.metrics
里面,里面有个非常高大上的名词,叫做“混淆矩阵”(confusion_matrix
)。那么,混淆矩阵是做什么用的呢?它的值可以表述什么样的问题呢?这就是本文中,苏南大叔将要谈论的问题。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程故事。本文测试环境:win10
,python@3.12.0
,pandas@2.1.3
,scikit-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]]
混淆矩阵含义
举例数据里面,有三个类。按着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
,就是一列一列的看。看TN
和FN
实际就看另外的两列。
- 对于
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。
计算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)
计算一下:
- 对于
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
经验文章,请参考:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。