Python sklearn预测评估指标混淆矩阵计算示例详解
作者:fanstuck 发布时间:2023-12-19 23:39:21
前言
很多时候需要对自己模型进行性能评估,对于一些理论上面的知识我想基本不用说明太多,关于校验模型准确度的指标主要有混淆矩阵、准确率、精确率、召回率、F1 score。另外还有P-R曲线以及AUC/ROC,这些我都有写过相应的理论和具体理论过程:
机器学习:性能度量篇-Python利用鸢尾花数据绘制ROC和AUC曲线
机器学习:性能度量篇-Python利用鸢尾花数据绘制P-R曲线
这里我们主要进行实践利用sklearn快速实现模型数据校验,完成基础指标计算。
混淆矩阵
查准率(precision)与查全率(recall)是对于需求在信息检索、Web搜索等应用评估性能度量适应度高的检测数值。对于二分类问题,可将真实类别与算法预测类别的组合划分为真正例(ture positive)、 * 例(false positive)、真反例(true negative)、假反例(false negative)四种情形。显然TP+FP+TN+FN=样例总数。分类结果为混淆矩阵:
以分类模型中最简单的二分类为例,对于这种问题,我们的模型最终需要判断样本的结果是0还是1,或者说是positive还是negative。 因此,我们就能得到这样四个基础指标,我称他们是一级指标(最底层的):
真实值是positive,模型认为是positive的数量(True Positive=TP)
真实值是positive,模型认为是negative的数量(False Negative=FN):这就是统计学上的第二类错误(Type II Error)
真实值是negative,模型认为是positive的数量(False Positive=FP):这就是统计学上的第一类错误(Type I Error)
真实值是negative,模型认为是negative的数量(True Negative=TN)
预测性分类模型,肯定是希望越准越好。那么,对应到混淆矩阵中,那肯定是希望TP与TN的数量大,而FP与FN的数量小。所以当我们得到了模型的混淆矩阵后,就需要去看有多少观测值在第二、四象限对应的位置,这里的数值越多越好;反之,在第一、三象限对应位置出现的观测值肯定是越少越好。
python代码
混淆矩阵一般来说可以有三种实现展示方法,需要前置计算出混淆矩阵数据,这一点使用sklearn就可以实现:
from sklearn.metrics import confusion_matrix
y_true =df_evaluation.state_y
y_pred =df_evaluation.state_x
cm= confusion_matrix(y_true, y_pred,labels=[2,3,4,5])
其中cm就是计算出来的混淆矩阵:
利用sklearn的confusion_matrix函数就可以实现,这里将该函数的参数铺开一下:
sklearn.metrics.confusion_matrix(y_true,
y_pred,
*,
labels=None,
sample_weight=None,
normalize=None)
参数说明:
y_true:对比真值
y_pred: 预测值
labels:索引矩阵的标签列表。这可用于重新排序或选择标签的子集。如果给定“无”,则按排序顺序使用在y_true或y_pred中至少出现一次的值。
sample_weight:样本权重
normalize:在真(行)、预测(列)条件或所有总体上规范化混淆矩阵。如果“无”,则混淆矩阵将不会被归一化。
得到了混淆矩阵接下来进行数据可视化就好了,这里有三种实现形式,其中matplotlib和seaborn实现方法是一样的,都是热力图实现,另外sklearn自带一个ConfusionMatrixDisplay也可以直接实现热力。 第一种matplotlib/seaborn:
import seaborn as sns
import matplotlib.pyplot as plt
labels=[2,3,4,5]
sns.heatmap(cm,annot=True ,fmt="d",xticklabels=labels,yticklabels=labels)
plt.title('confusion matrix') # 标题
plt.xlabel('Predict lable') # x轴
plt.ylabel('True lable') # y轴
plt.show()
第二种ConfusionMatrixDisplay:
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)
disp.plot(
include_values=True,
cmap="viridis",
ax=None,
xticks_rotation="horizontal",
values_format="d"
)
plt.show()
这里我主要将一下ConfusionMatrixDisplay.plot()的可选参数:
plot(*,
include_values=True,
cmap='viridis',
xticks_rotation='horizontal',
values_format=None,
ax=None,
colorbar=True,
im_kw=None,
text_kw=None)
参数说明:
include_values:bool,default=True。包括混淆矩阵中的值。
cmap:str or matplotlib Colormap, default=’viridis’。matplotlib识别的颜色映射。
xticks_rotation: {‘vertical’, ‘horizontal’} or float, default=’horizontal’。旋转xtick标签。
values_format:str, default=None。混淆矩阵中值的格式规范。如果无,则格式规范为“d”或“.2g”,以较短者为准。
ax: matplotlib axes, default=None。要绘制的轴对象。如果为“无”,则创建新的图形和轴。
colorbar:bool, default=True。是否向绘图添加色条。
im_kw:dict, default=None。使用传递给matplotlib.pyplot.imshow调用的关键字进行读写。
text_kw:dict, default=None。使用传递给matplotlib.pyplot.text调用的关键字进行读写。
来源:https://juejin.cn/post/7184608711489355835
猜你喜欢
- 一、VScode下载官网Download Visual Studio Code - Mac, Linux, Windows点击64 bit会
- 1 为什么找不见外星人为什么我们见不到外星人? 曾经在物理学上有一个著名人物叫费米,大家知道费米是在物理学上发现中子轰击的人,有一个著名的费
- 最近做了一个小项目,里面有一个需求需要添加一个动态进度条,进度条的样式就类似于水波来回起伏的那种形状,下面就是最初的展示效果(有一点区别,这
- 今天看到一个教程,是关于Python安装pygame模块的。觉得很好,拿来分享一下。安装Python额,这个小题貌似在这里很是多余啊。但是为
- 一:Zmail的优势:1:自动填充大多数导致服务端拒信的头信息(From To LocalHost之类的)2:将一个字典映射为email,构
- Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储
- python如何为创建大量实例节省内存,具体内容如下案例:某网络游戏中,定义了玩家类Player(id, name, status,....
- 一个动态数组 a,如果你已经使用redim 语句给它设定了大小,那么在此之后使用 ubound(a) 就可以得到它的上边界。如果你没有使用
- 背景如果需要访问远程服务器的Mysql数据库,但是该Mysql数据库为了安全期间,安全措施设置为只允许本地连接(也就是你需要登录到该台服务器
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&
- 本文实例为大家分享了Bootstrap导航栏和登陆框的具体代码,供大家参考,有不足的地方请大家谅解,大家共同学习进步。<!DOCTYP
- #coding:utf-8 #批量修改文件名 import os import re import datetime re_st = r
- aes的gcm模式的加密和解密要给已有的系统启用加密解密,目前推荐的是aes的gcm模式的加密和解密,在微服务如果向前有公共方法处理 读取数
- 目录与SpringBoot2.0整合 1、核心依赖2、配置文件3、实体类对象4、JPA框架的用法5、封装一个服务层逻辑测试代码块&
- blankzheng的blog:http://www.planabc.net/margin在中文中我们翻译成外边距或者外补白(本文中引用外边
- requests接口测试的介绍requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Req
- 我就废话不多说了,大家还是直接看代码 吧~package mainimport ( "fmt" "sort&q
- 创建一个优秀的可视化图表的关键在于引导读者,让他们能理解图表所讲述的故事。在一些情况下,这个故事可以通过纯图像的方式表达,不需要额外添加文字
- 一、引言生成数据库表有下面的三种方式:代码生成。程序包管理器控制台迁移。命令行迁移。下面分别介绍上面的三种方法。二、具体示例1、代码生成在程
- 一 创建mappingPUT test{ "mappings": { "