2.3 训练损失和测试损失
给定任意预测函数g,通常不可能计算式(2.1)中的风险ℓ(g)。然而,使用训练样本T,我们可以通过经验风险(样本均值)来近似ℓ(g):
我们称之为训练损失。因此,训练损失是基于训练数据的预测函数g的风险(期望损失)的无偏估计量。
为了逼近最佳预测函数g*[风险ℓ(g)最小],我们首先选择一组合适的近似函数G,然后将G中使训练损失最小化的函数作为学习器:
例如,最简单和最有用的G是x的线性函数集合,即对于某个实数向量β,满足g:βTx形式的所有函数集合。
当清楚使用哪个函数类时,我们取消上标G。注意,在所有可能的函数g上(而不是所有g∈G上)最小化训练损失不是一个有意义的优化问题,因为任何满足g(Xi)=Yi的函数g都会产生最小的训练损失。特别是对于平方误差损失,训练损失将为0。不幸的是,这些函数预测新数据(独立于T的数据)的能力很差。这种较差的泛化性能称为过拟合。
通过选择函数g来准确预测训练数据,可以让平方误差训练损失为零。最小化训练损失并不是最终目标!
新数据对的预测准确性由学习器的泛化风险来衡量。对于固定训练集τ,泛化风险定义为
其中,(X,Y)的概率密度函数为f(x,y)。因此,对于离散变量,泛化风险为=(对于连续变量,用积分公式替代这里的求和公式)。如图2.1所示,(X,Y)的分布由浅色点表示。训练集(阴影区域中的点)确定了一个固定的预测函数,显示为一条直线。(X,Y)的三个可能的结果用深黑点表示。虚线的长度表示每个点的损失量。泛化风险是所有可能数值对(x,y)的平均损失,由相应的f(x,y)进行加权。
图2.1 固定训练集的泛化风险是所有可能数值对(x,y)的加权平均损失
因此,对于随机训练集T,泛化风险是依赖于T(和G)的随机变量。如果我们对T的所有可能实例的泛化风险进行平均,将得到泛化风险的期望:
其中,(X,Y)与T无关。对于离散变量,我们有f(x,y)f(x1,y1)…f(xn,yn),如图2.2所示。
对于训练数据的任何结果τ,我们可以通过取样本平均值来无偏估计泛化风险:
图2.2 泛化风险的期望是所有训练集上数据对(x,y)的加权平均损失
其中,=:T′是所谓的测试样本。测试样本完全独立于T,但抽样方式与T相同。也就是说,通过从f(x,y)中独立抽样,得出n′个样本。我们称式(2.7)表示的无偏估计为测试损失。对于随机训练集T,我们可以类似地定义。因此,假设T独立于T′是至关重要的。表2.1总结了监督学习的主要定义和符号。
表2.1 监督学习的定义总结
为了比较不同学习器在函数类G上的预测性能(通过测试损失衡量),我们可以使用相同的固定训练集τ和测试集τ′对所有学习器进行预测。当有大量数据时,通常随机地将“整体”数据集分为训练集和测试集,如图2.3所示。然后,利用训练数据来构造不同的学习器等,并使用测试数据从这些学习器中选出测试损失最小的学习器。在这种情况下,测试集称为验证集。一旦选出最佳学习器,就可以使用第三个测试集来评估最佳学习器的预测性能。训练集、验证集和测试集同样可以通过随机分配从整体数据集中获得。当整体数据集大小适中时,习惯上使用交叉验证对训练集进行验证(模型选择),参见2.5.2节。
图2.3 统计学习算法通常需要将数据分为训练数据和测试数据。如果后者用于模型选择,则需要第三个数据集来测试所选模型的性能
接下来,我们通过一个具体的例子来说明到目前为止所介绍的概念。
例2.1(多项式回归) 在下面的内容中,我们把符号x、g、G分别替换为u、h、H,看完示例就明白这种符号替换的原因了。
图2.4中共有n=100个用点表示的数据点(ui,yi),i=1,…,n,这些数据从独立同分布的随机数据点(Ui,Yi)(i=1,…,n)中抽取,其中{Ui}在区间(0,1)上均匀分布。给定Ui=ui的情况下,随机变量Yi服从正态分布,期望为,方差为ℓ*=25。这是一个多项式回归模型。利用平方误差损失,最佳预测函数h*(u)=E[Y|U=u]可以表示为
h*(u)=10-140u+400u2-250u3
如图2.4中的虚线所示。
图2.4 训练数据和最佳多项式预测函数h*
为了获得基于训练集τ={(ui,yi),i=1,…,n}的良好估计h*(u),我们可以在合适的候选函数集合H上最小化式(2.3)的训练损失结果:
对于p=1,2,…和参数向量β=[β1,β2,…,βp]T,我们取集合Hp为u的p-1阶多项式函数:
该函数类包含p≥4时的最佳估计。注意,Hp上的优化是一个参数优化问题,因为我们需要找到最佳的β。式(2.8)在Hp上的优化过程并不是很直接,除非我们注意到式(2.9)是关于β的线性函数。特别是,如果将每个特征u映射为特征向量x=[1,u,u2,…,up-1]T,则式(2.9)的右侧可以写作函数:
g(x)=xTβ
它是x和β的线性函数。那么,当p≥4时,Hp中的最佳函数h*(u)则对应于Gp上的函数g*(x)=xTβ*,其中Gp是从Rp到R的线性函数集,β*=[10,-140,400,-250,0,…,0]T。因此,与其使用多项式函数集合Hp,不如使用线性函数集合Gp。这就引出了统计学习中一个非常重要的概念:
扩展特征空间以获得线性预测函数。
现在,我们用新的解释(特征)变量来重新表述学习问题。这些特征向量很容易表示成具有行的矩阵X:
将响应{yi}表示为列向量y,式(2.3)的训练损失现在可以简写为
为了在Gp中找到式(2.4)对应的最佳学习器,我们需要找到式(2.11)的最小值:
这叫作普通最小二乘解。如图2.5所示,为了求,取等于y在由矩阵X的列构成的线性空间上的正交投影,即,其中P是投影矩阵。
图2.5是y在由矩阵X的列构成的线性空间上的正交投影
根据定理A.4,投影矩阵由下式给出:
其中,维数为p×n的矩阵X+是X的伪逆。如果X恰好是列满秩矩阵(矩阵中没有一列可以表示为其他列的线性组合),那么X+=(XTX)-1XT。
在任何情况下,通过=Py和PX=X都可以看出,满足正规方程:
这是一组线性方程,可以快速求解,其解可以显式地写成
图2.6显示了不同p值下训练的学习器:
图2.6 p取2、4和16时训练数据的拟合曲线,图中还绘制了p=4时真实的三次多项式曲线(虚线所示)
可以看出,当p=16时,拟合曲线更接近数据点,但是明显偏离虚线表示的真实多项式曲线,这表明拟合过度了。选择p=4(真正的三次多项式)比p=16或者p=2(直线所示)要好得多。
每个函数类Gp都给出一个不同的学习器,p=1,2,…。为了评估哪一个学习器更好,我们不应该简单地选择训练损失最小的那个。我们总是可以通过取p=n实现零训练损失,因为对于任意n个点的集合,都存在一个n-1次多项式可以对所有的点插值!
相反,我们使用式(2.7)的测试损失来评估学习器的预测性能,该损失在测试数据集上计算。如果将所有n′个测试特征向量集合到矩阵X′中,并将对应的测试响应集合到向量y′中,则测试损失可以像式(2.11)那样简写为
其中,根据训练数据由式(2.15)给出。
图2.7为测试损失与向量β中参数数量p的关系图。该图具有典型的“浴盆”形状,在p=4时处于最低点,正确地识别出真实模型的多项式阶数为3。注意,测试损失作为式(2.7)所示泛化风险的估计值,在p=16之后数值变得不可靠(图中曲线显示下降,实际上应该上升)。大家可以发现,在p较大时训练损失的图形也有类似的数值不稳定性,实际上数值并没有减少到0,这与理论情况正好相反。之所以产生这样的数值问题是因为,p较大时,矩阵X(范德蒙矩阵)列的大小相差很大,因此浮点误差很快就会变得非常大。
最后,图中显示测试损失的下限为21左右,这对应于最小(平方误差)风险的估计ℓ*=25。
图2.7 测试损失是模型参数数量p的函数
下面的脚本显示了如何在Python中生成和绘制训练数据:
下面的代码将导入上面的代码,对训练数据拟合p=1,…,18时的多项式模型,并绘制出选取的拟合曲线,如图2.6所示。
下面的代码片段将导入前面的代码,生成测试数据并绘制测试损失图,如图2.7所示。