吴恩达机器学习笔记-过拟合

发布于 2018-09-07  221 次阅读


概念

假设我们有一组数据集如下图所示:

左边的图中,我们假设y = \theta_0 + \theta_1x,与数据集进行比较发现此函数和数据的拟合度并不是很高,先然数据并不是呈现一条直线的形状,因此我们认为此函数并不能很好的预测后面的数据的真实情况,我们通常称这种情况为欠拟合(underfitting);中间的图中,我们假设y = \theta_0 + \theta_1x + \theta_2x^2,从曲线和数据集和比较来看,此函数相对较为满足实际的情况;第三张图中我们是通过多个特征值来设定假设函数从而满足当前的数据集,虽然和当前数据吻合当并不能准确的预测后续数据的正确性,这种情况下我们称为过拟合(overfitting)
过拟合或者有时会被称作高方差,反应的是假设函数往往是对当前已有的数据集能有很好的准确度但不能准确预测后续的数据。造成这种情况的原因一般是所选取的特征太多或太简单。这时候设计的函数可能会非常复杂而且函数图像中会出现一些不必要的曲线角度。
有两种方式可以解决过拟合问题:

  1. 减少特征的数量
    • 手动确认哪些特征需要保留
    • 使用模型选择算法
  2. 正则化
    • 保留所有的特征,但减小参数j的量级
    • 正则化在在我们拥有大量的有用的特征时往往能处理的很好

代价函数

在上面最右边的图中我们用了一个更高次的多项式假设是\theta_0 + \theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4去拟合数据,最终得到一个能非常好地拟合训练集的曲线,但这不是一个好的结果,它过度拟合了数据,因此一般性并不是很好。那么我们来考虑一个假设,我们想要加上惩罚项,从而使参数\theta_3,\theta_4足够的小,我们的目标是使得\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^(i)) - y^(i))最小,那么我们给他加上1000_\theta_3^2+1000_\theta_4^2,这里的1000仅仅只是代表数值很大而已,并不是一定要是1000。连起来如下:
\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^(i)) - y^(i))+1000_\theta_3^2+1000_\theta_4^2

我们要最小化这个函数,那就意味着要\theta_3\theta_4要尽可能的小,因为它们俩的系数都非常大,会导致这个函数很大。则我们需要\theta_3\theta_4尽量接近于0。就像我们直接去掉了\theta_3x^3+\theta_4x^4这两项。那这样我们的假设函数依然趋向于接近一个二次函数,也就是上面图中的第二张图的曲线,最终我们拟合的函数依然还是一个二次函数。
这里例子里我们通过加入惩罚来增大两个参数所带来的效果,这就是正则化背后的思想。这种思想就是,如果我们的参数值对应一个较小的值得话,那么我们往往会得到一个形式更为简单的假设。比如这里我们就是惩罚的\theta_3\theta_4使得其接近于0,我们得到一个更简单的假设,这里是二次函数。但一般来说,这些参数的值越小,我们得到的函数就越加平滑越加简单,因此也不容易发生过拟合的问题。
在实际问题里,如果我们遇到了很多比如上百的特征数量,我们很难提前选出关联度小的特征,因此在正规化里,我们要做的就是把代价函数进行修改,来缩小所有的参数,因为我们也不知道应该选那些参数进行缩小。因此我们可以在代价函数后面加上一个新的项,即一个额外的正则化项来缩小每个参数的值。如下所示:
J(\theta) = \frac{1}{2m}[\sum_{i=1}^{m}(h_\theta(x^(i)) - y^(i)) + \lambda\sum_{j=1}^{n}\theta_j^2]

这一项就是为了缩小每一个参数,从\theta_1一直到\theta_n。按照习惯这里从1开始而并没有给\theta_0加上惩罚项,这实际上是约定俗成的,但实际中从0开始或者从1开始都没什么影响。那么我们的目标就是变为了最小化正则化的代价函数J(\theta),最后的一项就是正则化项,\lambda被称作正则化参数,它的作用是控制两个不同目标之间的取舍。我们的第一个目标与目标函数的第一项有关,就是我们更好的拟合训练集;第二个目标和后面的一项有关,就是我们想要保持参数尽可能的小。这个\lambda就是用来平衡两个目标之间的平衡,即平衡拟合训练和保持参数值较小,从而保持假设模型的相对简单,避免出现过拟合的情况。
在正则化的线性回归中,如果\lambda取得值太大的话,会导致我们对这些参数的惩罚程度太大,最终这些参数都会趋向于0,这样就相当于把假设函数的所有项都忽略掉了,最后假设函数就剩下h_\theta(x) = \theta_0。这就相当于用一条直线去拟合数据,在上述图像中的训练集对比来看,显然不符合要求,导致出现了欠拟合的情况。

线性回归的正则化

对于线性回归,我们在之前的内容中有说过两种算法,一种是基于梯度下降,一种是基于正规方程。之前的线性回归中我们使用梯度下降去最小化最初的代价函数,会反复用下式去更新\theta_j的值,其中j的值从0到n。
\theta_j := \theta_j-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x(i)))-y^(i))x_j^(i)
但现在我们是有正则项的代价函数,那么我们单独写出\theta_0的更新,如下所示:

这样做的原因是我们在正则线性回归时并没有惩罚\theta_0,那么通过进行计算,我们可以把上式等价的写成下面的写法:

而其中的1-\alpha\frac{\lambda}{m}其实始终都是小于1的,而且是略小于1,因为\alpha\frac{\lambda}{m}是一个正数,通常学习速率很小但m却很大,那么\alpha\frac{\lambda}{m}就会很小,因此这一项很接近于1,比如0.99,那么这里\theta_j的更新结果就是\theta_j缩小了一点点然后进行和之前一样的更新操作,因为第二项和之前的公式显然是一样的。
第二种拟合线性回归的方法是正规方程,如下所示:
\theta = (X^TX)^{-1} X^Ty
但在正则化的线性回归中,我们的公式是:

这里的L是个(n+1)*(n+1)维矩阵,对角线外其他元素均为0,推导过程就不在此说明。但这里提一下矩阵不可逆的情况。假设我们的样本数量m是小于特征数量n的,那么这里的(X^TX)就是不可逆的,或者说是个奇异矩阵。但在正则化中已经考虑过这个问题,也就是说,只要正则化参数\lambda>0,我们就可以确信(X^TX+\lambda L)一定不是奇异矩阵,是可逆的。

正则化logistic回归

在logistic回归中也会出现过拟合的情况,如下图,如果我们用右边的高次多项式进行拟合的话,得到的结果可能会如图中蓝色曲线一样的图像,它的判定边界非常复杂和扭曲。

通常情况下,如果逻辑回归含有多个特征,有无关紧要的多项式,这些大量的特征可能会导致过拟合的情况。上图中下方是逻辑回归的代价函数公式,为了正则化,我们在后面新加入了一项\frac{\lambda}{2m}\sum_{j=1}^{n}\theta_j^2,显然这一项的作用是为了惩罚\theta_1,\theta2...\theta_n,防止它们过大。这样做的效果就是,即使当你的拟合阶数很高且参数很多,只要添加了这个正则化项,保持参数较小,你仍然可以得到一条如上图中紫色的判断边界,而这条边界显然能更合理的划分正样本和负样本。因此使用正则化的话,即使有大量的特征,正则化都可以帮你避免过拟合的问题。

对于梯度下降算法,相对于上文说的正则化线性回归,算法的公司看起来是一样的,都是在之前原本说过的算法上加上正则化项。但这里的假设函数是不一样的。这里的h_\theta(x) = \frac{1}{1+e^{-z}}。中括号的部分是J(\theta)\theta_j的偏导

对于高级优化的方式来说,我们和之前的思路也是基本是一样的,如下图所示:

我们需要编写计算J(\theta)J(\theta)的偏导的代码,当运行costfunction后调用fminuc函数或者其他高级函数,这将得到新的正则化代价函数J(\theta),函数返回的参数代表的就是正则化逻辑回归的解。

以上,就是吴恩达机器学习第三周Solving the Problem of Overfitting部分的课程笔记。


叶子是明明的小太阳