人工智能中的模型评估

1 概述

1.1 定义

人工智能(AI)模型评估是一个关键的过程,用于确定模型在特定任务上的性能和有效性。这个过程涉及使用各种技术和指标来衡量模型的准确度、可靠性、泛化能力以及其他重要特性。在不同的应用场景中,模型评估的具体细节和重点可能会有所不同,但总体目标是确保模型能够满足预定的标准和实际需求。

1.2 重要性

模型评估在机器学习和人工智能领域扮演着至关重要的角色。模型评估是确保机器学习模型在实际应用中有效、可靠且符合预期的关键步骤。它不仅帮助开发者理解和改进模型,还为最终用户提供了信心和保证。在模型开发的整个生命周期中,持续和全面的评估对于实现高质量的AI解决方案至关重要。主要表现在以下几个方面:

1.2.1 确保准确性和可靠性

  • 性能验证: 模型评估是验证模型在给定任务上表现如何的关键过程。通过评估,可以确定模型是否能够准确地做出预测或分类。

  • 错误和偏差识别: 通过评估,可以发现模型在特定类型的数据或情境中的弱点,如过拟合或欠拟合,以及偏差的存在。

1.2.2 促进模型优化

  • 改进指导: 模型评估提供了关于如何改进模型的具体见解,例如调整模型参数或数据处理方法。

  • 迭代开发: 评估结果是迭代开发过程中不可或缺的部分,帮助开发者在每个迭代阶段优化模型。

1.2.3 确保实际应用的有效性

  • 现实世界适用性: 评估帮助确定模型是否能够在实际应用中有效工作,特别是在面对现实世界复杂和不可预测的数据时。

  • 风险管理: 在关键领域(如医疗、金融)部署模型前,评估可以帮助识别和缓解潜在的风险。

1.2.4 优化资源分配

  • 性能与资源的平衡: 评估可以揭示模型性能与所需计算资源之间的平衡点,有助于更高效地分配资源。

  • 部署决策: 模型评估结果对于决定是否部署模型、何时部署以及如何部署至关重要。

1.3 评估步骤

模型评估是一个系统且多阶段的过程,旨在全面理解模型的性能并指导未来的改进。这个过程不仅包括定量的性能评估,还包括对模型错误模式的定性分析。通过这些步骤,可以确保模型的准确性、鲁棒性和泛化能力。有效的模型评估通常包括以下步骤:

1.3.1 数据准备

  • 分割数据集: 将数据分为训练集、验证集和测试集。训练集用于模型学习,验证集用于调整模型参数,测试集用于最终评估。

  • 确保数据代表性: 确保所有数据子集都能代表整个数据的分布,以避免评估偏差。

1.3.2 选择评估指标

  • 准确性指标: 如准确率、召回率、精确率、F1分数等,这些指标用于衡量分类模型的性能。

  • 误差指标: 如均方误差(MSE)、平均绝对误差(MAE)等,用于回归模型。

  • 其他指标: 如AUC-ROC曲线、混淆矩阵等,根据具体应用选择适合的评估指标。

1.2.3 进行基线测试

  • 建立基线模型: 在更复杂的模型训练之前,先用一个简单的模型(如线性模型)建立性能基线。

  • 比较性能: 将后续模型的性能与基线模型进行比较,以评估改进的程度。

1.2.4 训练模型与交叉验证

  • 交叉验证: 使用交叉验证方法(如k折交叉验证)来评估模型在不同数据子集上的稳定性和泛化能力。

  • 记录性能: 在每次验证过程中记录模型的性能指标。

1.2.5 调整模型参数

  • 参数调优: 根据验证集上的表现调整模型参数,如学习率、正则化系数等。

  • 使用网格搜索或随机搜索: 自动化参数选择过程以找到最佳参数组合。

1.2.6 最终评估

  • 使用测试集: 在最终的测试集上评估模型性能,以得到模型在未见数据上的表现。

  • 避免数据泄露: 确保在此过程中不会用到任何训练或验证数据。

1.2.7 误差分析

  • 分析错误: 检查模型在哪些类型的数据上出错,以及错误的可能原因。

  • 调整模型或数据: 根据误差分析结果进行模型调整或数据预处理的改进。

1.2.8 模型迭代

  • 持续改进: 根据评估结果持续优化模型。

2 评估指标

​对机器学习的泛化性能进行评估,不仅需要有效可行的实验估计方法还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure),性能度量反映了任务需求,在对比不同的模型时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的好坏是相对的,不仅取决于算法和数据,还取决于任务需求。

在评估学习器f的性能通常是把预测结果f(x)和数据的真实标签进行比较。(下文中把预测值f(x)记为\hat{y} ),下面介绍几种常见的评估指标。

2.1 回归问题的评估指标

2.1.1 平均绝对误差(MAE)

MAE = np.average(np.abs(y_true-y_pre))

2.1.2 均方误差(MSE)

MSE = np.average((y_true-y_pre)**2)

 2.1.3 均方根误差(RMSE)

np.sqrt(np.average((y_true-y_pre)**2))
  • MAE,MSE,RMSE的取值范围都是从 0 0 0到 ∞ \infin ∞

  • MAE 和 RMSE的单位与预测目标的单位一致,但MSE的单位不同

  • MAE,MSE,RMSE的值越小,预测的效果越好

  • RMSE对离群点更加敏感

  • MAE对离群点更鲁棒(「Robust」,即一个系统或组织有抵御或克服不利条件的能力)

2.1.4 R方系数 

  • R^{2}系数反映了预测值和实际值之间的符合程度,其值为1时,说明完美拟合,其值为0时,说明拟合的为目标的平均值

  • R^{2}可能为负数,此时说明预测结果较真值而言过大

2.2 分类问题的评估指标

2.2.1 错误率和精度

  • 错误率:分错样本占样本总数的比例

  • 精度:分对样本占样本总数的比例

2.2.2 混淆矩阵(二分类度量指标) 

  • TN: True Negative
  • TP: True positive
  • FP: False positive
  • FN: False negative

Precision 和Recall的侧重点不同,Precison侧重于降低FP的比例,所以注重精度,宁可漏掉,不可错杀,而Recall中与降低FN的比例,所以注重查全率,宁可错杀,不可漏掉。

2.2.3 F1-score 

F1-score是Precison和Recall的谐波均值,可以综合考量查准率和查全率

2.2.4 PR曲线 

在很多情况下,我们可根据学习器的预测结果对样例进行排序,排在最前面的是学习器最可能认为是正例的样本,排在最后面的则是认为最不可能是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可计算出当前的查全率和查准率。以查全率为x轴,查准率为y轴,就得到了查准率-查全率曲线,简称’‘P-R曲线’‘,P-R图能直观的显示出学习器在样本总体上的查全率和查准率,在进行比较时,如果一个学习器的P-R曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能由于前者。例如图中学习器A的性能优于C,若曲线出现交叉,则无法轻易断言孰优孰劣,只能在具体的查准率和查全率下进行比较。于是人们想出了“平衡点”(BEP)这一个度量,它是查准率等于查全率时的取值,例如图中学习器C的BEP是0.64,而基于BEP的比较,可认为学习器A优于B。

2.2.5 ROC和AUC 

​类似于P-R曲线根据学习器预测结果对样例排序,并逐个作为正例进行预测,以“假正例率”(FPR)为横轴,“真正例率”(TPR)为纵轴可得到ROC曲线,全称“受试者工作特征”(Receiver Operating Characteristic)曲线。相比于PR曲线,ROC曲线对样本类别的比例不敏感,更能反映模型预测性能

​若某个学习器的ROC曲线被另一个学习器的曲线“包住”,则后者性能优于前者;否者如果曲线交叉,可以根据ROC曲线下面积大小进行比较,也即AUC值。AUC 衡量了样本预测的排序质量,

示例代码:

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score,roc_curve
from sklearn.metrics import precision_recall_curve
# 导入数据
y_true = [1, 0, 0, 1, 0, 0, 1, 1, 0, 1]
y_pre = [0.9, 0.4, 0.2, 0.6, 0.5, 0.4, 0.7, 0.4, 0.65, 0.35]# 调用这些函数时要注意,y_pre必须是预测为正例的概率
fpr,tpr,th = roc_curve(y_true, y_pre)
precision,recall,th = precision_recall_curve(y_true, y_pre)
auc_socre = roc_auc_score(y_true, y_pre)print("auc=:{}".format(auc_socre))# 设置画图参数
fig,ax = plt.subplots(1,2,figsize = (10,5))
ax[0].plot(precision,recall)
ax[0].set_xlabel("recall")
ax[0].set_ylabel("precision")# 设置X,Y轴名称
ax[1].plot(fpr,tpr)
ax[1].set_xlabel("fpr")
ax[1].set_ylabel("tpr")ax[0].set_title("PR")
ax[1].set_title("ROC")
plt.show()

代码运行结果:

auc=:0.6799999999999999

2.3 多分类问题的评估指标

上述中分类问题的性能度量都是针对二分类问题,那么在多分类问题中,我们应该怎样去进行性能度量呢?下面介绍几种常见的方法

我们在进行多分类问题的性能度量的时候,是对每一类单独求解,当对某一类进行计算时,是把这一类当成正类,其他所有类当成负类进行计算。举个例子:

在计算cat的时候,我们把cat当成正例,把所有不是cat的当成负例,所以就可以转化为

Label = [1,1,1,1,0,0,0,0,0]
Predicted = [1,1,1,1,0,0,1,0,0]

因此,图中cat的TP为4,FP为1,FN为0

依次类推,就可以得到如下混淆矩阵:

2.3.1 微(micro)查准率,查全率,F1-score

​在计算micro-Precision,micro-Recall,micro-F1-score时,我们根据上述方法计算出每个类别的TP,FP,FN之后,把所有的TP,FP,FN加起来,再根据公式就可以计算得到结果。

2.3.2 宏(macro)查准率,查全率,F1-score 

在计算macro-Precision,macro-Recall,macro-F1-score时,我们是将每一个类别的P或者R分别计算得到结果之后,再取一个平均值的到最终的结果。上面例子中三个类别的Precision分别为1, 0.8, 0.667,所以micro-p就是1/3(1+0.8+0.667)=0.82, Recall也是这样的算法。

其中n是类别数目,P_{i}为第i类的precision,R_{i}为第i类的Recall

2.3.3 Weighted-averaged 查准率,查全率,F1-score

前面我们在计算micro和macro的时候,都是假设所有类别对最终的结果的贡献都是一样。而在Weighted-averaged中,我们认为每个类别对最终目标的贡献比由其样本数目的多少决定,即计算出每个类别的P或者R之后,乘以每个类别所占的比重就得到了Weighted-averaged P或者R。计算公式如下:

示例代码:

import numpy as np
from sklearn.metrics import confusion_matrix,roc_auc_score,roc_curve
from sklearn.metrics import precision_score,recall_scorey_true = np.array([-1]*30+[0]*240+[1]*30)
y_pre = np.array([-1]*10+[0]*10+[1]*10+[-1]*40+[0]*160+[1]*40+[-1]*5+[0]*5+[1]*20 )print(confusion_matrix(y_true,y_pre))precision_micro = precision_score(y_true,y_pre,average='micro')
precision_macro = precision_score(y_true,y_pre,average='micro')
precision_weighted = precision_score(y_true,y_pre,average='weighted')recall_micro = recall_score(y_true,y_pre,average='micro')
recall_macro = recall_score(y_true,y_pre,average='macro')
recall_weighted = recall_score(y_true,y_pre,average='weighted')print("precision_micro is{},precision_macro is{},precision_weightedis{}".format(precision_micro,precision_macro,precision_weighted))
print("recall_micro is{},recall_macro is{},recall_weightedis{}".format(recall_micro,recall_macro,recall_weighted))

运行结果显示:

[[ 10  10  10][ 40 160  40][  5   5  20]]
precision_micro is0.6333333333333333,precision_macro is0.6333333333333333,precision_weightedis0.7781818181818182
recall_micro is0.6333333333333333,recall_macro is0.5555555555555555,recall_weightedis0.6333333333333333

3 总结

人工智能模型评估是一个多维度、综合性的过程,涉及从性能测试到误差分析、可解释性和部署后监控等多个方面。有效的模型评估不仅帮助验证和改进模型,还确保了模型在实际应用中的可靠性和合理性。随着AI技术的发展,模型评估的方法和工具也在不断进步,以满足日益增长的应用需求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2

Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2 概要方法1.打开Qt Creator中的Kit,这里我直接附上几张截图,不同的版本打开位置可能有所不同,总之最终目的是要打开构建套件(Kit)2.可以看到构建套件里面有包含了“构建套件K…

深度学习记录--计算图(前向后向传播)

什么是计算图? 从一个例子入手: 将函数J的计算用流程图表示出来,这样的流程图被称为计算图 简单来说,计算图是用来显示每个变量间的关系的一种图 两种传播方式 计算图有两种传播方式:前向传播 和 后向传播 什么是前…

使用dirmap命令行时报错,提示缺少gevent模块

记得以前是可以的,可能是时间长了重装了系统,引起的。 修复方法。升级pip,然后重新下载安装gevent模块。 具体: python -m pip install --upgrade pip 使用下面命令解决下载慢的问题。 pip config set global.index-url http…

【WPF.NET开发】WPF.NET桌面应用开发概述

本文内容 为何从 .NET Framework 升级使用 WPF 进行编程标记和代码隐藏输入和命令控件布局数据绑定图形和动画文本和版式自定义 WPF 应用 Windows Presentation Foundation (WPF) 是一个与分辨率无关的 UI 框架,使用基于矢量的呈现引擎,构建用于利用现…

图片处理OpenCV IMDecode模式说明【生产问题处理】

OpenCV IMDecode模式说明【生产问题处理】 1 前言 今天售后同事反馈说客户使用我们的图片处理,将PNG图片处理为JPG图片之后,变为了白板。 我们图片处理使用的是openCV来进行处理 2 分析 2.1 图片是否损坏:非标准PNG头部 于是,马…

SHAP(六):使用 XGBoost 和 HyperOpt 进行信用卡欺诈检测

SHAP(六):使用 XGBoost 和 HyperOpt 进行信用卡欺诈检测 本笔记本介绍了 XGBoost Classifier 在金融行业中的实现,特别是在信用卡欺诈检测方面。 构建 XGBoost 分类器后,它将使用 HyperOpt 库(sklearn 的 …

【U8+】用友U8删除固定资产卡片,提示:当前卡片不是本月录入的卡片,不能删除。

【问题描述】 用友U8软件,参照已有账套新建账套的时候,选择结转期初余额。 例如:参照已有账套的2022年新建2023年的账套。 结转期初的时候勾选了固定资产模块, 建立成功后登录23年新的账套后,删除固定资产卡片&#xf…

基于Eclipse+SDK+ADT+DDMS的安卓开发环境完整搭建过程

基于EclipseSDKADTDDMS的安卓开发环境完整搭建过程 1 基本概念2 SDK安装3 Eclipse安装4 ADT插件安装4.1 在线安装(太慢不建议选择)4.2 离线安装(建议选择) 5 配置SDK6 集成安装7 创建安卓虚拟设备8 创建并启动安卓虚拟机8 关于DDM…

nextjs入门

创建项目 npx create-next-app 项目名 体验文件路由 nextjs提供了文件路由的功能, 根据文件系统的目录结构, 可以识别为对应的页面路由 创建页面 首先, 在src下创建pages目录, 然后创建一个about文件(对应about页面)和main/index.js文件(对应首页) pages/main/index con…

c语言:整数与浮点数在内存中的存储方式

整数在内存中的存储: 在计算机内存中,整数通常以二进制形式存储。计算机使用一定数量的比特(bit)来表示整数,比如32位或64位。在存储整数时,计算机使用补码形式来表示负数,而使用原码形式来表示…

【计算机网络学习之路】URL概念及组成

目录 一. URL是什么 二. URL的组成 三. encode和decode 前言 本系列文章是计算机网络学习的笔记,欢迎大佬们阅读,纠错,分享相关知识。希望可以与你共同进步。 本篇讲解使用浏览器不可或缺的部分——URL 一. URL是什么 域名及DNS 我们在…

43 - 什么是数据的强、弱一致性?

说到一致性,其实在系统的很多地方都存在数据一致性的相关问题。除了在并发编程中保证共享变量数据的一致性之外,还有数据库的 ACID 中的 C(Consistency 一致性)、分布式系统的 CAP 理论中的 C(Consistency 一致性&…

Android studio Load error:undefined path variables

android stuido 报错 Load error:undefined path variables Gson is undefined 处理方法: 点击进行Sync Project with Gradle Files

Redis——某马点评day02——商铺缓存

什么是缓存 添加Redis缓存 添加商铺缓存 Controller层中 /*** 根据id查询商铺信息* param id 商铺id* return 商铺详情数据*/GetMapping("/{id}")public Result queryShopById(PathVariable("id") Long id) {return shopService.queryById(id);} Service…

文心版吴恩达课程:语义核心(Semantic Kernel)插件的商业应用

文心版吴恩达课程:语义核心(Semantic Kernel)插件的商业应用 Semantic Kernel is an SDK that integrates Large Language Models (LLMs) like OpenAI, Azure OpenAI, and Hugging Face with conventional programming languages like C#, P…

leetcode:225. 用队列实现栈

一、题目 链接:225. 用队列实现栈 - 力扣(LeetCode) 函数原型: typedef struct { } MyStack; MyStack* myStackCreate() void myStackPush(MyStack* obj, int x) int myStackPop(MyStack* obj) int myStackTop(MyStack* obj) …

代码随想录刷题题Day4

刷题的第四天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C / Python Day4 任务 ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II 1 …

大数据技术之Flume(超级详细)

大数据技术之Flume(超级详细) 第1章 概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。 1.2 Flume组成架构 Flume组成架构如…

react-route-dom 实现简单的嵌套路由

最终效果 点击 to test1 点击to test2 > to test21 点击to test2 > to test22 代码如下 path: "page",element: <父组件 />,children: [{ path: "test1", element: <Test1 /> },{path: "test2",element: <Test2 />…

Springboot自定义starter

一、start背景和简介 1.背景 工作中经常需要将多个springboot项目共同的非业务模块抽取出来&#xff0c;比如访问日志、维护请求上下文中的用户信息或者链路id等等。此次模拟的是请求中用户信息维护&#xff0c;方便整个请求中用户信息的取用。 2.作用 根据项目组的实际需求…