当前位置: 首页 > news >正文

如何评估分类模型的好坏

如何评估分类模型的好坏

评估分类预测模型的质量,常用一个矩阵、三条曲线和六个指标。

  • 一个矩阵:混淆矩阵;
  • 三条曲线:ROC曲线、PR曲线、KS曲线;
  • 六个指标:正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS值。

ROC曲线和AUC值

  ROC曲线

ROC曲线(Receiver Operating Characteristic curve),即接收者操作特征曲线,是反映TPR和FPR的综合指标。

TPR = TP/(TP+FN),即正类中正确预测的百分比(查全率)。

FPR = FP/(FP+TN),即负类中错误预测的百分比(相当于误判率)。

 

ROC曲线是由点(TPR,FPR)组成的曲线,横坐标是FPR,而纵坐标是TPR。

显然,ROC曲线应该越靠近左上角越好,即表示查全率越高,而误判率越低。

一般来说,如果ROC是光滑的,那么基本可以判断没有太大的过拟合。

 

ROC曲线有助于比较不同分类器的相对性能。如下两个模型M1和M2,当FPR小于0.36时模型M1较好,而当FPR大于0.36时模型M2较好。

 

 

   AUC

与ROC曲线一同使用的,还有AUC指标。

AUC(Area Under Curve),其实就是ROC曲线下方的面积。

因为,ROC曲线一般都处于对角线的上方,即模型的效果应该比瞎猜(猜中的概率为50%)要好,所以AUC的取值范围一般是[0.5,1]。

AUC值越大,即ROC曲线越靠近左上角,其下方的面积越大,说明模型质量越高。

 

显然,由于ROC/AUC与混淆矩阵的TP、FP、TN、FN四个值都有关,所以,AUC是一个综合的评价指标。AUC值越大,也相当于TP和TN越大越好,FP和FN越小越好。

 

所以在大多数数据挖掘比赛中,要比较两个模型哪个会更优,AUC指标要比Accuracy指标常用得多,也比其它查全率R和查准率P要常用得多。

 

PR曲线和BEP值

   PR曲线

PR曲线,反应的是查准率P和查全率R之间的关系。以P为横坐标,R作为纵坐标,就是PR网线。

 

P = TP/(TP+FP),即模型预测的正类中被正确预测的百分比。

R = FP/(FP+FN),即正类中被正确预测的百分比。

 

对于同一个分类模型,通过调整分类的阈值(从大到小变化),就可以得到不同的P-R值,即可画出PR曲线。

显然,我们要求P和R都应该是越高越好。如果一个模型的PR曲线被另一个模型的PR曲线所“包住”,则后者的性能要优于前者。如下图所示,模型A比模型C的性能要好,模型B比模型C的性能也要好。

一般情况下,查准率和查全率这两个指标不可能兼顾。要想查全率R高,则模型需要输出更多的样本(极端地,返回全部样本,则查全率为100%);要想查准率P高,则要求在模型认为的正类中,尽量地选择少的概率高的样本。

 

  BEP

PR曲线中,一般要求P和R都越高越好,因此引入了一个指标BEP来表示模型的质量。

BEP(Break Even Point),亦称盈亏平衡点、保本点。即当查准率=查全率时的值。

在上图中,模型A和模型B,由于存在交叉,不太容易判断哪个模型会更好。如果使用BEP来判断,可知模型A的性能要优于模型B的性能。

 

显然,由于PR /BEP与混淆矩阵的TP、FP、FN三个值都有关(与TN无关),所以,BEP并不是一个综合的评价指标。

但是,即使是正样本非常少的情况下,PR表现的效果也比较好。也就是说,在正负样本不平衡的情况下,PR曲线比ROC曲线能更有效地反应分类器的好坏。

KS曲线和KS值

   KS曲线

KS曲线(Kolmogorov-Smirnov),又叫洛伦兹曲线。以TPR和FPR分别分为纵轴,以阈值作为横轴,画出两条曲线。KS曲线反映的是在同一阈值下TPR和FPR的差值。

 

 

显然,我们希望的是TPR越高越好,而FPR越低越好,即要求两条折线离得越开越好,这说明模型对于正负样本区分度更好。

可以知道,KS曲线和ROC曲线一样,描述的都是TPR和FPR的关系,只是横坐标的取法不一样。

 

   KS值

考虑到量化,所以将TPR和FPR折线的最远距离作为KS值,即KS=max(TPR-FPR),作为模型的分区度。

K-S值越大,表示评分模型能够将“好客户”、“坏客户”区分开来的程度越大。

一般认为:

1)  当KS<0.2时,模型无鉴别能力

2)  在0.2~0.4之间,模型勉强接受,需要考虑优化

3)  在0.4~0.5之间,模型有区别能力

4)  在0.5~0.6之间,模型有较好的区别能力

5)  在0.6~0.7之间,模型有非常好的区别能力

6)  当KS>0.75时,要检验模型是否过拟合

 

由于KS值主要是体现模型中差异的最大的一个分段,因此适合于找阈值。像信用评分卡中,就比较适合使用KS值来评估,寻找出最大的区分度阈值。

曲线对比

 

一般来说,ROC曲线会更稳定,在正负样本足够(样本均衡)的情况下,ROC曲线会比较稳定,能够反映模型的整体质量。当样本不平衡时,特别是正样本极少时,ROC曲线并不准确。

在样本不均衡时,特别是正样本数远小于负样本数时,采用PR曲线会更合适。

而KS曲线,只是反映出哪个分段的区分度是最大的,而不能反映出总体的效果。所以,KS曲线往往只用在寻找区分的最佳阈值(比如信用评分卡中的审批阈值)。

 

一般情况下,最好能够综合考虑上述的三种曲线以及三个指标,这样对模型有一个全面的质量评估。

相关文章:

如何评估分类模型的好坏

如何评估分类模型的好坏 评估分类预测模型的质量&#xff0c;常用一个矩阵、三条曲线和六个指标。 一个矩阵&#xff1a;混淆矩阵&#xff1b;三条曲线&#xff1a;ROC曲线、PR曲线、KS曲线&#xff1b;六个指标&#xff1a;正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS…...

● 84.柱状图中最大的矩形

84.柱状图中最大的矩形 class Solution { public:int largestRectangleArea(vector<int>& heights) {stack<int>st;heights.insert(heights.begin(),0);heights.push_back(0);st.push(0);int res0;for(int i1;i<heights.size();i){while(heights[i]<heig…...

未检查的转换: ‘java.lang.Object‘ 转换为 ‘java.util.List

fastjson方式 Object object ... // 获取待转换的objectList<WbsCategory> list JSON.parseObject(JSON.toJSONString(object), new TypeReference<List<WbsCategory>>() {}); 在这个示例中&#xff0c;我们使用JSON.toJSONString()将object对象转换…...

【C语言】使用C语言,实现九九乘法表(另附Python、Java、JavaScript实现方式)

文章目录 1. C语言实现1.1 思路1.2 代码实现 3.其他语言实现3.1 Python实现3.2 Java实现3.3 JavaScript实现 1. C语言实现 1.1 思路 九九乘法表图示&#xff1a; 思路如下&#xff1a;定义两层for循环即可实现九九乘法表 一共有9层&#xff0c;所以要定义一个变量i&#xff…...

[机缘参悟-102] :IT人 - 管理的本质?管理人与从事技术的本质区别?人性、冰山模型、需求层次模型

感悟&#xff1a; 管理的本质是&#xff1a;学习各种管理理论、方法、技能&#xff0c;克服自身的人性缺点、预防他人人性的恶点、利用他人的人性特点拿到结果&#xff0c;从而完成组织、管理者的上司、管理者自身、管理者下属的目标。管理中的问题&#xff0c;80%以上都人性问…...

[论文阅读笔记26]Tracking Everything Everywhere All at Once

论文地址: 论文 代码地址: 代码 这是一篇效果极好的像素级跟踪的文章, 发表在ICCV2023, 可以非常好的应对遮挡等情形, 其根本的方法在于将2D点投影到一个伪3D(quasi-3D)空间, 然后再映射回去, 就可以在其他帧中得到稳定跟踪. 这篇文章的方法不是很好理解, 代码也刚开源, 做一…...

【Java 动态数据统计图】前后端对接数据格式(Map返回数组格式数据)六(120)

说明&#xff1a; 前端使用&#xff1a;vue3.0 前后端对接数据格式&#xff1a;无非就是前端把后端返回的数据处理为自己想要的格式&#xff0c;或者&#xff0c;后端给前端处理好想要的格式&#xff1b; 针对前后端的柱状图&#xff0c;趋势图等数据对接&#xff0c;前端一般需…...

❤ 给自己的mac系统上安装java环境

❤ 给自己的mac系统上安装java环境 &#x1f353; 作为前端工程师如何给自己的mac系统上安装java环境 &#x1f34e; 最近因为自己的一些项目需求&#xff0c;mac电脑上需要安装一些后台的java环境&#xff0c;用来跑后台的java程序&#xff0c;于是从一个前端工程师的角度安…...

Java-匿名类

介绍 匿名类是指没有名字的类&#xff0c;它对一个给定的类进行拓展&#xff0c;或者实现一个给定的接口。使用匿名类可以使得代码更加简洁、紧凑、模块程度更高。 实现方式及语法 匿名类有两种实现方式 继承一个类&#xff0c;重写其方法实现一个接口&#xff08;可以是多…...

Maven的超级POM

对于我们创建的一个maven工程&#xff0c;即便我们自己的pom.xm文件中没有明确指定一个父工程&#xff08;父POM&#xff09;&#xff0c;其实也默认继承了超级POM&#xff0c;就好比JAVA类继承Object类一样。 maven官网关于超级POM的介绍&#xff1a; https://maven.apache.o…...

软考高级系统架构设计师系列论文九十二:论新技术的引进

软考高级系统架构设计师系列论文九十二:论新技术的引进 一、摘要二、正文三、总结一、摘要 根据国家税务总局对税务系统内所有系统进行集成与整合的需求,我所在的开发单位组织了全国金税工程防伪税控系统网络版的升级开发工作。该项目工程浩大,要求在具有严格的安全、可靠性…...

vue使用Bootstrap的详细方法

要在Vue中使用Bootstrap&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Bootstrap&#xff1a;首先&#xff0c;您需要安装Bootstrap。您可以使用npm或者yarn来安装Bootstrap。打开终端&#xff0c;并在项目的根目录中运行以下命令&#xff1a; npm install bootst…...

leetcode做题笔记103. 二叉树的锯齿形层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 思路一&#xff1a;BFS #define N 2000int** zigzagLevelOrder(st…...

如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁

如果将PC电脑变成web服务器&#xff1a;利用Nignx反向代理绕过运营商对80端口封锁 在上一篇文章中&#xff0c;我们已经实现了内网主机的多次端口映射&#xff0c;将内网主机的端口映射到了公网&#xff0c;可以通过公网访问该主机了。 因为电信的家庭宽带&#xff0c;默认是…...

Eureka:服务注册-信息配置-自我保护机制

首先在提供者服务下&#xff0c;添加一个依赖 <!-- Eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version><…...

C++二叉树进阶

本期内容我们讲解二叉树的进阶知识&#xff0c;没有看过之前内容的小伙伴建议先看往期内容 二叉树-----补充_KLZUQ的博客-CSDN博客 目录 二叉搜索树 代码实现 基础框架 Insert Find Erase 析构函数 拷贝构造 赋值 二叉搜索树的应用 全部代码 二叉搜索树 二叉搜索树…...

layui tree组件取消勾选

layui(2.8.15) tree的api中&#xff0c;只有 tree.setChecked(id, idArr) 方法&#xff0c;没有取消勾选的方法。 我的需求是&#xff1a;勾选后做判断&#xff0c;如果不符合条件则取消勾选。 实现方法&#xff1a; 使用 tree的oncheck事件&#xff0c;在回调函数中做判断&…...

【Android基础面试题】ViewPager与ViewPager2的区别

ViewPager和ViewPager2是Android中用于实现滑动页面切换的控件。它们的主要区别如下&#xff1a; 实现方式 ViewPager2的内部实现是RecyclerView&#xff0c;而ViewPager是通过继承自ViewGroup实现的。因此&#xff0c;ViewPager2的性能更高。 滑动方向 ViewPager2可以实现横向…...

springCloudGateway网关配置

1.配置跨域支持 /*** 跨域支持*/ Configuration public class CorsConfig {Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedH…...

kali 2023.3新增工具

在终端模拟器中运行 sudo apt update && sudo apt full-upgrade 命令来更新其安装 Kali Linux 2023.3 发布中包含了九个新工具&#xff0c;分别是&#xff1a; Calico&#xff1a;云原生网络和网络安全。 cri-tools&#xff1a;用于Kubelet容器运行时接口的命令行界面…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...