监督学习—泛化、过拟合与欠拟合
1、泛化
在监督学习中,我们想要在训练数据上构建模型,然后能够对没有见过的新数据(这些新数据与训练集具有相同的特性)做出准确预测。
如果一个模型能够对没见过的数据做出准确预测,我们就说它能够从训练集泛化(generalize)到测试集。我们想要构建一个泛化精度尽可能高的模型。
通常来说,我们构建模型,使其在训练集上能够做出准确预测。如果训练集和测试集足够相似,我们预计模型在测试集上也能做出准确预测。不过在某些情况下,这一点并不成立。例如:我们可以构建非常复杂的模型,那么在训练集上的精度可以想多高就多高。
为了说明这一点,我们来看一个虚构的例子:
比如有一个新手数据科学家,已知之前船的买家记录和对买船不感兴趣的顾客记录,想要预测某个客户是否会买船。目标是向可能购买的人发送促销电子邮件,而不去打扰那些不感兴趣的顾客。
假设我们有顾客记录,如下所示:
对数据观察一段时间之后,我们的新手数据科学家发现了以下规律:“如果顾客年龄大于 45 岁,并且子女少于 3 个或没有离婚,那么他就想要买船。”
如果我们问他这个规律的效果如何,我们的数据科学家会回答:“100% 准确!”。 的确,对于表中的数据,这条规律完全正确。
我们还可以发现好多规律,都可以完美解释这个数据集中的某人是否想买船。数据中的年龄都没有重复,因此我们可以这样说:66、52、53、58 岁的人想要买船,而其他年龄的人都不想买。
虽然我们可以编出许多条适用于这个数据集的规律,但要记住,我们感兴趣的并不是对这个数据集进行预测,我们已经知道这些顾客的答案。我们想知道新顾客是否可能会买船。因此,我们想要找到一条适用于新顾客的规律,而在训练集实现 100% 的精度对此并没有帮助。我们可能认为数据科学家发现的规律无法适用于新顾客。它看起来国语复杂,而且只有很少的数据支持。例如,规律里 “或没有离婚” 这一条对应的只有一名顾客。
判断一个算法在新数据上表现好坏的唯一度量,就是在测试集上的评估。然而从直觉上看,我们认为简单的模型对新数据的泛化能力更好。如果规律是 “年龄大于 50 岁的人想要买船”,并且这可以解释所有顾客的行为,那么我们将更相信这条规律,而不是与年龄、子女和婚姻状况都有关系的那条规律。因此,我们总想找到最简单的模型。
如下,我们将给出过拟合与欠拟合的概念:
2、过拟合
构建一个对现有信息量来说过于复杂的模型,正如我们的新手数据科学家做的那样,这被称为过拟合(overfiting)。
如果我们在拟合模型时过分关注训练集的细节,得到了一个在训练集上表现良好、但不能泛化到新数据上的模型,那么就会存在过拟合。
3、欠拟合
与过拟合相反,如果我们的模型过于简单——比如说,“有房子的人都买船” —— 那么我们可能无法抓住数据的全部内容以及数据中的变化,我们的模型甚至在训练集上的表现就很差。
选择过于简单模型被称为欠拟合(underfitting)。
4、模型复杂度与训练精度和测试精度之间的权衡
我们的模型越复杂,在训练数据上的预测结果就越好。但是,如果我们的模型过于复杂,我们开始过多关注训练集中每个单独的数据点,模型就不能很好地泛化到新数据上。
二者之间存在一个最佳位置,可以得到最好的泛化性能。这就是我们想要的模型。
过拟合与欠拟合之间的权衡:
5、模型复杂度与数据集大小的关系
模型复杂度与训练数据集中输入的变化密切相关:
(1) 数据集中包含的数据点变化范围越大,在不发生过拟合的前提下我们可以使用的模型就越复杂。
(2) 通常来说,收集更多的的数据点可以有更大的变化范围,所以更大的数据集可以用来构建更复杂的模型。但是,仅复制相同的数据点或收集非常相似的数据是无济于事的。
回到前面买船的例子,如果我们查看了 10000 多行的顾客数据,并且所有数据都符合这条规律:“如果顾客年龄大于 45 岁,并且子女少于 3 个或没有离婚,那么他就想要买船”,那么我们就更有可能相信这是一条有效的规律,比从上面的 12 条顾客记录数据得出来的更为可信。
收集更多数据,适当构建更复杂的模型,对监督学习任务往往特别有用。