当前位置: 首页 > news >正文

机器学习 ---模型评估、选择与验证(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!


http://www.mrgr.cn/news/75184.html

相关文章:

  • Redis 性能优化 18招
  • 知识图谱介绍
  • 纯血鸿蒙NEXT-组件导航 (Navigation)
  • vim 一次注释多行 的几种方法
  • YOLO入门教程(三)——训练自己YOLO11实例分割模型并预测【含教程源码+一键分类数据集 + 故障排查】
  • Linux tcpdump 详解教程
  • cache中命中率和平均访问时间
  • RK3568平台开发系列讲解(platform虚拟总线驱动篇)platform总线模型
  • Shell脚本的使用
  • CPLD架构
  • KPaaS洞察|统一管理模式下跨系统用户权限修改流程详解
  • python进阶-01-利用Xpath来解析Html
  • 除自身以外数组的乘积
  • 关于GCC内联汇编(也可以叫内嵌汇编)的简单学习
  • 共享旅游卡项目深度解读,风险与机遇并存
  • Java 常见的面试题(Kafka)
  • 三天精通一种算法之移除数组元素(暴力)(快慢指针)
  • MySQL数据库:SQL语言入门 【2】(学习笔记)
  • Spring Security概述
  • 基于树莓派的日志抓取工具制作
  • 代理通讯链实现内网通讯
  • 探秘 RPC:揭开远程过程调用的实现原理
  • 如何在python中模拟重载初始化函数?
  • 下载|阿里云等联合编写的《2024大模型典型示范应用案例集》发布
  • 「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
  • Jdbc学习笔记(四)--PreparedStatement对象、sql攻击(安全问题)