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

从0开始学习机器学习--Day19--学习曲线

一般来说,如果一个算法的表现不理想,那么多半是因为出现了欠拟合或过拟合问题,这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题,亦或是二者皆有,这有助于我们精准定位问题所在。

之前,我们发现假设函数多项式的次数越高,代价函数的误差就越小,假设我们把多项式的次数作为横坐标,训练集代价函数的误差为纵坐标画图,呈现出来的应该是随着横坐标增大纵坐标不断减小的图像:

随着多项式次数增加两种代价函数的变化情况

但如果换做是验证集的假设函数,图像又有所不同。可以看到在 d=2的时候,其误差确实小了,这反映的是其预测值和实际值之间的误差变小,但当 d=4时,出现了过拟合的情况,此时预测值与实际值之间的差又变大,所以其曲线又往上升而不是继续下降,这进一步地说明了为什么我们采用验证集的参数而不是直接用训练集的。

也就是说,通过比较训练集和验证集代价函数的误差,可以确定到底是出现了什么问题。假如两者都很大且两者差值较小,则说明式出现了高偏差、欠拟合的情况,应该适当增大多项式的次数;如果训练集的误差远远小于验证集的误差,则说明出现了高方差、过拟合的情况,需要适当减小多项式的次数。

正则化和偏差、方差(Regularization and bias/variance)

在之前学习正则化的时候,我们知道通过正则化参数,可以挑选出不太重要的参数项,从而决定多项式的次数。但之前我们基本默认 \lambda =1 or \lambda =10,那么在实际情况中我们该怎么挑选合适的\lambda呢?

假设我们的假设函数是4次项的多项式,我们按从小到大的顺序将不同的\lambda带入代价函数算出参数,注意这里的\lambda是按照2倍的速度增长的,当增加到12次时,大概是10.24,这里省略了小数点:

带入不同\lambda值计算参数

计算完结果后,再跟上述一样带入到验证集的代价函数中去计算验证集误差,其中误差最小对应的\lambda就是我们想要的正则化参数。当然,就算得到了结果,也还是要将在验证集得到的参数带入到测试集的代价函数进行最终验证。

同样的,我们画出训练集代价函数和验证集代价函数关\lambda 的图像:

随着\lambda增加两种代价函数的变化情况

可以看到,当\lambda很大时,此时函数处于欠拟合高偏差的问题中,训练集和验证集的代价函数误差都会很大且很接近;当\lambda很小时,函数处于过拟合、高方差的情况,训练集由于是用自己的数据拟合,拟合的好,误差很小,而验证集的误差则远远大于训练集。一般来说,验证集代价函数的误差最小时,该点的\lambda应该是刚好适合假设函数的正则化参数。

学习曲线(Learning curves)

在上述说法中我们通过对比两种代价函数的误差表现来判断出现什么问题,事实上,我们一般采用画出学习曲线的方式来判断算法的表现好坏,横坐标是训练样本个数,纵坐标是代价函数的误差。但与以往不同,我们对横坐标加以限制,用很少量的样本个数(10,20,30等等)来观察两种代价函数的表现。

两种代价函数误差关于样本个数m的图像

假设我们采用二次幂的多项式来拟合,可以观察到,当样本个数m很小(1-3)时,曲线会拟合得很好,样本个数到4的时候,能看出曲线已经开始有些偏离了,也就是说,随着样本个数的增加,训练集的代价函数的误差也会随之增大。对于验证集的代价函数来说,在样本个数很小的时候,其误差会很大,原因是其参数的基础只是几个样本,其对于新样本的效果自然很低;当样本个数逐渐增加,算法分析的特征越来也多,意味着其对于新样本的判断能力在逐渐增加,表现在图像上则是验证集代价函数的误差在逐渐减小。

高偏差时两种误差的表现

可以观察到,两种曲线跟刚刚相比也是类似的变化,当样本更加到一定程度时其误差基本保持不变,与其不同的是,由于这里是用直线来拟合,样本个数过大而参数过小,所以当样本个数增加到一定值时,两者的误差基本相等。

高方差时两种误差的表现

如果换成高次幂比如100次方,其曲线与上述相比,训练集的误差在样本数量增加到一定程度后还是基本不变,但验证集的误差则会一直下降,这是因为样本的个数的增加对验证集来说,其由于对数据更敏感相当于接触到了更多的变化来排除原本数据的一些不好的数据(俗称“噪声”),这说明增加样本数量对于高偏差的情况基本没有帮助,但在高方差时表现良好。

在之前,我们总结了一些可能可以改善算法的方法,在这里对这些方法的用途做一个概括。

对于高方差问题来说:

  1. 增加样本个数,使验证集代价函数感受到更多的变化,使其误差持续减小;

  2. 减少特征量,让函数专注在有用的特征上,加强拟合效果;

  3. 增大\lambda,能够增加特征使其拟合效果更好。

对于高偏差问题来说:

  1. 增加特征量或多项式特征,也就是增加函数的复杂程度,使其更贴合训练样本;

  2. 减小\lambda,能够减少不必要的特征和“噪声”,减弱过拟合效果。

而在使用神经网络来构建模型时,与之相对的,使用较少的隐藏层和隐藏单元,在架构中所用到的参数就不会很多,会出现欠拟合的现象,其计算量较少;假如用很多隐藏单元或者很多层隐藏层,则会出现过拟合现象,不过我们可以通过加入正则项来解决这个问题(一般为了避免我们会直接添加,而不是等到了出现过拟合再作正则化操作),所以一般越大型、越复杂的神经网络效果越好。

视频参考链接:https://www.bilibili.com/video/BV1By4y1J7A5?spm_id_from=333.788.player.switch&vd_source=867b8ecbd62561f6cb9b4a83a368f691&p=64


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

相关文章:

  • [全网最完整最详细C++篇]第四篇:类和对象(上)
  • 我的博客网站为什么又回归Blazor了
  • DevOps业务价值流:架构设计最佳实践
  • VMware Workstation安装Centos系统
  • FlexRay介绍
  • Backend - Python 爬取网页数据并保存在Excel文件中
  • Moment.js、Day.js、Miment,日期时间库怎么选?
  • leetcode hot100【LeetCode 17.电话号码的字母组合】java实现
  • 快速开发工具 Vite
  • 大模型微调技术 --> IA3
  • LeetCode 每日一题 长度为 K 的子数组的能量值
  • 牛客小白月赛104-D小红开锁-模拟
  • c++:stack,queue,priority_queue模拟实现
  • 软件设计师中级 第9章 数据库技术基础
  • 从零开始学习python 7(持续更新ing)
  • 有趣的Midjourney作品赏析(附提示词)
  • Leetcode 长度最小的子数组
  • 06 Oracle性能优化秘籍:AWR、ASH、SQL trace与实时监控的实战指南
  • git基础操作
  • Python的函数
  • CDN到底是什么?
  • C++算法探索:从排序到动态规划
  • java卷上天,转行可以干什么?
  • 声纹识别中,向量距离那种计算方式最合适
  • aLoNg3x.2 | CrackMe
  • Servlet-Filter