1 拟合
由于拟合(fitting)这个概念还并没有介绍,这里稍微补充以下。所谓求解模型的过程,其实就是通过某种方式(例如梯度下降)来拟合模型参数的过程。拟合指的就是一个寻找模型参数的、动态的过程。当这个过程执行结束后就会产生多种拟合后的状态,例如过拟合、欠拟合等。
1.1 引例
假设现在有一批样本点,它本是由函数sin(x)生成(现实中并不知道),但由于其他因素的缘故,使得我们拿到的样本点并没有准确的落在曲线sin(x)上,而是分布在其附近。
上图中红色圆点就是我们拿到的数据集,蓝色曲线为其真实的分布曲线。现在我们需要对其进行建模,并求解得到相应的预测函数。假如现在你分别用degree = 1,5,10
来对这12个样本点进行建模(degree
表示多项式的最高次数),且求解后的可视化情况如下:
从图中可以看出,随着多项式次数的增大,指标的值也越来越高(越大预示着模型越好),且到次数设置为10的时候,R2
达到了1.0。但是我们最后就应该选degree=10的这个模型吗?
不知过了多久,突然一个客户来说要买你的这个模型进行商业使用;同时客户为了评估你的模型又自己带来了一批新的含标签的数据(虽然你自己之前已经用测试过了,可人家客户并不会完全相信,万一你作弊呢)。于是你拿着客户的新数据又重新测试了以下自己的模型,可视化如下:
令你感到奇怪的是,当degree=5的结果居然会好于degree=10模型的结果,问题出在哪儿呢?其原因在于:当我们第一次通过这12个样本点建模时,我们为了尽可能的使得“模型好(表现形式就是尽可能大)”而使用了非常复杂的模型,这导致最后得到的模型将严重的偏离其真实的模型(这里为sin(x) ),尽管最后每个样本点都“准确无误”的落在了预测曲线上。而这,显然不是我们想要的。
1.2 过拟合与欠拟合
在机器学习中,我们将上述degree=10产生的现象叫做过拟合(overfitting),将其对立面degree=1产生的现象叫做欠拟合(underfitting),把degree=5的现象叫做恰拟合(good fitting);同时将建模时的数据叫做训练集(training data),将训练集上产生的误差叫训练误差(training error)将测试时的数据叫做测试集或验证集(test data),将模型在测试集上产生的误差叫泛化误差(generalization error),将整个建模求解过程叫做训练(training)。
需要说明的是,引例中仅仅是以线性回归为例,来向大家直观的介绍什么是过拟合与欠拟合。不代表这种现象只出现在线性回归中,事实上所有的机器学习模型都会存在这个问题。一般来说,所谓过拟合现象就是在训练集上表现很好,而在测试集上表现糟糕;欠拟合现象就是在两者上的表现都十分糟糕;而恰拟合现象就是指在训练集上表现良好(尽管可能不如过拟合时好),但同时在测试集上也有着不错的表现。
1.3 如何解决欠拟合?
经过上面的描述我们已经对欠拟合有了一个直观的认识,所谓欠拟合就是训练出来的模型根本不能较好的拟合现有的训练数据。要解决欠拟合的方法相对来说较为简单,主要分为以下两类:
重新设计更为复杂的模型
例如在线性回归中可以增加特征映射多项式的次数;
加入更多的特征维度作为输入
收集或设计更多的特征维度作为模型的输入;
1.4 如何解决过拟合?
常见的解决模型过拟合的方法主要也有两大类:
收集更多数据
这是一个最为有效但实际操作起来有是最为困难的一个方法。训练数据越多,在训练过程中也就越能够纠正噪音数据对模型 造成的影响,使得模型不易过拟合。但是对于新数据的收集往往具有较大的困难。
正则化(Regularization)
这是一种有效且易于操作的缓解模拟过拟合的办法
2 如何避免过拟合
为了避免训练出来的模型产生过拟合的现象,在模型训练之前我们一般会将拿到的数据集划分成两个部:训练集与测试集,且一般为7:3的比例。其中训练集用来训练模型(降低模型在训练集上的误差),然后用测试集来测试模型在未知数据上的泛化误差,观察是否产生了过拟合现象。但是由于一个完整的训练过程用到数据通常是:“训练集->测试集->训练集->测试集->…”,因为你不可能第一次就选择了合适的模型,所以在不知不觉中测试集也被当成了训练集在使用。所以还有另外一种划分方式为:训练集、开发集(dev data)和测试集,且一般为7:2:1的比例。为什么会有两种划分方式呢?这一般取决于训练者对模型的要求程度。如果是分为三份的话,测试集一般是通过训练集和开发集选定模型后最后做测试用的。但是具体怎么分,没有什么硬性标准,都行。
3. 总结
本篇文章笔者首先介绍了什么是拟合,进而介绍了拟合后带来的三种状态:欠拟合、恰拟合与过拟合,其中恰拟合的模型是我们最终所需要的结果。同时,笔者接着介绍了处理欠拟合与过拟合的办法,其中过拟合的具体解决办法将在下一篇文章中进行说明。最后,笔者还介绍了通过对数据集的划分来避免产生模型过拟合的现象。本次内容就到此结束,感谢阅读!