3.2 训练误差和测试误差
人在学习时,要做训练题,判断其是否学好时,要通过测试题进行检验;模型在学习时,要通过训练集进行训练,判断模型是否学好时,要通过测试集进行检验。测试题和训练题要分开,因为虽然训练题做得好,但是无法说明人是否真正学会了知识;同理,测试集要和训练集分开。介绍了这么多,就是为了强调“在机器学习中,一定要将数据划分为训练集和测试集,前者用来训练模型,后者用来评估模型”。训练就是在训练集上让模型的预测值与真实值的差异越来越小的操作,即减少训练误差;而评估就是在测试集上计算模型的预测值与真实值的差异的操作,即计算测试误差。下面用实例来解释训练误差和测试误差(真实误差的一种替代)。
3.2.1 训练误差
训练集(Training Set)是由训练数据组成的集合,本章引言中的7个[面积,房价]数据即为训练集(见下表),即对应下图中的7个蓝点。假设绿线是拟合出来的线性模型,蓝点和绿线的差距的平均值就是训练误差。
训练数据和训练误差
训练误差(Training Error)是模型在训练集上的误差,通常用均方值来表示:
下图中展示了用零阶、一阶、二阶和六阶多项式拟合后的训练误差,由此我们会发现,模型越复杂,训练误差越小(六阶多项式已经达到零训练误差了)。
不同多项式的训练误差
通过分析上图中的4个训练误差与其对应的模型复杂度(即多项式阶数),可以发现训练误差与模型复杂度成反比关系,如下图所示。
在下图中,六阶多项式完美地拟合了训练数据,训练误差为零。看着这个疯狂的“形状“,你会对它的预测能力有信心吗?其中紫点对应的房价会不会太疯狂?
注:横坐标轴为模型复杂度,纵坐标轴为训练误差
训练误差和模型复杂度成反比关系
问题:训练误差可以很好地度量模型的性能吗?是不是训练误差越小,模型的预测就越准?
回答:不是!除非训练数据包含了所有数据!反例可见下图。
过拟合紫点数据,3300平方英尺的房子估价8500万新元?
3.2.2 真实误差
真实误差(True Error)又被称作泛化误差(Generalization Error),是指训练完的模型在预测新数据时产生的误差。真实误差主要用于衡量模型的推广能力,即从训练数据中归纳规则,从而适应新数据的能力。
回到引言中的例子,我们的目的是能预测出所有房子的价格,不仅包括训练集内的房子,还包括训练集外的房子。虽然这些房子的面积和价格未知,但它们总会服从某个概率分布,如右图所示。
真实的房子价格对于给定面积是一个概率分布,而房子面积也是一个概率分布
首先,用一个直观的例子来计算真实误差。假设同为面积2500平方英尺的房子,价格有800万新元、1000万新元和1500万新元这3种。800万新元和1500万新元的房子分别有1栋和2栋,而中间价1000万新元的房子有7栋。这栋房子用模型拟合得出的价格是1050万新元,那么在房子面积为2500平方英尺时,模型的真实误差为
假设市场上只有两种不同面积的房子:10栋2500平方英尺的房子和5栋3000平方英尺的房子,那么最终模型的真实误差为
但实际上,在房屋市场中,面积为2500平方英尺和3000平方英尺的房子有无数栋,每种面积对应的房价也有无数种,而且未来会不断有新房子出现,因此,我们需要给出真实误差的严谨表达式。在给定房子面积x时列出以下表达式:
y=真实的房价(随机变量)
eo ut(h,x)=Ey[(y-h(x))2]
h(x)=模型预测的房价
Ey的下标y表示在真实房价维度上求积分
上式里的期望符号相当于上例中的累加符号。对于所有x,真实误差的表达式为
最后Ex,y的下标x、y表示在真实房价和面积两个维度上求积分。现在你可能认为对于真实误差,根本计算不出一个具体的数值。你的直觉是对的。
首先,我们用不同多项式模型拟合房价,粗略地看一看真实误差和模型复杂度(多项式阶数)的关系。
一阶多项式模型
对于未见过的房子,即使给定面积,它们的价格也是不确定的,但有一个概率分布,假设能画出价格的边界和均值,如右图所示。
● 两条红线分别表示真实房价的上、下边界。
● 蓝线表示真实房价的均值。
● 绿线表示拟合的一阶多项式模型。
● 绿线和蓝线的差异较大,因此一阶多项式模型对应的真实误差较大。
真实房价的均值和边界(一阶多项式模型)
二阶多项式模型
如右图所示,绿线表示拟合的二阶多项式模型。绿线和蓝线的差异较小,因此,该模型对应的真实误差较小。
真实房价的均值和边界(二阶多项式模型)
六阶多项式模型
如右图所示,绿线表示拟合的六阶多项式模型。绿线和蓝线的差异非常大,因此该模型对应的真实误差非常大。
真实房价的均值和边界(六阶多项式模型)
将通过上面3幅图发现的“真实误差随着模型复杂度的增加先变小再变大”的规律画成一张图,如下面左图所示;再把“训练误差随着模型复杂度的增加而单调变小”的规律画成一张图,如下面右图所示。
注:横坐标轴为模型复杂度,纵坐标轴为训练误差
真实误差随着模型复杂度的增加先变小再变大
训练误差随着模型复杂度的增加而单调变小
我们都希望找到真实误差最小的模型。但上面所有关于真实误差的图都是笔者臆想的(我们最多只能推断出其大概的形状,但得不到具体的数值),因为真实误差是基于所有数据的,没有人可以计算出基于未来数据的误差,因此,真实误差只可“意会”,不能计算,是一个理想却不实用的概念。“实用派”的测试误差终于上场了。
3.2.3 测试误差
测试集(Test Set)是由选出来用于测试的样本数据组成的集合。其最重要的特点是不包含任何训练集中的数据。当你选好训练集之后,测试集是“模拟”那些从来都没见过但未来可能会见到的数据集,如右图所示。
测试集
测试误差(Test Error)是指模型在测试集上的误差,其计算公式如下:
测试数据和测试误差
h中的参数是通过训练集(不是测试集)拟合出来的,用在测试集的mtest个样例上(x(i),y(i))。
如左图所示,绿色直线是通过训练集(7个蓝点)拟合出来的线性模型,而3个黄点是测试集。黄点和绿线的差距的平均值就是测试误差。
3.2.4 学习理论
斯蒂文刚刚为一个大客户开发了一个垃圾邮件分类系统,然后向客户汇报结果。
斯蒂文:我的模型对于100000个训练数据(邮件),能做到正确识别其中99%的垃圾邮件,训练误差为1%。
大客户:看起来可以,这个模型对新邮件的识别表现如何呢?
斯蒂文:我没看过新邮件的内容,怎么会知道模型的表现呢?
大客户:那你带着模型回家吧。
斯蒂文:
斯蒂文是不会这么轻易就放弃的,他想起了霍夫丁不等式可以将已知的样本内误差和未知的样本外误差连接起来(见2.2.2节)。首先,把训练误差etrain(g)类比为样本内误差ein(g),把真实误差etrue(g)类比为样本外误差eout(g),其中,斯蒂文训练出来的模型被定义为g。[注:3.2.4和3.3.3节的内容创作灵感来自参考资料[2]。]
斯蒂文:霍夫丁不等式可以给出在某个概率上,模型在新数据上的表现,即你想要看的真实误差。假设在90%的情况下模型的表现很好(δ=10%),我用的模型g的复杂度为适中(dvc=5),而样本数mtrain=100000,那么训练误差和真实误差的差距ε满足如下关系:
大客户:所以呢?
斯蒂文:在90%的情况下,真实误差小于8%,考虑到这个上界非常大,实际误差可能会更小。
大客户:模型表现还可以,但是我想要的是一个真实误差值,而不是一个范围。
斯蒂文:真实误差只是一个概念,不能计算,你能对未知的事物计算出一个具体的数值吗?
大客户:那你带着模型回家吧。
斯蒂文:
斯蒂文并没有放弃,他想:既然算不出随机量(真实误差)的具体值,总可以算出它的估计量吧。
斯蒂文:我把100000个数据分成80000个训练集和20000个测试集。训练集小了会导致:(1)训练误差稍微变大,为1.05%;(2)容忍度也达到8%。这样在90%的情况下真实误差会小于9.05%。
大客户:这里的重点是什么?
斯蒂文:模型在20000个测试集上的测试误差为8.8%,这就是你想要的一个真实误差值。
大客户:这么说虽然没错,但你怎么知道测试误差可以很好地代替真实误差呢?
斯蒂文:首先,测试集中的数据是训练模型时没有用到的,根据霍夫丁不等式,对于单模型g上的不等式,在99%的情况下模型的表现很好(δ=1%),测试样本数为mtrain=20000,则测试误差和真实误差的差距ε满足
上式意味着在99%的情况下,测试误差和真实误差的差距是0.01%,相当小了,因此,测试误差可以代替真实误差,8.8%的测试误差可以被当作真实误差的合理评估。
大客户:为何分析训练误差和测试误差的霍夫丁不等式不一样?
斯蒂文:
离成功越来越近了,斯蒂文不可能现在就放弃,他查了查第2章的内容,思路越发清晰。
斯蒂文:训练集霍夫丁不等式:
测试集霍夫丁不等式:
在训练过程中,最优模型g是从M个假设函数h1,h2,…,hM中选出来的,因此,其对应的上界带有M;将训练好的单个模型g用在测试集上,它不会随测试集的不同而改变,因此对应的上界会小很多。
大客户:好像有道理,你还有什么想补充的?
斯蒂文感觉已经让大客户满意了,他还可以再做一些锦上添花的事情。
斯蒂文:(1)训练集和测试集中的数据是独立同分布的,如果没有这个假设,则上面的所有结论都不成立。
(2)虽然说测试误差是真实误差的一个很好的样本估计,但其只在测试集很大的条件下成立,因此测试集不能太小。
(3)测试集也不能太大,留有足够的数据用来训练模型即可。
训练集大会导致训练误差和真实误差小,但测试集小导会致测试误差不能逼近真实误差,进而难以评估模型的表现,如右式所示。
训练集小会导致训练误差大,而真实误差更大,测试集大会导致测试误差逼近真实误差,因此可以说模型烂,如右式所示。
大客户:我服了,就用你的模型了,关键是我在向上级领导汇报时也有理由了。这就是我需要的!
斯蒂文:☺☺☺
右图所示的两种极端情况的结果都不好,因此需要平衡训练集和测试集的大小,通常80∶20是常见的划分方法:
● 80%的数据随机被分为训练集。
● 20%的数据随机被分为测试集。
只要测试集中的数据足够多,我们就把测试误差近似地认为是真实误差,或样本外误差。
训练集和测试集的划分