一篇文章真正讲懂模型评估指标(准确率,召回率,精确率,roc曲线,AUC值)

背景:

最近在做一些数据分析的比赛的时候遇到了一些头疼的问题,就是我们如何评估一个模型的好坏呢?

准确率,召回率,精确率,roc曲线,roc值等等,但是模型评估的时候用哪个指标呢,在此出一篇文章仔细说一说吧,希望大家看完能有收获!

模型评估

我们先从会混淆矩阵说起。

![外链图

这个是一个二分类混淆矩阵,也是我们真实值和预测值的对应关系.

True False 代表真实值和预测值是否相同。

  • True Positive(TP):真实为正,预测为正 ----------------真的真
  • False Negative(FN):真实为正,预测为反 -----------假的假 -------也就是说不是假的 也就是真的
  • False Positive(FP):真实为假,预测为正 --------------假的真 -----也就是说应该是不是真的
  • True Negative(TN):真实为假,预测为假 ------------------ 真的假

我觉得这样子的解释大家应该比较容易理解吧.

接下来是基于这个四个的指标:

精确率:

即对的概率:真的假和真的真 占全体的比例。

这个指标表示模型预测正确的概率,精度越高,模型越优秀。
A c c u r a c y = ( T P + T N ) / ( T P + F N + F P + T N ) Accuracy = (TP+TN)/(TP+FN+FP+TN) Accuracy=(TP+TN)/(TP+FN+FP+TN)

正确率:

即 在预测为真的情况下,预测正确的概率。
P r e c i s i o n = T P / ( T P + F P ) Precision = TP/(TP+FP) Precision=TP/(TP+FP)

召回率:

即 在真实为真的情况下,能预测成功的概率
R e c a l l = T P / ( T P + F N ) Recall = TP/(TP+FN) Recall=TP/(TP+FN)

召回率和正确率的区别:

注意区分正确率和召回率,分子相同 ,但是分母一个是相对于 真实值为真来说的, 一个是相对于预测值为真来说的

特异性:

即 在真实为假的条件下 预测为假 。

F P R = T N / ( T N + F P ) FPR=TN/(TN+FP) FPR=TN/(TN+FP)

负正类率:

即 在真实为假的条件下 预测为真 。

其实就是预测错了。
F P R = F P / ( T N + F P ) FPR=FP/(TN+FP) FPR=FP/(TN+FP)

分类报告:

这个报告会包括很多值,可以展示出 precision recall f1-score support 等等,如下.

在这里插入图片描述

ROC曲线:

在这里插入图片描述

ROC曲线解释:

​ ROC曲线是评估二分类模型性能的常用工具。在ROC曲线中,横轴表示模型的假阳性率(False Positive Rate,FPR),纵轴表示模型的真阳性率(True Positive Rate,TPR),也可以称为灵敏度(Sensitivity)或召回率(Recall)。

​ ROC曲线以不同的分类阈值为基础,绘制了模型在不同阈值下的TPR和FPR。曲线上的每个点代表了模型在特定阈值下的性能,而曲线的整体形状则反映了模型的分类能力。

AUC:

AUC(Area Under the Curve)是ROC曲线下方的面积,常用于评估二分类模型的性能。AUC值的范围在0到1之间,其中0.5表示模型的分类能力等同于随机猜测,而1表示模型完美地将正例和负例分类开。通常情况下,AUC值越接近1,模型的性能越好。在实际应用中,可以使用AUC值来比较不同的模型,选择性能最佳的模型。所以这个值越大越好,说明模型越好。

模型指标代码实现:

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来显示中文,不然会乱码
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix, cohen_kappa_score, classification_report
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve, auc
data = pd.read_csv(r'./data/user_features.csv')
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.max_rows', None)  # 显示所有行
# 构建特征矩阵和目标变量
features = df[['Recency', 'Frequency', 'Monetary']]
target = df['target']
# 数据拆分
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)
# 特征缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 创建逻辑回归模型
logistic_model = LogisticRegression()
logistic_model.fit(X_train_scaled, y_train)
logistic_pred_proba = logistic_model.predict_proba(X_test_scaled)[:, 1]
logistic_fpr, logistic_tpr, _ = roc_curve(y_test, logistic_pred_proba)
logistic_roc_auc = auc(logistic_fpr, logistic_tpr)
# 模型训练
logistic_model.fit(X_train_scaled, y_train)
# 模型预测
y_pred = logistic_model.predict(X_test_scaled)
# 模型评估
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
# 打印评估指标
print("准确率:", accuracy)
print("精确率:", precision)
print("召回率:", recall)
print("F1分数:", f1)
print("auc值",logistic_roc_auc)
# 打印分类报告
report = classification_report(y_test, y_pred)
print("分类报告:")
print(report)

注意:区别只有不同的模型,参数指标名是一样的.

ROC曲线绘制:

import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来显示中文,不然会乱码
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix, cohen_kappa_score, classification_report
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve, auc
data = pd.read_csv(r'./data/user_features.csv')
# 构建特征矩阵和目标变量
features = df[['Recency', 'Frequency', 'Monetary']]
target = df['target']
# 数据拆分
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)
# 特征缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 创建逻辑回归模型
logistic_model = LogisticRegression()
logistic_model.fit(X_train_scaled, y_train)
logistic_pred_proba = logistic_model.predict_proba(X_test_scaled)[:, 1]
logistic_fpr, logistic_tpr, _ = roc_curve(y_test, logistic_pred_proba)
logistic_roc_auc = auc(logistic_fpr, logistic_tpr)

plt.figure()
plt.plot(rf_fpr,rf_tpr, color='g', lw=2,label='随机森林 curve (area = %0.2f)' % rf_roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--',label='Random Classifier (area = 0.5) ')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
# plt.title('Receiver Operating Characteristic - {}'.format(final_model_name))
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/133121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决找不到x3daudio1_7.dll的方法,快速解决x3daudio1_7.dll丢失问题

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到x3daudio1_7.dll”。这个问题可能是由于多种原因引起的,例如文件丢失、损坏或被病毒感染等。下面将详细介绍如何解决这个问题。 首先,我们需要了解x3daudio1_…

前端面试题之vue篇

vue基础 vue的基本原理 当一个Vue实例创建时,Vue会遍历data中的属性,用Object.defineProperty(Vue使用proxy)转换为getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的watcher程序实例…

【Git】的分支和标签的讲解及实际应用场景

目录 一、讲解 1. 环境讲述 2. 应用原因 3. 分支标签的区别 二、分支 1. 命令 2. 场景应用 三、标签 1. 命令 2. 标签规范 3. 应用场景 每篇一获 一、讲解 1. 环境讲述 当软件从开发到正式环境部署的过程中,不同环境的作用如下: 开发环境&a…

vue3+vite搭建后台项目-1 引入element-plus 中文包,打包时报错问题

vue3vite搭建后台项目-1 引入element-plus 中文包,打包时报错问题 终端报错 If theelement-pluspackage actually exposes this module, try adding a new declaration (.d.ts) file containing are moduleelement-plus/dist/locale/zh-cn.mjsdec import zhCn fromelement-plus…

uniapp——项目02

分类 创建cate分支 渲染分类页面的基本结构 效果页面,包含左右两个滑动区. 利用提供的api获取当前设备的信息。用来计算窗口高度。可食用高度就是屏幕高度减去上下导航栏的高度。 最终效果: 每一个激活项都特殊背景色,又在尾部加了个红条一样的东西。 export d…

LeetCode146.LRU缓存

写了一个小时,终于把示例跑过了,没想到啊提交之后第19/22个测试用例没过 我把测试用例的输出复制在word上看看和我的有什么不同,没想到有18页的word,然后我一直检查终于找出了问题,而且这个bug真的太活该了&#xff0c…

多状态Dp问题——买卖股票的最佳时机含冷冻期

目录 一,题目 二,题目接口 三,解题思路及其代码 一,题目 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成…

【数据结构】树与二叉树(十):二叉树的先序遍历(非递归算法NPO)

文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

电脑清灰涂硅脂后电脑CPU温度不降反升

目录 一.问题描述二.问题解决三.拆机注意事项四.影响散热的主要因素说明1.通风差2.硅脂材料差3.硅脂涂抹方式错误 一.问题描述 电脑型号:暗影精灵5 测温工具:硬件狗狗(只要是测温软件都可以,比如omen hub和Core Temp…&#xff0…

实战Leetcode(四)

Practice makes perfect! 实战一: 这个题由于我们不知道两个链表的长度我们也不知道它是否有相交的节点,所以我们的方法是先求出两个链表的长度,长度长的先走相差的步数,使得两个链表处于同一起点,两个链…

【Java 进阶篇】Java Web 开发之 JQuery 快速入门

嗨,各位小伙伴们!欢迎来到 Java Web 开发的继续学习之旅。在前面的博客中,我们学习了 Servlet、JSP、Filter、Listener 等基础知识,今天我们将进入前端领域,学习一下如何使用 JQuery 来简化和优化我们的前端开发。 1.…

Python 使用tkinter的Text文本域实时显示光标位置

在Python tkinter中,可以使用Text widget的index()方法来获取实时光标的行和列。该方法接受一个字符串参数,用于指定要获取的索引位置,例如"insert"表示当前光标位置。 重难点:想要获取准确的光标位置,需要…

Python实战:绘制直方图的示例代码,数据可视化获取样本分布特征

文章目录 一、初步二、参数三、绘图类型四、多组数据直方图对比Python技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学习视频5、实战案例6、清华编程大佬出品《漫画看学Python》7、Python副业兼职与全职路线 一、初步 对于大量样本来说,如…

【开源】基于Vue.js的智能停车场管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…

华为ensp:交换机接口划分vlan

现在要把 e0/0/1 接口放入vlan1 e0/0/2 接口放入vlan2 e0/0/3 接口放入vlan3 默认所有接口都在vlan1所以 e0/0/0 接口不用动 1.创建vlan 进入系统视图模式 直接输入 vlan 编号 即可创建对应vlan vlan 编号 vlan 2 创建vlan2 vlan 3 创建vlan3 2.将接口进入vlan…

tomcat下载与使用教程

1. tomcat下载 官网:https://tomcat.apache.org/ 镜像地址:https://mirrors.huaweicloud.com/apache/tomcat/ 1、选择一个版本下载,官网下载速度缓慢,推荐镜像 2、对压缩包进行解压,无需进行安装,解压放…

Netty--ByteBuffer

2. ByteBuffer 有一普通文本文件 data.txt,内容为 1234567890abcd 使用 FileChannel 来读取文件内容 Slf4j public class ChannelDemo1 {public static void main(String[] args) {// FileChannel// 1. 输入输出流, 2. RandomAccessFile// try (F…

C语言求解猴子分桃问题

题目: 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了 一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分 成五份,又多了一个,它同样把多…

分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测

分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-LSTM粒子群算法优化长短…

unity - Blend Shape - 变形器 - 实践

文章目录 目的Blend Shape 逐顶点 多个混合思路Blender3Ds maxUnity 中使用Project 目的 拾遗,备份 Blend Shape 逐顶点 多个混合思路 blend shape 基于: vertex number, vertex sn 相同,才能正常混合、播放 也就是 vertex buffer 的顶点数…