人工智能中的模型评估

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_score

y_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技术的发展,模型评估的方法和工具也在不断进步,以满足日益增长的应用需求。

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

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

相关文章

深入解析JVM内存结构:Metaspace、堆与垃圾收集器

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

Overflow Aware Quantization

Overflow Aware Quantization Framework N o _o o​是 amount of arithmetic overflow 辅助信息 作者未提供代码

前端开发环境与真实环境的接口联通的那些最佳实践

1. 背景 前端开发的产物通常是 app.js 、app.css ,然后将这些资源放在真实环境域名下进行工作的。 但前端的开发环境通常是本地的 http://localhost:xxx,业务域名可能是 https://xxx.abc.com,两者不在一个域名下在调用接口或者调试时会非常不…

NacosSync 用户手册

手册目标 理解 NacosSync 组件启动 NacosSync 服务通过一个简单的例子,演示如何将注册到 Zookeeper 的 Dubbo 客户端迁移到 Nacos。 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范…

变量和引用

变量和引用 2.1.深入认识变量 2.1.1.什么是变量 变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址 变量三要素:名称、类型、值 2.1.2.变量的名称 组成: 字母、数字、下划线组成,不能以数字开头 变量名称的长…

PyLMKit(4):基于本地知识库的检索增强生成RAG

基于本地知识库的检索增强生成RAG 0.项目信息 日期: 2023-12-2作者:小知课题: RAG(Retrieval-Augmented Generation,检索增强生成)是一种利用知识库检索的方法,提供与用户查询相关的内容,从而…

代码随想录day3 203.移除列表元素 707.设计链表 206.反转链表

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。 双链表 单链表中的指针域只能指向节点的下一个节点。 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。 双链表 既可以向前查询也可以…

vcomp140.dll是什么意思?vcomp140.dll缺失怎么修复的五个方法

在电脑使用过程中,我们常常会遇到一些错误提示,其中之一就是“由于找不到vcomp140.dll无法继续执行代码”。这个错误提示通常出现在运行某些程序时,给使用者带来了很大的困扰。那么,为什么会出现这个错误呢?又该如何解…

借助ChatGPT帮助程序员解决系统线上问题

对不同的业务以及不同的中间件提问题的方式不同 首先我们在每一种类型的提问前都需要对AI进行定义也就是让AI明白你提问的问题是那个行业的那个技术 定义身份话术 常见的 #接下来的对话你将以一名java高级开发工程师的身份和我聊天 接下来的对话你将以一名XXXX的身份和我聊天提…

关于Typora如何插入自己的云端视频的方法

关于Typora如何插入自己的云端视频的方法 文章目录 关于Typora如何插入自己的云端视频的方法前言:实现步骤:小结 前言: 我本来使用gitee来作为typora的图床,但我现在想要把我自己的视频上传到云端,然后通过超链接在ty…

Programming Contest 2023(AtCoder Beginner Contest 331)D题 Tile Pattern --- 题解

目录 D - Tile Pattern 题目大意: 思路: 代码: D - Tile Pattern D - Tile Pattern (atcoder.jp) 题目大意: 给你一个n和q,n为局部棋盘大小(n*n) 并且给出局部棋盘中黑白子位置的放置情况,q为查询次数…

java的四种内部类,从0讲清楚

什么是内部类? 为什么要学习内部类? 可以发现,发动机虽然跟汽车相关,但发动机不像车龄或颜色一样,只用一个变量就可以描述,而是要有发动机品牌,发动机年限,多个变量描述发动机。那么…

从“芯”到云,看亚马逊云科技如何让未来“平等”发生

文章目录 业界最全面算力选择,有效解决多样性需求多年自研芯片积累,带来性能与性价比双重优势全球基础设施与独特的业务模式,让创新不受限 “科幻作家威廉吉布森说‘未来已至,只是还没有均匀分布’。”2023年6月底,当亚…

【开源存储】minio对象存储部署实践

文章目录 一、前言1、介绍说明2、部署方式3、冗余模式4、约束限制4.1、规格参数4.2、API支持a、minio不支持的Amazon S3 Bucket APIb、minio不支持的Amazon S3 Object API 二、部署说明1、软件安装2、minio单机部署3、minio分布式部署3.1、前置条件3.2、开始运行3.3、操作说明 …

Linux 进程(三)

Linux进程状态的查看: 这是Linux内核源代码对于进程状态的定义: R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。 S睡眠状态(sleeping): 意味着进程在…

ipvlan介绍

最近使用docker,涉及到需要跨多台物理机部署系统,查了好多资料,最后查到了ipvlan。那什么是vlan,什么又是ipvlan。 交换机层面的vlan,是按802.1Q规范,在链路层中加了4字节的标识vlan的数据,交换…

如何在WordPress中批量替换图片路径?

很多站长在使用WordPress博客或者搬家时,需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题。总结一下WordPress图片路径批量替换的过程,方便有此类需求的站长们学习。 什么情况下批量替换图片路径 1、更换了网站域名 有许多网站建设初期…

灯光开不了了,是不是NVIDIA的问题

如果你跟我一样灯光亮度调节不了了,然后显示适配器又没有了,你看一下是不是和我这个大怨种一样把NVIDIA卸了,为了这个东西,这屏幕亮瞎我的眼镜😢😢。只需要进入官网,你就可以直接找到&#xff0…

SSM框架(五):Maven进阶

文章目录 一、分模块开发1.1 分模块开发的意义1.2 步骤 二、依赖管理2.1 依赖传递2.2 可选依赖和排除依赖 三、继承与聚合3.1 聚合3.2 继承3.3 聚合和继承区别 四、属性4.1 pom文件的依赖使用属性4.2 资源文件使用属性 五、多环境开发六、跳过测试七、私服7.1 下载与使用7.2 私…

前端面试灵魂提问(1)

1.自我介绍 2.在实习中,你负责那一模块 3.any与unknow的异同 相同点:any和unkonwn 可以接受任何值 不同点:any会丢掉类型限制,可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查,所以在使用一个…