人工智能中的模型评估

news2025/1/27 13:10:07

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

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

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

相关文章

OpenSSH 漏洞修复升级最新版本

Centos7系统ssh默认版本一般是OpenSSH7.4左右,低版本是有漏洞的而且是高危漏洞,在软件交付和安全扫描上是过不了关的,一般情况需要升级OpenSSH的最新版本 今天详细说下升级最新版本的处理过程(认真看会发现操作很简单&#xff0c…

设计模式-结构型模式之外观设计模式

文章目录 七、外观模式 七、外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类…

【vue-router】useRoute 和 useRouter 的区别

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

pandas美化表格并导出到Excel

美化Excel表格用两种方式,一种是用Pandas自带的Dataframe.style类并通过CSS来改变样式,另外一种是通过Excel引擎来直接修改Excel样式。 Dataframe.style Dataframe.style可以美化Pandas样式。导出样式到Excel的功能只有openpyxl渲染引擎支持。 大于平均数的单元格背景变色…

【重点】【双指针】11. 盛最多水的容器

题目 注意&#xff1a;二维接雨水&#xff0c;有墙的&#xff0c;有线的&#xff0c;着这个属于线的。 class Solution {public int maxArea(int[] height) {if (height.length < 2) {return 0;}int left 0, right height.length - 1, res 0;while (left < right) {…

【Java 基础】16 泛型

文章目录 什么是泛型&#xff1f;泛型的声明泛型的使用泛型方法通配符和泛型上下界1&#xff09;通配符2&#xff09;泛型上下界 泛型的好处注意事项 泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型&#xff0c;我们可以编写更加 通用、 灵活、 可读性高的…

C#,数值计算——插值和外推,三次样条插值(Spline_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 三次样条插值 /// Cubic Spline Interpolation /// Cubic spline interpolation object. Construct with x and y vectors, and /// (optionally) values of the first…

Vue基础知识点梳理

在Vue中&#xff0c;被用来响应地更新HTML属性的指令是v-model页面挂载成功之后会触发哪一个钩子函数mounted挂载之后会进行页面的渲染v-on是动作元素不属于条件渲染指令 在Vue中&#xff0c;下列关于Vue实例对象说法不正确的是&#xff08;&#xff09;。A.Vue实例对象是通过n…

Vulhub-信息泄露

1.Jetty WEB-INF 敏感信息泄露漏洞&#xff08;CVE-2021-28164&#xff09; docker-compose up -d 启动环境&#xff0c;显示8080端口被占用 修改 docker-compose.yml 中的映射端口 curl 访问 http://192.168.48.129:8090/WEB-INF/web.xml 显示404&#xff1a; 通过 %2e 绕过…

C++的类和对象(一)

目录 1、面向过程和面向对象初认识 2、为什么要有类 3、类的定义 类的两种定义方式 4、类的访问限定符 5、类的作用域 5.1 为什么要有作用域&#xff1f; 5.2类作用域 6、类的实例化 6.1类的实例化的定义 6.2类的实例化的实现 6.3经典面试题 7、类对象 7.1类对…

HarmonyOS——解决本地模拟器无法选择设备的问题

在使用deveco studio进行鸿蒙开发的时候&#xff0c;可能会遇到本地模拟器已经启动了&#xff0c;但是仍然无法选择本地模拟器中的设备&#xff0c;尤其在MAC环境中尤为常见。 解决办法&#xff1a; 先打开IDE启动本地模拟器&#xff0c;等模拟器启动后&#xff0c;退出IDE重新…

【每日OJ —— 572. 另一棵树的子树】

每日OJ —— 572. 另一棵树的子树 1.题目&#xff1a;572. 另一棵树的子树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;572. 另一棵树的子树 2.解法 2.1.算法讲解 通过深度优先遍历&#xff0c;来判断二叉树root的每个节点的值是否和subRoot的每个节点…

排序算法总结(Python、Java)

Title of Content 1 冒泡排序 Bubble sort&#xff1a;两两交换&#xff0c;大的冒到最后概念排序可视化代码实现Python - 基础实现Python - 优化实现Java - 优化实现C - 优化实现C - 优化实现 2 选择排序 Selection sort&#xff1a;第i轮遍历时&#xff0c;将未排序序列中最小…

nodejs微信小程序+python+PHP贵州旅游系统的设计与实现-计算机毕业设计推荐MySQL

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

2022年8月2日 Go生态洞察:Go 1.19版本发布深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

buuctf [极客大挑战 2019]Havefun1

解题思路&#xff1a; 小习惯 本题先看看源码或者检查一下&#xff0c;可能这是俺的一个小习惯。 源码里面都看到了php的代码 php代码解析&#xff1a; $cat$_GET[cat]; echo $cat; if($catdog){ echo Syc{cat_cat_cat_cat}; } 1.$ca…

vue3-vite-ts:编写Rollup插件并使用 / 优化构建过程

一、vue3-vite-ts项目&#xff0c;编写Rollup插件并使用的意义 在使用Vue3 Vite TypeScript这种技术栈时&#xff0c;可以使用Rollup插件来优化构建过程&#xff0c;例如使用rollup-plugin-typescript2插件来编译TypeScript代码&#xff0c;使用rollup-plugin-vue插件来处理…

C指针介绍(1)

文章目录 每日一言指针的简单介绍内存和地址指针在内存中的存储指针的定义和声明泛型指针 指针的关系运算算数运算关系运算 结语 每日一言 ⭐「 一声梧叶一声秋&#xff0c;一点芭蕉一点愁&#xff0c;三更归梦三更后。 」–水仙子夜雨-徐再思 指针的简单介绍 C语言指针是C语…

半监督节点分类上的HyperGCN

1.Title HyperGCN: Hypergraph Convolutional Networks for Semi-Supervised Classification&#xff08;Naganand Yadati、Prateek Yadav、Madhav Nimishakavi、Anand Louis、Partha Talukdar&#xff09;【ACM Transactions on Knowledge Discovery from Data 2022】 2.Conc…

SimpleDataFormat 非线程安全

目录 前言 正文 1.出现异常 2.解决方法1 3.解决方法2 总结 前言 SimpleDateFormat 类是 Java 中处理日期和时间格式化和解析的类&#xff0c;但它并不是线程安全的。这意味着多个线程不能安全地共享一个 SimpleDateFormat 实例进行日期和时间的解析和格式化。当多个…