过拟合产生的原因(Root of Overfitting)
之前在《过拟合和欠拟合(Over fitting & Under fitting)》一文中简要地介绍了过拟合现象,现在来详细地分析一下过拟合产生的原因以及相应的解决办法。
过拟合产生的原因:
第一个原因就是用于训练的数据量太少。这个很好理解,因为理想的训练数据是从所有数据中抽取的无偏差抽样。如果训练数据量较少,那么很有可能训练数据就不能完全反映所有数据的规律。因此模型很可能学习到的是一些特殊的例子,而不是真实的规律。
之前说过,过拟合就是模型把噪音也学习了进去。其中一个噪音就是大家所熟知的随机产生的噪音
(stochastic noise),比如说测量误差,记录误差等等,这也是第二个原因。
第三个原因是目标函数的复杂度很高,目标函数和假设函数之间的差距也可以看作是一种噪音,称为确定性噪音(deterministic noise)。在训练数据有限的情况下,如果目标函数很复杂,那么就算假设函数与之很接近,也会产生较大的噪音。
下图展现了在训练数据有限的情况下,目标函数和假设函数之间的差距。
- 左图:目标函数是一个十次多项式函数,根据目标函数产生了15个数据点,数据产生时加入了一些随机噪音,分别使用二次多项式(绿线)和十次多项式(红线)拟合
- 右图:目标函数是一个五十次多项式函数,根据目标函数产生了15个数据点,数据产生时不加入噪音,分别使用二次多项式(绿线)和十次多项式(红线)拟合

经过试验,这两个场景都是十次多项式的训练误差小,但是其验证误差要比二次多项式的大很多。这说明十次多项式发生了过拟合现象。
下图是用二次多项式和十次多项式拟合的学习曲线:

可以看出,十次多项式函数的训练误差一直要比二次多项式函数的低,但是当训练数据有限时,十次多项式函数的验证误差要比二次多项式函数的高不少。
一般我们会认为假设函数离目标函数越接近越好,但是显然,在训练数据有限的情况下,这种想法是不正确的。因此,当训练数据有限时,应该用简单的模型来拟合,这样还有可能会取得不错的效果。之前是不是常听到别人说线性回归模型虽然很简单,但是往往会取得不错的预测效果?这也正说明了这个道理。
下图是当目标函数复杂度固定时,样本量与噪音强度对过拟合程度的影响(深红色表示过拟合程度很高):

可以看出,样本量越少,噪音强度越高,过拟合程度也就越高。
下图是当噪音强度固定时,样本量与目标函数复杂度对过拟合程度的影响(深红色表示过拟合程度很高):

可以看出,样本量越少,目标函数复杂度越高,过拟合程度也就越高。
这两张图的区别在于左下角,可以看到,第二张图,当样本量很少,目标函数复杂度很低时,也会产生过拟合现象。这是因为使用了过于复杂的模型来拟合数据,这也带出了第四个原因---模型复杂度比目标函数高。
总结一下过拟合产生的原因:
- 训练数据太少
- 数据噪音强度大:随机噪音(stochastic noise),确定性噪音(deterministic noise)
- 模型复杂度太高
解决办法:
- 增加训练数据量 --- 一般情况下,由于经济条件的限制,我们没有办法获得更多的训练数据。如果没有办法获得更多的训练数据,那么可以对已有的样本进行简单的变换,从而获得更多的样本。比如识别手写数字时,可以把数字稍作倾斜,又或者识别图像时,可以对图像做翻转,这样特征发生改变,但是目标保持不变,这样就可以当成产生一些新的样本,称为虚拟样本。但是需要注意,这种方法产生的数据不一定符合原有数据的分布,因此新构建的虚拟样本要尽量合理。
- 减少随机噪音 --- 可以清洗数据(比如:修正不准确的点,删除不准确的点,等),但是如果这些点相比训练数据很少的话,这种处理产生的效果不太明显。
- 减少确定性噪音,降低模型复杂度 --- 使用简单的模型拟合数据;对现有模型进行正则化。
过拟合产生的原因(Root of Overfitting)的更多相关文章
- 机器学习(四)正则化与过拟合问题 Regularization / The Problem of Overfitting
文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人 ...
- Ng第七课:正则化与过拟合问题 Regularization/The Problem of Overfitting
7.1 过拟合的问题 7.2 代价函数 7.3 正则化线性回归 7.4 正则化的逻辑回归模型 7.1 过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设预测可能能够非常好地适应训练 ...
- 过度拟合(overfitting)
我们之前解决过一个理论问题:机器学习能不能起作用?现在来解决另一个理论问题:过度拟合. 正如之前我们看到的,很多时候我们必须进行nonlinear transform.但是我们又无法确定Q的值.Q过小 ...
- AI - TensorFlow - 过拟合(Overfitting)
过拟合 过拟合(overfitting,过度学习,过度拟合): 过度准确地拟合了历史数据(精确的区分了所有的训练数据),而对新数据适应性较差,预测时会有很大误差. 过拟合是机器学习中常见的问题,解决方 ...
- TensorFlow实战第六课(过拟合)
本节讲的是机器学习中出现的过拟合(overfitting)现象,以及解决过拟合的一些方法. 机器学习模型的自负又表现在哪些方面呢. 这里是一些数据. 如果要你画一条线来描述这些数据, 大多数人都会这么 ...
- 防止过拟合的方法 预测鸾凤花(sklearn)
1. 防止过拟合的方法有哪些? 过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合. 产生过 ...
- TensorFlow从1到2(八)过拟合和欠拟合的优化
<从锅炉工到AI专家(6)>一文中,我们把神经网络模型降维,简单的在二维空间中介绍了过拟合和欠拟合的现象和解决方法.但是因为条件所限,在该文中我们只介绍了理论,并没有实际观察现象和应对. ...
- matlab函数拟合
1 函数拟合 函数拟合在工程(如采样校正)和数据分析(如隶属函数确定)中都是非常有用的工具.我这里将函数拟合分为三类:分别是多项式拟合,已知函数类型的拟合和未知函数类型的拟合.matlab中关于函数的 ...
- mysql部署后无法远程连接的原因(错误代码10061),服务监听127.0.0.1和0.0.0.0的区别
在Ubuntu上部署mysql服务并添加了一个非root用户后,发现无法远程连接, Navicat连接mysql出现2003——can't connect to mysql server on loc ...
随机推荐
- Redis读写分离(三)
1.redis高并发跟整个系统的高并发之间的关系 redis,要搞高并发的话,不可避免,要把底层的缓存搞得很好 mysql,高并发,做到了,那么也是通过一系列复杂的分库分表,订单系统,事务要求的,QP ...
- .NET Core入门
.Net core MVC 如何使用 .NET Core,最基本的入行,很多博客以及官网都有的太多太多的例子,但是大部分没有人做到了真的让一个小白一步一步的去学, 我第一次接触的时 ...
- EditPlus中文版 安装教程
EditPlus中文版安装教程 1.下载软件压缩包,解压即可.不需要安装,解压后打开“EditPlus中文版”文件夹(软件我会打包好,在文中的最低端找到即可下载:若链接失效了,请告知我一声,我会重新更 ...
- tf常见的损失函数(LOSS)汇总
损失函数在机器学习中用于表示预测值与真实值之间的差距.一般而言,大多数机器学习模型都会通过一定的优化器来减小损失函数从而达到优化预测机器学习模型参数的目的. 哦豁,损失函数这么必要,那都存在什么损失函 ...
- static 关键字有什么作用
static关键字的含义及使用场景 static是Java50个关键字之一.static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法.(注意:不能修饰 ...
- 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)
转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...
- python通过装饰器检查函数参数的数据类型的代码
把内容过程中比较常用的一些内容记录起来,下面内容段是关于python通过装饰器检查函数参数的数据类型的内容. def check_accepts(f): assert len(types) == f. ...
- 使用SAP open connector调用第三方系统的API
我们把hubspot这个SaaS CRM作为第三方系统,首先登录hubspot,创建一个新的API key: 把创建的key拷贝到剪切板里: 然后登录SAP Cloud for Customer上的o ...
- PHP实现财务审核通过后返现金额到客户
应用场景: 有这么一个返现的系统,当前端客户发起提现的时候,后端就要通过审核这笔返现订单,才可以返现到客户的账号里. 来看看下面的截图 这里的业务场景就是经过两轮审核:销售审核,财务审核都通过后,后端 ...
- 线程中的join方法,与synchronized和wait()和notify()的关系
什么时候要用join()方法? 1,join方法是Thread类中的方法,主线程执行完start()方法,线程就进入就绪状态,虚拟机最终会执行run方法进入运行状态.此时.主线程跳出start方法往下 ...