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

目录

前言

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

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!

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

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

相关文章

一文简单了解Android中的input流程

在 Android 中,输入事件(例如触摸、按键)从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次,包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程,并结合代码逐步了解…

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …

二叉树搜索树(下)

二叉树搜索树(下) 二叉搜索树key和key/value使用场景 key搜索场景 只有key作为关键码,结构中只需要存储key即可,关键码即为需要搜索到的值,搜索场景只需要判断 key在不在。key的搜索场景实现的二叉树搜索树支持增删查…

Web项目版本更新及时通知

背景 单页应用,项目更新时,部分用户会出更新不及时,导致异常的问题。 技术方案 给出版本号,项目每次更新时通知用户,版本已经更新需要刷新页面。 版本号更新方案版本号变更后通知用户哪些用户需要通知?…

D64【python 接口自动化学习】- python基础之数据库

day64 SQL-DQL-基础查询 学习日期:20241110 学习目标:MySQL数据库-- 133 SQL-DQL-基础查询 学习笔记: 基础数据查询 基础数据查询-过滤 总结 基础查询的语法:select 字段列表|* from 表过滤查询的语法:select 字段…

Unity插件-Smart Inspector 免费的,接近虚幻引擎的蓝图Tab管理

习惯了虚幻的一张蓝图,关联所有Tab (才发现Unity,的Component一直被人吐槽,但实际上是:本身结构Unity 的GameObject-Comp结构,是好的不能再好了,只是配上 smart Inspector就更清晰了&#xff0…

2024 年Postman 如何安装汉化中文版?

2024 年 Postman 的汉化中文版安装教程

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法: 注意事项: 2.集成测试 需注意事项: 实现集成测试的方法: 如何实现高效且可靠的集成测试: 3.系统测试 实现系统测试的方法: 须知注意事项: 4.验收测试 实现验…

MySQL 忘记 root 密码,使用跳过密码验证进行登录

操作系统版本:CentOS 7 MySQL 忘记 root 密码,使用跳过密码验证进行登录 修改 /etc/my.cnf 配置文件,在 [mysqld] 后面任意一行添加 skip-grant-tables vim /etc/my.cnf 重启 MySQL systemctl restart mysqld 登录 MySQL(无 -…

3D Web渲染引擎HOOPS Communicator:助力企业打造定制化3D可视化产品的强大工具

HOOPS Communicator为开发人员提供了多样化的定制手段,使其在3D网页可视化领域保持领先地位。很多潜在客户都关心如何利用HOOPS Communicator将其打造成自己产品的独特解决方案。展示我们现有合作伙伴的成功案例正是分享此信息的最佳方式。 每家合作伙伴都在产品中…

【stablediffusion】阿里发布新ID保持项目EcomID, 可从单个ID参考图像生成定制的保ID图像,ComfyUI可使用。

今天,我们将向您介绍一款令人兴奋的更新——阿里发布的ID保持项目EcomID。这是一款基于Stable Diffusion技术的AI绘画工具,旨在为您提供一键式生成高质量保ID图像的便捷体验。无论您是AI绘画的新手还是专业人士,这个工具都能为您带来极大的便…

计算机网络(11)和流量控制补充

这一篇对数据链路层中的和流量控制进行详细学习 流量控制(Flow Control)是计算机网络中确保数据流平稳传输的技术,旨在防止数据发送方发送过多数据,导致接收方的缓冲区溢出,进而造成数据丢失或传输失败。流量控制通常…

【VLANPWN】一款针对VLAN的安全研究和渗透测试工具

关于VLANPWN VLANPWN是一款针对VLAN的安全研究和渗透测试工具,该工具可以帮助广大研究人员通过对VLAN执行渗透测试,来研究和分析目标VLAN的安全状况。该工具专为红队研究人员和安全学习爱好者设计,旨在训练网络工程师提升网络的安全性能&…

ES6代理和反射新特性,详细讲解

代理与反射 es6新增了代理和反射特性&#xff0c;这两个特性为开发者提供了拦截并向基本操作嵌入额外行为的能力。 代理基础 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta charset"UTF-8"&g…

MYSQL 精通索引【快速理解】

目录 1、什么是索引&#xff1f; 2、索引结构 1.为什么不使用二叉树呢&#xff1f; 2.B树数据结果 3.B树 4.Hash结构 3、索引语法 1.创建索引 2.查看索引 3.删除索引 4、SQL性能分析 1.SQL执行频次 2.慢查询日志 3.profile详情 4.EXPLAIN 5、索引规则 1.最左前缀法则 2.索…

光驱验证 MD5 校验和

步骤 1&#xff1a;在 Ubuntu 上打包文件并生成 MD5 校验和 打包文件 使用 tar 命令将文件夹打包成 tar.gz 文件&#xff1a; tar -czvf my_files.tar.gz /path/to/folder 生成 MD5 校验和 使用 md5sum 命令生成打包文件的 MD5 校验和&#xff1a; md5sum my_files.tar.g…

《网络数据安全管理条例》将于2025年1月1日起正式施行,从业者应如何解读?

2024年9月&#xff0c;国务院总理李强签署国务院令&#xff0c;公布了《网络数据安全管理条例》&#xff08;以下简称《条例》&#xff09;&#xff0c;该条例将于2025年1月1日起正式施行。 这一条例的出台&#xff0c;标志着我国在网络数据安全领域的管理迈上了新的台阶&#…

【MMIN】缺失模态想象网络用于不确定缺失模态的情绪识别

代码地址&#xff1a;https://github.com/AIM3RUC/MMIN abstract&#xff1a; 在以往的研究中&#xff0c;多模态融合已被证明可以提高情绪识别的性能。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到模态丢失的问题&#xff0c;而哪些模态会丢失是不确定的。这使得…

【Java Web】监听器类型及其使用

文章目录 监听器使用监听器类型ServletContextListenerHttpSessionListenerServletRequestListenerServletContextAttributeListenerHttpSessionAttributeListenerServletRequestAttributeListenerHttpSessionBindingListener 监听器&#xff08;Listener&#xff09;组件用于监…

conda创建 、查看、 激活、删除 python 虚拟环境

1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all ​​ 助力快速掌握数据集…