机器学习 ---模型评估、选择与验证(1)

news2024/12/28 18:28:55

目录

前言

一、为什么要有训练集与测试集

1、为什么要有训练集与测试集

2、如何划分训练集与测试集

二、欠拟合与过拟合

1、什么是欠拟合与欠拟合的原因 

2、什么是过拟合与过拟合的原因

一些解决模型过拟合和欠拟合问题的常见方法: 

解决过拟合问题:

1、增加数据量

2、正则化

3、简化模型结构

4、早停法

解决欠拟合问题:

1、增加模型复杂度

2、延长训练时间

3、检查数据预处理

4、调整超参数

三、偏差与方差 

1、模型误差来源

2、偏差与方差

四、验证集与交叉验证

1、为什么需要验证集

2、K折交叉验证

3、集成学习

4、自助法

五、衡量回归的性能指标

1、MSE

2、RMSE

3、MAE

4、R-Squared

前言

        本文主要介绍了机器学习中模型评估、选择与验证的相关内容。包括为什么要有训练集与测试集及如何划分;欠拟合与过拟合的概念、原因及解决方法;偏差与方差的内容和模型误差来源;验证集与交叉验证的必要性、K 折交叉验证、集成学习和自助法;以及衡量回归的性能指标如 MSE、RMSE、MAE 和 R--Squared。        

一、为什么要有训练集与测试集

1、为什么要有训练集与测试集

        如果我们想要利用收集的西瓜数据构建一个机器学习模型,用来预测新的西瓜的好坏,但在将模型用于新的测量数据之前,我们需要知道模型是否有效,也就是说,我们是否应该相信它的预测结果。不幸的是,我们不能将用于构建模型的数据用于评估模型的性能。因为我们的模型会一直记住整个训练集,所以,对于训练集中的任何数据点总会预测成正确的标签。这种记忆无法告诉我们模型的泛化能力如何,即预测新样本的能力如何。我们要用新数据来评估模型的性能。新数据是指模型之前没见过的数据,而我们有这些新数据的标签。通常的做法是,我们把手头上的数据分为两部分,训练集与测试集。训练集用来构建机器学习模型,测试集用来评估模型性能。

2、如何划分训练集与测试集

        通常我们将手头数据的百分之 70 或 80 用来训练数据,剩下的百分之 30 或 20 作为测试用来评估模型性能。值得注意的是,在划分数据集之前,我们要先把手头上的数据的顺序打乱,因为我们搜集数据时,数据可能是按照标签排放的。比如,现在有 100 个西瓜的数据,前 50 个是好瓜,后 50 个是坏瓜,如果将后面的 30 个西瓜数据当做测试集,这时测试集中只有坏瓜一个类别,这无法告诉我们模型的泛化能力如何,所以我们将数据打乱,确保测试集中包含所有类别的数据。

二、欠拟合与过拟合

1、什么是欠拟合与欠拟合的原因 

欠拟合:模型在训练集上误差很高;

欠拟合原因:模型过于简单,没有很好的捕捉到数据特征,不能很好的拟合数据。

        如上面例子,我们的数据是一份非线性数据,如果想要用线性回归来拟合这份数据,由于数据是非线性的,模型是线性,则过于简单。所以,无论模型怎么训练,最终都不能很好的拟合数据。

2、什么是过拟合与过拟合的原因

过拟合:在训练集上误差低,测试集上误差高;

过拟合原因:模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,模型泛化能力太差。

        如上面例子,在训练集上,模型为了拟合数据,添加了更多的多次项,使模型过于复杂,对噪音数据也能很好的拟合,所以在训练集上正确率很高,而在测试集上没有这些噪音数据,所以正确率很低。

在分类的问题中,如下例子:

欠拟合:由于模型过于简单,只学习到绿色这个特征,只要是绿色就都判断为树叶,结果将树当做了树叶。

过拟合:模型过于复杂,将锯齿这个普通特征,看的过于重要,认为必须有锯齿才是树叶,结果将树叶误判为不是树叶。

一些解决模型过拟合和欠拟合问题的常见方法: 

解决过拟合问题:

1、增加数据量
  • 数据收集:通过各种途径收集更多与问题相关的数据。例如,对于图像分类任务,可以从互联网上的公开图像数据集获取更多图像,或者自行采集更多符合任务要求的图像。
  • 数据扩充:当难以获取大量真实数据时,可以采用数据扩充技术。对于图像数据,常见的扩充方法包括旋转、翻转、缩放、裁剪、添加噪声等;对于文本数据,可以进行同义词替换、随机插入、随机删除等操作来生成更多类似但又有差异的数据样本。
2、正则化
  • L1 和 L2 正则化:在模型的损失函数中添加正则化项。L1 正则化会促使模型的一些权重趋近于零,从而实现特征选择的效果;L2 正则化则是限制权重的平方和,使得权重的值不会过大,起到抑制过拟合的作用。在许多机器学习框架中,如在训练线性回归、逻辑回归、神经网络等模型时,都可以很方便地设置 L1 或 L2 正则化参数。
  • Dropout:主要应用于神经网络中。在训练过程的每次迭代中,随机地将一部分神经元的输出设置为零,这样可以防止神经元之间过度依赖特定的连接模式,从而降低模型的复杂度,减少过拟合。例如在训练深度神经网络进行图像分类时,在每一层的神经元连接中应用 Dropout 技术,通常设置一个合适的 Dropout 概率,如 0.5 等。
3、简化模型结构
  • 减少层数或神经元数量:对于神经网络,如果模型层数过多或者每层的神经元数量过多,容易导致过拟合。可以尝试减少网络的层数,比如从一个很深的卷积神经网络去掉几层;或者降低每层神经元的数量,例如将某一层原本有 1000 个神经元减少到 500 个。
  • 选择更简单的模型类型:如果使用的是较为复杂的模型,如深度神经网络,而数据量相对较少或问题本身相对简单,可以考虑换成更简单的模型,如线性回归(对于线性关系明显的问题)、决策树(对于可通过简单规则划分的数据)等。
4、早停法

        在模型训练过程中,随着训练轮次的增加,模型在训练集上的误差会不断降低,但在验证集上的误差可能会先降低后升高。早停法就是监测验证集上的误差,当验证集上的误差开始上升时(表明模型开始过拟合训练集),就停止训练,从而得到一个在泛化能力上相对较好的模型。例如,在训练一个深度学习模型时,每隔一定的训练轮次(如每 10 轮)就评估一次模型在验证集上的性能,一旦发现验证集性能下降,就停止训练。

解决欠拟合问题:

1、增加模型复杂度
  • 增加层数或神经元数量:对于神经网络,若发现模型存在欠拟合,可以尝试增加网络的层数,比如在一个浅层的卷积神经网络基础上再添加几层;或者增加每层神经元的数量,例如将某一层原本有 200 个神经元增加到 400 个。
  • 使用更复杂的模型类型:如果当前使用的是简单模型,如线性回归,而数据呈现出明显的非线性关系,那么可以考虑换成更复杂的模型,如多项式回归(在线性回归基础上增加多项式项)、神经网络等。
2、延长训练时间

        如果模型训练时间过短,可能导致模型还没有充分学习到数据中的规律,从而出现欠拟合。可以适当延长训练时间,比如将原本训练 100 轮次增加到 200 轮次,让模型有更多机会去学习数据中的模式。

3、检查数据预处理
  • 特征工程:确保进行了充分的特征工程,例如对数据进行标准化、归一化等操作,使得数据更适合模型学习。如果数据没有经过合理的预处理,可能会影响模型的学习效果,导致欠拟合。
  • 数据清理:检查数据中是否存在大量错误、缺失值等情况。如果有,需要进行相应的清理操作,如填充缺失值、纠正错误值等,以便模型能够更好地学习数据。
4、调整超参数

        不同的超参数设置会影响模型的学习效果。对于一些模型,如神经网络,可以调整学习率、批量大小等超参数。如果学习率过大,可能导致模型无法稳定地学习数据,出现欠拟合;如果学习率过小,又会导致训练时间过长。通过尝试不同的超参数组合,找到一个更适合的设置,有助于解决欠拟合问题。

三、偏差与方差 

1、模型误差来源

        在上一部分,我们知道了欠拟合是模型在训练集上误差过高,过拟合模型是在训练集上误差低,在测试集上误差高。那么模型误差的来源是什么呢?

        其实,模型在训练集上的误差来源主要来自于偏差,在测试集上误差来源主要来自于方差。

        上图表示,如果一个模型在训练集上正确率为 80%,测试集上正确率为 79% ,则模型欠拟合,其中 20% 的误差来自于偏差,1% 的误差来自于方差。如果一个模型在训练集上正确率为 99%,测试集上正确率为 80% ,则模型过拟合,其中 1% 的误差来自于偏差,19% 的误差来自于方差。

        可以看出,欠拟合是一种高偏差的情况。过拟合是一种低偏差,高方差的情况。

2、偏差与方差

  • 偏差:预计值的期望与真实值之间的差距;
  • 方差:预测值的离散程度,也就是离其期望值的距离。

        以射击打靶为例,蓝色的小点是我们在靶子上的射击记录,蓝色点的质心(黑色点)到靶心的距离为偏差,某个点到质心的距离为方差。所以,某个点到质心的误差就是由偏差与方差所组成。那么,为什么欠拟合是一直高偏差情况,过拟合是一种低偏差高方差情况呢?

        我们知道,欠拟合是因为模型过于简单,模型过于简单我们可以当做是我们射击时射击的范围比较小,它所涵盖的范围不包括靶心,所以无论怎么射击,射击点的质心离靶心的距离都很远,所以偏差很高。但是因为射击范围很小,所以所有射击点相互离的比较紧密,则方差低。

        而过拟合是因为模型过于复杂,我们可以理解为这个时候射击的范围很大了,经过不断的训练射击的点的质心离靶心的距离很近了,但是由于数据量有限,而射击范围很大,所以所有射击点之间非常离散,也就是方差很大。

四、验证集与交叉验证

1、为什么需要验证集

        在机器学习中,通常需要评估若⼲候选模型的表现并从中选择模型。这⼀过程称为模型选择。可供选择的候选模型可以是有着不同超参数的同类模型。以神经网络为例,我们可以选择隐藏层的个数,学习率大小和激活函数。为了得到有效的模型,我们通常要在模型选择上下⼀番功夫。从严格意义上讲,测试集只能在所有超参数和模型参数选定后使用⼀次。不可以使用测试数据选择模型,如调参。由于无法从训练误差估计泛化误差,因此也不应只依赖训练数据选择模型。鉴于此,我们可以预留⼀部分在训练数据集和测试数据集以外的数据来进⾏模型选择。这部分数据被称为验证数据集,简称验证集。

举个例子:

        我们一般是通过考试衡量学生的学习情况。老师上完课后,给学生布置的作业相当于训练数据集,中期的测试题相当于验证集,期末考试题相当于测试数据集。为了更加客观的衡量学生学习情况,期末考试题的内容不应该出现在平常的作业题和中期的测试题中,因为之前做过的题,对于计算机而言,相当于已经记住了,如果再次做同样的题,准确率就会很高。同样的道理,平常的作业题也不应该出现在中期的测试题里。中期的测试题,是为了掌握学生的学习情况,了解自己哪些方面内容没掌握,从而调整下一步学习的方向,为期末考试做好准备。

2、K折交叉验证

        由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。⼀种改善的方法是 K 折交叉验证。在 K 折交叉验证中,我们把原始训练数据集分割成 K 个不重合的子数据集,然后我们做K次模型训练和验证。每⼀次,我们使用⼀个子数据集验证模型,并使用其它 K−1 个子数据集来训练模型。在这 K 次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这 K 次训练误差和验证误差分别求平均。
        K 的值由我们自己来指定,如以下为 5 折交叉验证:

        还是以考试为例,解释上图内容。交叉验证,相当于把平常的作业题和中期的测试题合并成一个题库,然后等分成几份。图中所示,将题库分成了五份,第一行的意思是,先让学生做后面的四份训练题,再用第一份题进行测试。以此类推,再重复四次,每一次相当于重新进行学习。最后,取五次的平均成绩,平均成绩高,说明学生学习情况好,对应到模型,就是超参数更好。

3、集成学习

        在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型。集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差、偏差或改进预测的效果。

4、自助法

        在统计学中,自助法是一种从给定训练集中有放回的均匀抽样,也就是说,每当选中一个样本,它等可能地被再次选中并被再次添加到训练集中。自助法以自助采样法为基础,给定包含 m 个样本的数据集 D,我们对它进行采样产生数据集 D';每次随机从 D 中挑选一个赝本,将其拷贝放入 D',然后再将该样本放回初始数据集 D 中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行 m 次后,就得到了包含m个样本的数据集 D',这就是自助采样的结果。自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差

五、衡量回归的性能指标

        大家知道已经,机器学习通常都是将训练集上的数据对模型进行训练,然后再将测试集上的数据给训练好的模型进行预测,最后根据模型性能的好坏选择模型,对于分类问题,大家很容易想到,可以使用正确率来评估模型的性能,那么回归问题可以使用哪些指标用来评估呢?

1、MSE

        MSE (Mean Squared Error)叫做均方误差,公式如下:

\frac{1}{m}\sum_{i = 1}^{m}(y^{i}-p^{i})^{2}

        其中y^{i} 表示第 i 个样本的真实标签,p^{i} 表示模型对第 i 个样本的预测标签。线性回归的目的就是让损失函数最小。那么模型训练出来了,我们在测试集上用损失函数来评估模型就行了。

2、RMSE

        RMSE(Root Mean Squard Error)均方根误差,公式如下:

\sqrt{\frac{1}{m}\sum_{i = 1}^{m}(y^{i}-p^{i})^{2}}

        RMSE 其实就是 MSE 开个根号。有什么意义呢?其实实质是一样的。只不过用于数据更好的描述。

        例如:要做房价预测,每平方是万元,我们预测结果也是万元。那么差值的平方单位应该是千万级别的。那我们不太好描述自己做的模型效果。怎么说呢?我们的模型误差是多少千万?于是干脆就开个根号就好了。我们误差的结果就跟我们数据是一个级别的了,在描述模型的时候就说,我们模型的误差是多少万元。

3、MAE

        MAE (平均绝对误差),公式如下:

\frac{1}{m}\sum_{i = 1}^{m}\left | y^{i}-p^{i} \right |

        MAE 虽然不作为损失函数,确是一个非常直观的评估指标,它表示每个样本的预测标签值与真实标签值的 L1 距离。

4、R-Squared

        上面的几种衡量标准针对不同的模型会有不同的值。比如说预测房价 那么误差单位就是万元。数字可能是 3,4 ,5 之类的。那么预测身高就可能是 0.1,0.6 之类的。没有什么可读性,到底多少才算好呢?不知道,那要根据模型的应用场景来。 看看分类算法的衡量标准就是正确率,而正确率又在 0~1 之间,最高百分之百。最低 0 。如果是负数,则考虑非线性相关。很直观,而且不同模型一样的。那么线性回归有没有这样的衡量标准呢?
 R-Squared 就是这么一个指标,公式如下:

        其中y_{mean}表示所有测试样本标签值的均值。为什么这个指标会有刚刚我们提到的性能呢?

        其实分子表示的是模型预测时产生的误差,分母表示的是对任意样本都预测为所有标签均值时产生的误差,由此可知:

  1. 当我们的模型不犯任何错误时,R-Squared取最大值 1。
  2. 当我们的模型性能跟基模型性能相同时,R-Squared取 0。
  3. 如果为负数,则说明我们训练出来的模型还不如基准模型,此时,很有可能我们的数据不存在任何线性关系。

内容参考头歌平台中机器学习的内容 

Over!

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

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

相关文章

第74期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

SpringBoot(八)使用AES库对字符串进行加密解密

博客的文章详情页面传递参数是使用AES加密过得,如下图所示: 这个AES加密是通用的加密方式,使用同一套算法,前端和后端都可以对加密之后的字符串进行加密解密操作。 目前线上正在使用的是前端javascript进行加密操作,将加密之后的字符串再传递到后端,PHP再进行解密操作。…

JavaScript逆向爬虫教程-------基础篇之JavaScript密码学以及CryptoJS各种常用算法的实现

目录 一、密码学介绍 1.1 为什么要学密码学?1.2 密码学里面学哪一些 二、字符编码三、位运算四、Hex 编码与 Base64 编码 4.1 Hex 编码4.2 Base64 编码 五、消息摘要算法 5.1 简介5.2 JS中的MD5、SHA、HMAC、SM3 六、对称加密算法 6.1 介绍6.2 加密模式和填充方式6.3 CryptoJ…

《实时流计算系统设计与实现》-Part 2-笔记

做不到实时 做不到实时的原因 实时计算很难。通过增量计算的方式来间接获得问题的(伪)实时结果,即使这些结果带有迟滞性和近似性,但只要能够带来尽可能最新的信息,那也是有价值的。 原因可分成3个方面: …

gdb调试redis。sudo

1.先启动redis-server和一个redis-cli。 2.ps -aux|grep reids查看redis相关进程。 3.开始以管理员模式附加进程调试sudo gdb -p 2968.注意这里不能不加sudo,因为Redis 可能以 root 用户启动,普通用户无法附加到该进程。否则就会出现可能下列情形&#…

长连接配置以及断线重连

目录 长连接index 主要进行连接 import SockJS from "sockjs-client"; import Stomp from "stompjs"; import { notification } from "antd"; // 网络请求API import { nowApiAddressObj } from "../api/nowApiAddressObj";// 工具 i…

LeetCode【0054】螺旋矩阵

本文目录 1 中文题目2 求解方法:数学模拟2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例: 提示: 1 ≤ m …

万字长文解读深度学习——训练(DeepSpeed、Accelerate)、优化(蒸馏、剪枝、量化)、部署细节

🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总万字长文解读…

C#版使用融合通信API发送手机短信息

目录 功能实现 范例运行环境 实现范例 类设计 类代码实现 调用范例 总结 功能实现 融合云通信服务平台,为企业提供全方位通信服务,发送手机短信是其一项核心功能,本文将讲述如何使用融合云服务API为终端手机用户发送短信信息&#xf…

第四十五章 Vue之Vuex模块化创建(module)

目录 一、引言 二、模块化拆分创建方式 三、模块化拆分完整代码 3.1. index.js 3.2. module1.js 3.3. module2.js 3.4. module3.js 3.5. main.js 3.6. App.vue 3.7. Son1.vue 3.8. Son2.vue 四、访问模块module的state ​五、访问模块中的getters ​六、mutati…

如何解决不能将开发板连接到虚拟机的问题(连接显示灰色,不能选中)

-- 如果连接上rk3588单片机,虚拟机无法来连接,如何更改 -- 先将虚拟机关机 -- 将虚拟机的配置文件以文本文件的形式打开 -- 再将所有的FALSE改为TRUE即可 -- 然后再次打开虚拟机即可

什么是白盒测试

一、什么是白盒测试 白盒测试又称结构测试、逻辑驱动测试或基于代码的测试。 白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。 "白盒"法需要测试者…

图形 2.6 伽马校正

伽马校正 B站视频:图形 2.6 伽马校正 文章目录 伽马校正颜色空间传递函数 Gamma校正校正过程为什么需要校正?CRT与转换函数 为什么sRGB在Gamma 0.45空间? 人对亮度的敏感韦伯定律中灰值 线性工作流不在线性空间下进行渲染的问题统一到线性空…

Android setContentView执行流程(一)-生成DecorView

Android setContentView执行流程(一)-生成DecorView Android setContentView执行流程(二)-将布局添加到mContentParent setContentView的流程主要就是讲在Activity的onCreate方法中调用setContentView方法之后,我们自定义的xml文件加载的过程,学习它可以…

【计算机网络】【网络层】【习题】

计算机网络-网络层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程,表(a)是路由表 R1 初始的路由表,表(b)是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表(c)。…

图像处理实验四(Adaptive Filter)

一、Adaptive Filter简介 自适应滤波器(Adaptive Filter)是一种能够根据输入信号的统计特性自动调整自身参数以达到最佳滤波效果的滤波器。它广泛应用于信号处理领域,如信道均衡、系统识别、声学回波抵消、生物医学、雷达、波束形成等模块。 …

typedef 与 extern 的结合:一场误解的澄清

typedef 与 extern 的结合:一场误解的澄清 一、typedef 的基本用法二、extern 的基本用法三、typedef 与 extern 的结合:一场误解的澄清示例二:使用 extern 声明外部变量示例三:错误的用法:尝试在 typedef 中使用 extern四、总结在C语言编程的世界里,typedef和extern是两…

Qt_day5_常用类

常用类 目录 1. QString 字符串类(掌握) 2. 容器类(掌握) 2.1 顺序容器QList 2.2 关联容器QMap 3. 几种Qt数据类型(熟悉) 3.1 跨平台数据类型 3.2 QVariant 统一数据类型 3.3 QStringList 字符串列表 4. QD…

HashMap的put流程知道吗

HashMap 的 put 方法算是 HashMap 中比较核心的功能了,复杂程度高但是算法巧妙,同时在上一版本的基础之上优化了存储结构,从链表逐步进化成了红黑树,以满足存取性能上的需要。本文逐行分析了 put 方法的执行流程,重点放…

鸿蒙UI开发——实现环形文字

1、背 景 有朋友提问:您好关于鸿蒙UI想咨询一个问题 如果我想实现展示环形文字是需要通过在Text组件中设置transition来实现么,还是需要通过其他方式来实现。 针对这位粉丝朋友的提问,我们做一下解答。 2、实现环形文字效果 ❓ 什么是环形…