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

机器学习分类算法评价指标

一. 分类评价指标

对机器学习算法的性能进行评估时,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价指标,这就是算法评价指标。分类算法的评价指标一般有准确率,精确率,召回率,F1-score,PR曲线,ROC,AUC。

在介绍具体的评价指标前,需要先以二分类为例引入混淆矩阵。

混淆矩阵

针对一个二分类问题,即将实例分成正类(positive)或反类(negative),在实际分类中会出现以下四种情况:
(1)若一个样本是正类,并且被预测为正类,即为真正类TP(True Positive )
(2)若一个样本是正类,但是被预测为反类,即为假反类FN(False Negative )
(3)若一个样本是反类,但是被预测为正类,即为假正类FP(False Positive )
(4)若一个样本是反类,并且被预测为反类,即为真反类TN(True Negative )

混淆矩阵的每一行是样本的预测分类,每一列是样本的真实分类,如下图所示。
在这里插入图片描述

二. 准确率(accuracy),精确率(precision),召回率(recall),F1-score

1. 准确率(accuracy)

精确率是预测正确的样本占所有样本的百分比。
accuracy=TP+TNTP+FP+TN+FNaccuracy = \frac{TP + TN}{TP + FP +TN + FN}accuracy=TP+FP+TN+FNTP+TN

局限:当数据的正负样本不均衡,仅仅使用这个指标来评价模型的性能优劣是不合适的。

假如一个测试集有正样本99个,负样本1个。模型把所有的样本都预测为正样本,那么模型的Accuracy为99%,看评价指标,模型的效果很好,但实际上模型没有任何预测能力。

2. 精确率(precision)

又叫查准率,它是模型预测为正样本的结果中,真正为正样本的比例。
precision=TPTP+FPprecision=\frac{TP}{TP + FP}precision=TP+FPTP

3. 召回率(recall)

又叫查全率,它是实际为正的样本中,被预测为正样本的比例。
recall=TPTP+FNrecall=\frac{TP}{TP + FN}recall=TP+FNTP

4. F1-score

F1-score是precision和recall的调和平均值。
F1=2∗Precision∗RecallPrecision+RecallF1 =\frac{2 * Precision * Recall}{ Precision + Recall}F1=Precision+Recall2PrecisionRecall

5. 编码实现
import numpy as np
from sklearn import datasets
import warnings
warnings.filterwarnings("ignore")
digits = datasets.load_digits()
x = digits.data
y = digits.target.copy()
y[digits.target == 9] = 1
y[digits.target != 9] = 0
x.shape
(1797, 64)
y.shape
(1797,)
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x, y, random_state=666)
from sklearn.linear_model import LogisticRegressionlog_reg = LogisticRegression()
log_reg.fit(x_train, y_train)
y_log_predict = log_reg.predict(x_test)
log_reg.score(x_test, y_test)
0.9755555555555555
#### 手动计算混淆矩阵
def TN(y_true, y_predict):assert len(y_true) == len(y_predict)return np.sum((y_true ==0) & (y_predict == 0))
TN(y_test, y_log_predict)
403
def FP(y_true, y_predict):assert len(y_true) == len(y_predict)return np.sum((y_true ==0) & (y_predict == 1))
FP(y_test, y_log_predict)
2
def FN(y_true, y_predict):assert len(y_true) == len(y_predict)return np.sum((y_true ==1) & (y_predict == 0))
FN(y_test, y_log_predict)
9
def TP(y_true, y_predict):assert len(y_true) == len(y_predict)return np.sum((y_true ==1) & (y_predict == 1))
TP(y_test, y_log_predict)
36
def my_confusion_matrix(y_true, y_predict):return np.array([[TN(y_true, y_predict),FP(y_true, y_predict)],[FN(y_true, y_predict),TP(y_true, y_predict)]])
my_confusion_matrix(y_test, y_log_predict)
array([[403,   2],[  9,  36]])
# 使用sklearn 提供的api计算混淆矩阵from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_log_predict)
array([[403,   2],[  9,  36]])
#手动计算precision
def my_precision_score(y_true, y_predict):return TP(y_true, y_predict) / (TP(y_true, y_predict) + FP(y_true, y_predict))my_precision_score(y_test, y_log_predict)
0.9473684210526315
# 使用sklearn提供的api计算precision
from sklearn.metrics import precision_score
precision_score(y_test, y_log_predict)
0.9473684210526315
#手动计算recall
def my_recall_score(y_true, y_predict):return TP(y_true, y_predict) / (TP(y_true, y_predict) + FN(y_true, y_predict))my_recall_score(y_test,y_log_predict)
0.8
#使用sklearn 提供的api计算recall
from sklearn.metrics import recall_score
recall_score(y_test, y_log_predict)
0.8
# 手动计算F1-score
def my_f1_score(precision, recall):try:return 2 * precision * recall / (precision + recall)except:return 0.0
my_f1_score(precision_score(y_test, y_log_predict), recall_score(y_test, y_log_predict))
0.8674698795180723
# 使用sklearn 提供的api计算F1-score
from sklearn.metrics import f1_score
f1_score(y_test, y_log_predict)
0.8674698795180723

三. PR曲线

1. PR曲线

P-R曲线是描述精确率和召回率变化的曲线。对于所有的正样本,设置不同的阈值,模型预测所有的正样本,再根据对应的精准率和召回率绘制相应的曲线。

一般情况下一个分类模型不可能同时获得高的精准率与召回率,当精准率较高时,召回率会降低;当召回率较高时,精准率会降低。
在这里插入图片描述

模型与坐标轴围成的面积越大,则模型的性能越好。但一般来说,曲线下的面积是很难进行估算的,所以衍生出了“平衡点”(Break-Event Point,简称BEP),即当P=R时的取值,平衡点的取值越高,性能更优。

2. 编码实现
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
digits = datasets.load_digits()
x = digits.data
y = digits.target.copy()
y[digits.target == 9] = 1
y[digits.target != 9] = 0
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x, y, random_state=666)
from sklearn.linear_model import LogisticRegressionlog_reg = LogisticRegression()
log_reg.fit(x_train, y_train)
y_log_predict = log_reg.predict(x_test)
log_reg.score(x_test, y_test)
0.9755555555555555
# 获取分类算法的分类阈值
decision_scores = log_reg.decision_function(x_test)

手动绘制PR曲线

from sklearn.metrics import precision_score
from sklearn.metrics import recall_scoreprecisions = []
recalls = []
thresholds = np.arange(np.min(decision_scores), np.max(decision_scores), 0.1)
for threshold in thresholds:y_predict = np.array(decision_scores >= threshold, dtype = 'int')precisions.append(precision_score(y_test, y_predict))recalls.append(recall_score(y_test, y_predict))
plt.plot(precisions, recalls)

在这里插入图片描述

使用sklearn API绘制PR曲线

from sklearn.metrics import precision_recall_curveprecisions1, recalls1, thresholds1 = precision_recall_curve(y_test, decision_scores)
plt.plot(precisions1, recalls1)

在这里插入图片描述

四. ROC和AUC

1. ROC曲线

ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。曲线对应的纵坐标是TPR,横坐标是FPR。下面先介绍下TPR和FPR。

  • TPR(true positive rate):真正类率,也称为灵敏度(sensitivity),等同于召回率。表示被正确分类的正实例占所有正实例的比例。
    TPR=TPTP+FNTPR=\frac{TP}{TP + FN}TPR=TP+FNTP

  • FPR(false positive rate):负正类率,表示被错误分类的负实例占所有负实例的比例。
    FPR=FPFP+TNFPR=\frac{FP}{FP + TN}FPR=FP+TNFP
    在这里插入图片描述
    设置不同的阈值,会得到不同的TPR和FPR,而随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着负类,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。

    理想目标: TPR=1, FPR=0,即图中(0,1)点。故ROC曲线越靠拢(0,1)点,即,越偏离45度对角线越好。对应的就是TPR越大越好,FPR越小越好。

2. AUC

AUC(Area Under Curve)是处于ROC曲线下方的那部分面积的大小。AUC越大,代表模型的性能越好。

一个分类模型的AUC值越大,则认为算法表现的越好。

3. 编码实现
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
digits = datasets.load_digits()
x = digits.data
y = digits.target.copy()
y[digits.target == 9] = 1
y[digits.target != 9] = 0
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x, y, random_state=666)
from sklearn.linear_model import LogisticRegressionlog_reg = LogisticRegression()
log_reg.fit(x_train, y_train)
y_log_predict = log_reg.predict(x_test)
log_reg.score(x_test, y_test)
0.9755555555555555
# 获取分类算法的分类阈值
decision_scores = log_reg.decision_function(x_test)

使用sklearn API绘制ROC曲线

from sklearn.metrics import roc_curvefprs1, tprs1, thresholds = roc_curve(y_test, decision_scores)
plt.plot(fprs1, tprs1)

在这里插入图片描述

使用sklearn API计算auc的值

from sklearn.metrics import roc_auc_scoreroc_auc_score(y_test, decision_scores)
0.9824417009602195

相关文章:

机器学习分类算法评价指标

一. 分类评价指标 对机器学习算法的性能进行评估时,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价指标,这就是算法评价指标。分类算法的评价指标一般有准确率,精确率,召回率,F1-score&a…...

Socks5代理服务器示例详解

Go语言中变量的声明和JavaScript很像,使用var关键字,变量的声明、定义有好几种形式 变量和常量 // 声明并初始化一个变量 var m int 10 // 声明初始化多个变量 var i, j, k 1, 2, 3 // 多个变量的声明(注意小括号的使用) var(no intname string ) //…...

使用 Docker 和 Nginx 反向代理访问 ChatGPT API

在许多应用程序中,我们需要从一个外部服务中获取数据。然而,由于种种原因(例如跨域问题、API 访问限制等),我们可能无法直接从客户端访问这些服务。这时,反向代理可以成为我们的救星。在这篇文章中&#xf…...

[前端笔记038]vue2之vueRouter、elementUI

前言 本笔记参考视频,尚硅谷:BV1Zy4y1K7SH p117 - p135 相关理解 vue 的一个插件库,专门用来实现SPA 应用单页 Web 应用(single page web application,SPA),整个应用只有一个完整的页面点击页面中的导航…...

ChatGPT使用案例之操作Excel

ChatGPT使用案例之操作Excel 微软已经通过其官网宣布,正在将其基于GPT-4的人工智能(AI)技术植入到其Office办公软件当中,该功能名为“Microsoft 365 Copilot”。微软称其是基于大语言模型的下一代AI生产力技术,目前已经向部分商业用户开放。 Microsoft 365 负责人Jared …...

【算法基础】(二)数据结构 --- 单链表

✨个人主页:bit me ✨当前专栏:算法基础 🔥专栏简介:该专栏主要更新一些基础算法题,有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下,互相监督打卡学习 🌹 🌹 &#x1f3…...

STL容器之<multiset>

文章目录测试环境multiset介绍头文件模块类定义对象构造初始化元素访问元素插入和删除元素查找容器大小迭代器其他函数测试环境 系统:ubuntu 22.04.2 LTS 64位 gcc版本:11.3.0 编辑器:vsCode 1.76.2 multiset介绍 关联式容器。元素是唯一的…...

python实战应用讲解-【numpy专题篇】numpy常见函数使用示例(三)(附python示例代码)

目录 Python numpy.finfo()函数 Python Numpy MaskedArray.masked_less()函数 Python Numpy MaskedArray.masked_less_equal()函数 Python Numpy MaskedArray.masked_not_equal()函数 Python Numpy MaskedArray masked_outside()函数 Python Numpy MaskedArray.masked_wh…...

【Android笔记89】Android之全局加载框Gloading的使用

这篇文章,主要介绍Android之全局加载框Gloading的使用。 目录 一、Gloading全局加载框 1.1、Gloading介绍 1.2、Gloading运行效果 1.3、Gloading的使用...

php微信小程序java+Vue高校课程课后辅导在线教育系统nodejs+python

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 …...

公司刚来的00后真卷,上班还没2年,跳到我们公司起薪20k....

都说00后躺平了,但是有一说一,该卷的还是卷。 这不,前段时间我们公司来了个00后,工作都没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了…...

Intel 处理器 macOS降级到Big Sur

1 创建可引导的 macOS 安装器 将移动硬盘作安装 Mac 操作系统的启动磁盘。 创建可引导安装器需要满足的条件 移动硬盘(格式化为 Mac OS 扩展格式),至少有 14GB 可用空间已下载 macOS Big Sur的安装器 2 下载 macOS macOS Big Sur安装器会…...

【网络安全】记一次红队渗透实战项目

一、信息收集 信息收集非常重要,有了信息才能知道下一步该如何进行,接下来将用 nmap 来演示信息收集 1、nmap 扫描存活 IP 由于本项目环境是 nat 模式需要项目 IP 地址,扫描挖掘本地的 IP 地址信息: 本机 IP 为:192…...

异想天开!没有CPU的操作系统

【引子】“The Last CPU”(https://doi.org/10.1145/3458336.3465291),ACM上的这一篇论文非常有趣,核心思想是如果计算机的体系结构中没有了CPU,那么,操作系统又会是怎样的呢?......不敢私藏&am…...

ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题

来源: 专知 任务语义可以用一组输入到输出的例子或一条文本指令来表示。传统的自然语言处理(NLP)机器学习方法主要依赖于大规模特定任务样本集的可用性。出现了两个问题: 首先,收集特定于任务的标记示例,不适用于任务可能太复杂或太昂贵而无法注释&#…...

【Python】《我的世界》简简单单就可以完成?OMG~(附教学)

文章目录前言一、准备二、运行及操作三.代码解读与自定义总结前言 《我的世界 Minecraft》大家应该都听说过,但你有没有想过自己写一个这样的游戏呢?太难、太复杂了?也许吧,但是不试一试你怎么知道能不能成呢? 国外有…...

【SpringSecurity】认证授权框架——SpringSecurity使用方法

【SpringSecurity】认证授权框架——SpringSecurity使用方法 文章目录【SpringSecurity】认证授权框架——SpringSecurity使用方法1. 概述2. 准备工作2.1 引依赖2.2 测试3. 认证3.1 认证流程3.2 登录校验问题3.3 实现3.3.1 实现UserDetailsService接口3.3.2 密码存储和校验3.3.…...

java的Lambda表达式与方法引用详解

1. 定义 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 1.1 通用定义 lambda 表达…...

JUnit5用户手册~并行执行

两种运行模式 SAME_THREAD:默认的,测试方法在同一个线程CONCURRENT:并行执行,除非有资源锁junit-platform.properties配置参数配置所有测试方法都并行 junit.jupiter.execution.parallel.enabled true junit.jupiter.execution.…...

【从零开始学习 UVM】3.3、UVM TestBench架构 —— UVM Environment [uvm_env]

文章目录 什么是UVM Environment?为什么验证组件不应该直接放置在test class中?创建UVM环境的步骤UVM环境示例Examples环境重用示例什么是UVM Environment? 一个UVM环境包含多个可重用的验证组件,并根据应用程序要求定义它们的默认配置。例如,一个UVM环境可能有多个agent…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下&#xf…...