泛化&泛化数据集&实验
泛化 (Generalization):过拟合的风险
- 泛化:泛化能力(generalization ability)是指机器学习算法对新鲜样本的适应能力。学习的目的是学到隐含在数据对背后的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输出,该能力称为泛化能力。
前两篇实现了线性回归模型得训练,并再最后进行了采用合成特征作为特征输入,且过滤了离群值,效果似乎不错,但是这个不错的结果来自于我们采用了原来的训练数据进行的测试,这样的评估意义大吗?如果我们使用了新的(训练模型从未遇见过的)数据进行预测,得到的结果可能会不敬人意。
假设我对模型不断的进行训练,不断调整超参数,经过若干天后,得到的模型能够达到完美的预测效果,对于输入的任意特征都能得到正确的target,但是这并不是我们想要的模型,因为其只达到了对训练数据的完美贴合,但并不一定能对它从未见过的新数据做出正确的预测,并且其训练了过久,模型也会变的过于复杂,这样就叫做过拟合
大概过程如下图(图片来源于谷歌机器学习样图):
为了让您直观地理解这一概念,我们将展示 3 张图。假设这些图中的每个点代表一棵树在森林中的位置。图中的两种颜色分别代表以下含义:
- 蓝点代表生病的树。
- 橙点代表健康的树。
图 1. 生病(蓝色)和健康(橙色)的树。
您能设想出一个有效的模型来预测以后的生病或健康的树吗?花点时间在脑海里绘制一条弧线将蓝点与橙点分开,或者在脑海中圈住一些橙点或蓝点。然后再看看图 2,它显示某种机器学习模型如何将生病的树与健康的树区分开。请注意,该模型产生的损失非常低。
图 2. 用于区分生病的树与健康的树的复杂模型。
乍一看,图 2 所示的模型在将健康的树与生病的树区分开方面似乎表现得非常出色。真的是这样吗?
图 3. 该模型在预测新数据方面表现非常糟糕。
图 3 显示我们向该模型中添加了新数据后所发生的情况。结果表明,该模型在处理新数据方面表现非常糟糕。请注意,该模型对大部分新数据的分类都不正确。
图 2 和图 3 所示的模型过拟合了训练数据的特性。过拟合模型在训练过程中产生的损失很低,但在预测新数据方面的表现却非常糟糕。如果某个模型在拟合当前样本方面表现良好,那么我们如何相信该模型会对新数据做出良好的预测呢?正如您稍后将看到的,过拟合是由于模型的复杂程度超出所需程度而造成的。机器学习的基本冲突是适当拟合我们的数据,但也要尽可能简单地拟合数据。
一种解决方法是将您的数据集分成两个子集:
- 训练集 - 用于训练模型的子集。
- 测试集 - 用于测试模型的子集。
一般来说,在-测试集上表现是否良好是衡量能否在新数据上表现良好的有用指标,前提是:
- 测试集足够大。
- 不会反复使用相同的测试集来作假。
我们从分布中随机抽取样本,且这些样本是独立同分布 (i.i.d) 的
- 独立同分布:1、每次抽取是随机的,不被其他条件所约束 2、所抽取的样本是同分布的,即满足同一个分布规律(如,抽纸牌,得从同样得一副牌中抽取)3、分布是平稳的,即分布在数据集内不会发生变化
接下来我们来谈谈训练集和测试集
训练集和测试集 (Training and Test Sets):拆分数据
- 训练集 - 用于训练模型的子集。
- 测试集 - 用于测试训练后模型的子集
如果我们只有一个数据集,但是需要训练集和测试集,办法很简单,拆分就好了,比例大概可以是4:1这样子
不过,拆分数据时候得遵循几个原则
1.数据集够大
2.随机抽取的,能代表数据集的水平
注意:请勿对测试数据进行训练,如果最后测试得到的结果意外的好,那最好检查一下,多数是因为对测试数据进行了误训练
这是我们刚才讨论的划分方式--训练集和测试集
但是这样的划分方式,会不会有问题呢?如果为了在最后的测试数据上获得最佳效果,从而更改学习速率、添加或移除特征,到从头开始设计全新模型。当该工作流程结束时,在测试数据上表现很好,那么最终依然很有可能是过拟合的。
所以我们可以进一步划分,即训练集+验证集合+测试集合
在这一经过改进的工作流程中:
- 选择在验证集上获得最佳效果的模型。
- 使用测试集再次检查该模型。