如果你在外国游玩,当地的出租车司机多收了你的钱。你可能会说这个国家所有的出租车司机都是小偷。过度泛化是我们人类经常做的,如果我们不小心,机器也会犯同样的错误。在机器学习中,这称作过拟合:意思是说,模型在训练数据上表现很好,但是泛化效果不好。
图1-22展示了一个高阶多项式生活满意度模型,它大大过拟合了训练数据。即使它比简单线性模型在训练数据上表现更好,你会相信它的预测吗?
图1-22 过度拟合训练数据
复杂的模型,比如深度神经网络,可以检测数据中的细微规律,但是如果训练集有噪声,或者训练集太小(太小会引入样本噪声),模型就会去检测噪声本身的规律。很明显,这些规律不能泛化到新实例。例如,假如你用更多的属性训练生活满意度模型,包括不包含信息的属性,比如国家的名字。如此一来,负责的模型可能会检测出训练集中名字有w字母的国家的生活满意度大于7:新西兰New Zealand(7.3),挪威Norway (7.4),瑞典Sweden(7.2)和瑞士Switzerland (7.5)。你能相信这个W-满意度法则泛化到卢旺达和津巴布韦吗?很明显,这个规律只是训练集数据中偶然出现的,但是模型不能判断这个规律是真实的、还是噪声的结果。
过拟合发生在相对于训练数据的量和噪声,模型过于复杂的情况。可能的解决方案有:
- 简化模型,可以通过选择一个参数更少的模型(比如使用线性模型,而不是高阶多项式模型)、减少训练数据的属性数、或限制一下模型
收集更多的训练数据
减少训练数据中的噪声(例如,修正数据错误并移除异常值)
限定一个模型以让它更简单,降低过拟合的风险被称作正规化(regularization)。例如,我们之前定义的线性模型有两个参数,θ0和θ1。它给了学习算法两个自由度以让模型适应训练数据:可以调整截距θ0和斜率θ1。如果强制θ1=0,算法就只剩一个自由度,拟合数据就会更为困难:能做的只是将线上下移动,尽可能地靠近训练实例,结果会在平均值附近。这就是一个非常简单的模型!如果我们允许算法可以修改θ1,但是只能在一个很小的范围内修改,算法的自由度就会介于1和2之间。它要比两个自由度的模型简单,比1个自由度的模型要复杂。你的目标是在完美拟合数据和保持模型简单性上找到平衡,确保算法的泛化效果
图1-23展示了三个模型:虚线表示用缺失部分国家的数据训练的原始模型,短划线是我们的第二个用所有国家训练的模型,实线模型的训练数据和第一个相同,但进行了正规化限制。你可以看到正规化强制模型有一个小的斜率,它对训练数据的拟合不是那么好,但是对新样本的泛化效果好。
图1-23 正规化降低了过度拟合的风险。
正规化的度可以用一个超参数(hyperparameter)控制。超参数是一个学习算法的参数(而不是模型的)。这样,它是不会被学习算法本身影响的,它的优于训练数据,在训练中是保持不变的。如果你设定的超参数非常大,就会得到一个几乎是平的模型(斜率接近于0);学习算法几乎肯定不会过拟合训练数据,但是也很难得到一个好的解。调节超参数是创建机器学习算法非常重要的一部分(下一章你会看到一个详细的例子)