本节介绍泛化。
泛化:过拟合的风险
为了更好的理解这一概念,请看如下例子:假设下图中的每个点代表一棵树在森林中的位置。图中的两种颜色分别代表以下含义,蓝点代表生病的树,橙点代表健康的树。
您能设想出一个有效的模型来预测以后的生病或健康的树吗?花点时间在脑海里绘制一条弧线将蓝点与橙点分开,或者在脑海中圈住一些橙点或蓝点。然后再看看下图,它显示某种机器学习模型如何将生病的树与健康的树区分开。请注意,该模型产生的损失非常低。
乍一看,上图所示的模型在将健康的树与生病的树区分开方面似乎表现得非常出色。真的是这样吗?
下图显示我们向该模型中添加了新数据后所发生的情况。结果表明,该模型在处理新数据方面表现非常糟糕。请注意,该模型对大部分新数据的分类都不正确。
上述例子的模型过拟合了训练数据的特性。过拟合模型在训练的过程中产生的损失很低,但在预测新数据方面的表现却非常糟糕。如果某个模型在拟合当前样本方面表现良好,那么我们如何相信该模型会对新数据做出良好的预测呢?正如稍后介绍,过拟合是由于模型的复杂度超出所需程度造成的。在适当拟合数据的同时也要尽可能简单的拟合数据。
现今,在统计学习理论和计算学习理论领已经形成了泛化边界,即统计化描述模型根据以下因素泛化到新数据的能力:
- 模型的复杂程度
- 模型在处理训练数据方面的表现
虽然理论分析在理想化假设下可提供正式保证,但在实践中却很难应用。机器学习模型旨在根据以前未见过的新数据做出良好预测。但是,如果您要根据数据集构建模型,如何获得以前未见过的数据呢?一种方法是将您的数据集分成两个子集:
- 训练集:用于训练模型的子集。
- 测试集:用于测试模型的子集。
一般来说,在测试集上表现是否良好是衡量能否在新数据上表现良好的有用指标,前提是:
- 测试集足够大。
- 不会反复使用相同的测试集来作假。
请勿对测试集数据进行训练。
机器学习细则
以下三项基本假设阐明了泛化:
- 我们从分布中随机抽取独立同分布的样本。换言之,样本之间不会相互影响。
- 分布是平稳的,即分布在数据集内不会发生变化
- 我们从同一分布的数据划分中抽取样本
在实践中,我们有时会违背这些假设。例如:
- 想象有一个选择要展示的广告的模型。如果该模型在某种程度上根据用户以前看过的广告选择广告,则会违背独立同分布假设。
- 想象有一个包含一年零售信息的数据集。用户的购买行为会出现季节性变化,这会违反平稳性。
如果违背了上述三项基本假设中的任何一项,那么我们就必须密切注意指标。
优化:另一个划分
根据上述介绍将数据集划分为训练集和测试集。借助这种划分,可以对一个样本集进行训练,然后使用不同得样本集测试模型。采用这两种分类后,工作流程如下所示:
在图中,“调整模型”指的是调整您可以想到的关于模型的任何方面,从更改学习速率、添加或移除特征,到从头开始设计全新模型。该工作流程结束时,您可以选择在测试集上获得最佳效果的模型。
将数据集划分为两个子集是个不错的想法,但不是万能良方。通过将数据集划分为三个子集(如下图所示),您可以大幅降低过拟合的发生几率:
使用验证集评估训练集得效果,然后,在模型“通过”验证集之后,使用测试集再次检查评估结果。下图展示了这一新工作流程:
在这一经过改进的工作流程中:
- 选择在验证集上获得最佳效果的模型。
- 使用测试集再次检查该模型。
该工作流程之所以更好,原因在于它暴露给测试集的信息更少。不断使用测试集和验证集会使其逐渐失去效果。也就是说,您使用相同数据来决定超参数设置或其他模型改进的次数越多,您对于这些结果能够真正泛化到未见过的新数据的信心就越低。请注意,验证集的失效速度通常比测试集缓慢。如果可能的话,建议您收集更多数据来“刷新”测试集和验证集。重新开始是一种很好的重置方式。
参考资源:https://developers.google.com/machine-learning/crash-course/