过拟合解析

 

1.前言

 

       在训练模型的时候,过拟合是经常出现的一种情况,使得模型的泛化能力很差。根据不同的模型,采用相应的技巧可以避免过拟合,比如经常用的正则化、决策树中的剪枝措施等。很多人知道,训练得到的模型可能会出现过拟合,然而并不知道其内在的原因,这里将对这一现象进行解析,但本文不会介绍解决的办法,寻求解决办法的同学,可以阅读相关文章。

2.解析

       这里我们以多项式函数拟合sinx函数产生的数据为例进行解析。

       如果从数据源sinx函数到观察到的数据之间不存在误差,那么我们观察到的数据应该是这样:

 

图1

       然而,由于现实世界中事物之间都是相互影响的,一些潜在因素使数据产生一定误差,于是我们观察到的数据是这样的:

 

图2

       从图2中可以看出,数据点在真实的模型附近浮动,似乎影响并不是很大,那么我们来看另外一张图,关于用多项式拟合数据时,训练误差和泛化误差的关系。

 

图3

       随着多项式阶数的增大,训练误差和测试误差在逐渐减小;当阶数为3时,误差已经基本不变了;但是当多项式的阶数从8增加到9时,训练误差减小到0,但是测试误差却有一个突变性的增大。

值得关注的点有两个:

       ①为什么多项式阶数M>3,无论是训练误差还是测试误差都不再变化?

       首先,我们需要知道这个公式,

有高数基础的应该知道,这是sinx函数的泰勒展开式,实际上,就是用多项式来近似表达sinx,我们利用数据,得到模型的过程实际上也是,用多项式表达sinx(这个例子中真实的模型)的过程。(由泰勒定理我们知道,只要数据的真实模型是可微的,那么这个真实模型便可以由多项式来表达,这也是用多项式来进行拟合数据的原因。)从图2中,可以看出多项式函数3阶之后,训练误差不再变化了,我们可以推测,相对于sinx泰勒展开式1-3阶的项,3阶以后的项对多项式的输出影响很小了,想求证的同学可以自己测试一下。

 

②多项式函数阶数从8增加到9时,为什么泛化误差有个突变性的增大,也就是发生了过拟合?

直觉上来看,多项式函数的项数越多,也就和sinx函数越接近,拟合出来的模型也就越好。然而多项式阶数等于9时,从测试误差来看,似乎多项式拟合出来的曲线和sinx差别更大了。观察图2,发现我们只有10个数据点,当多项式阶数等于9时,多项式可以全部表达出这10个数据点的信息,然而这10个数据中,不仅包含sinx部分的重要信息,还有来自潜在干扰源的误差信息,所以在测试时,使得泛化误差变大。

从图3,我们可以猜测,8阶多项式所表达信息,很可能是忽略了误差信息。

那么是不是只要多项式的阶数比训练小就行了呢?在这个例子中,似乎是这样的,然而由于现实世界中真实模型的复杂性和误差来源的多样性,所以不能简单这样下结论。而且,从泰勒展开公式来看,多项式的阶数越高,就越能准确表达真实模型,但是泰勒展开公式剩下的那些项可能并不能很好地表达误差信息,也就是说,没有很好地把误差给忽略掉,这个也会造成测试误差的增大。(个人猜测,没有找到相关文献证明)

3.总结

       这篇文章以sinx为例,对过拟合这一现象进行解析。 这里给出文章的结论:过拟合实际上是由我们观察到的数据与真实模型不匹配,也就是误差造成的。

       文章到这里也就结束了,希望对需要的同学有帮助,有问题的同学可以在评论区留言。

PS:图2、图3均来源参考文献[1]

 

 

4.参考文献

  [1] Bishop, ChristopherM. Pattern recognition and machine learning[M]. Springer, 2006.

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多项式拟合是一种回归分析方法,用于拟合一个函数来描述两个变量之间的关系。在Python中,可以使用numpy.polyfit函数进行多项式拟合。以下是一个示例代码解析: ```python import numpy as np # 创建一些随机数据用于拟合 x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) y = np.array([0.1, 0.9, 2.2, 2.8, 3.9, 5.1]) # 使用numpy.polyfit函数进行多项式拟合 # 第一个参数是x值,第二个参数是y值,第三个参数是多项式的次数, # 这里设置为2,即使用二次多项式进行拟合 p = np.polyfit(x, y, 2) # 打印拟合结果 print(p) ``` 在这个示例中,我们首先导入了numpy库,然后创建了一些随机数据用于拟合。接着,我们使用numpy.polyfit函数进行了多项式拟合,其中第一个参数是x值,第二个参数是y值,第三个参数是多项式的次数,这里设置为2,即使用二次多项式进行拟合。最后,我们打印出了拟合结果。 多项式拟合的结果是一个包含多项式系数的数组,其中最后一个元素是最高次项的系数。在这个示例中,拟合结果为[0.16071429, 0.66428571, 0.14285714],表示拟合的二次多项式为0.16071429x^2 + 0.66428571x + 0.14285714。 需要注意的是,多项式拟合可能会出现过拟合或欠拟合的情况。过拟合指模型过度复杂,对训练数据拟合得非常好,但对新数据的预测能力较差。欠拟合指模型过于简单,无法很好地拟合数据。因此,在进行多项式拟合时,需要根据实际情况选择合适的多项式次数,以避免出现过拟合或欠拟合的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值