![数据科学与机器学习:数学与统计方法](https://wfqqreader-1252317822.image.myqcloud.com/cover/83/47684083/b_47684083.jpg)
2.3 训练损失和测试损失
给定任意预测函数g,通常不可能计算式(2.1)中的风险ℓ(g)。然而,使用训练样本T,我们可以通过经验风险(样本均值)来近似ℓ(g):
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/32_01.jpg?sign=1739239222-6wVaNJ5y0AguQRp7LDJfMrcYoU0FS8T3-0-0482b6696cfa977649fc1c3e47624bb5)
我们称之为训练损失。因此,训练损失是基于训练数据的预测函数g的风险(期望损失)的无偏估计量。
为了逼近最佳预测函数g*[风险ℓ(g)最小],我们首先选择一组合适的近似函数G,然后将G中使训练损失最小化的函数作为学习器:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/32_02.jpg?sign=1739239222-fimdLlB3Ey4THvrlvnwMxjufodPaN3ZR-0-e484328cf8c627f620ef694e6e7f87cc)
例如,最简单和最有用的G是x的线性函数集合,即对于某个实数向量β,满足g:βTx形式的所有函数集合。
当清楚使用哪个函数类时,我们取消上标G。注意,在所有可能的函数g上(而不是所有g∈G上)最小化训练损失不是一个有意义的优化问题,因为任何满足g(Xi)=Yi的函数g都会产生最小的训练损失。特别是对于平方误差损失,训练损失将为0。不幸的是,这些函数预测新数据(独立于T的数据)的能力很差。这种较差的泛化性能称为过拟合。
通过选择函数g来准确预测训练数据,可以让平方误差训练损失为零。最小化训练损失并不是最终目标!
新数据对的预测准确性由学习器的泛化风险来衡量。对于固定训练集τ,泛化风险定义为
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/32_04.jpg?sign=1739239222-P255dKruYm0BBwBpp4i20WafE87TMHEI-0-4e5380252d44a82955b62014cd9c0f20)
其中,(X,Y)的概率密度函数为f(x,y)。因此,对于离散变量,泛化风险为=
(对于连续变量,用积分公式替代这里的求和公式)。如图2.1所示,(X,Y)的分布由浅色点表示。训练集(阴影区域中的点)确定了一个固定的预测函数,显示为一条直线。(X,Y)的三个可能的结果用深黑点表示。虚线的长度表示每个点的损失量。泛化风险是所有可能数值对(x,y)的平均损失,由相应的f(x,y)进行加权。
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/32_07.jpg?sign=1739239222-i7uFqWpEs3ydBDBhGc4Kd5z9fGzkj1nY-0-413a7bfe43262277380fc302ef0d62ff)
图2.1 固定训练集的泛化风险是所有可能数值对(x,y)的加权平均损失
因此,对于随机训练集T,泛化风险是依赖于T(和G)的随机变量。如果我们对T的所有可能实例的泛化风险进行平均,将得到泛化风险的期望:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/32_08.jpg?sign=1739239222-lv2jl3w30Jv5yS7aerItYKyi8nurTxN9-0-f283fdf5d7f28ac779b396434e6113bf)
其中,(X,Y)与T无关。对于离散变量,我们有f(x,y)f(x1,y1)…f(xn,yn),如图2.2所示。
对于训练数据的任何结果τ,我们可以通过取样本平均值来无偏估计泛化风险:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/32_10.jpg?sign=1739239222-aww4nk8R4mn4gfBSOj6ZeSrGDGUAVVDp-0-9c408f922fdd6ac2ce8c0144b25680f4)
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/33_01.jpg?sign=1739239222-2mlLUlPGIvqglWV4M8jX0M9VD9gmha4a-0-ea4de05ff9e651f9bbd9e3920887c8e3)
图2.2 泛化风险的期望是所有训练集上数据对(x,y)的加权平均损失
其中,=:T′是所谓的测试样本。测试样本完全独立于T,但抽样方式与T相同。也就是说,通过从f(x,y)中独立抽样,得出n′个样本。我们称式(2.7)表示的无偏估计为测试损失。对于随机训练集T,我们可以类似地定义
。因此,假设T独立于T′是至关重要的。表2.1总结了监督学习的主要定义和符号。
表2.1 监督学习的定义总结
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/33_04.jpg?sign=1739239222-zfYAfUPTzP46X8373MoAUDWu4p6UBTPr-0-444c611c77b247a5984257dd9e770684)
为了比较不同学习器在函数类G上的预测性能(通过测试损失衡量),我们可以使用相同的固定训练集τ和测试集τ′对所有学习器进行预测。当有大量数据时,通常随机地将“整体”数据集分为训练集和测试集,如图2.3所示。然后,利用训练数据来构造不同的学习器等,并使用测试数据从这些学习器中选出测试损失最小的学习器。在这种情况下,测试集称为验证集。一旦选出最佳学习器,就可以使用第三个测试集来评估最佳学习器的预测性能。训练集、验证集和测试集同样可以通过随机分配从整体数据集中获得。当整体数据集大小适中时,习惯上使用交叉验证对训练集进行验证(模型选择),参见2.5.2节。
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/34_01.jpg?sign=1739239222-m8OV2mtNsv19gplZCCFjm7dGQbMsTnZR-0-a994ec983cdae12bfcd2856d354e4204)
图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中的虚线所示。
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/34_03.jpg?sign=1739239222-qnWPL4WVjSucuZwicQvfOrOEsYaDdkJj-0-f97364b961cb01415f8d3bf1725d1d7f)
图2.4 训练数据和最佳多项式预测函数h*
为了获得基于训练集τ={(ui,yi),i=1,…,n}的良好估计h*(u),我们可以在合适的候选函数集合H上最小化式(2.3)的训练损失结果:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/34_04.jpg?sign=1739239222-aPuzmLo3RLI2FNwyyp5uDmUK977hTiyg-0-1de9483b1c2ecb6354c6820ced6412ea)
对于p=1,2,…和参数向量β=[β1,β2,…,βp]T,我们取集合Hp为u的p-1阶多项式函数:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/34_05.jpg?sign=1739239222-gYvztgejlH7E8tMkBLcUvOAMpcy5w6vu-0-a315ea740fbb20897db0fbb066c56cb2)
该函数类包含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:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/35_03.jpg?sign=1739239222-f7j6svseeFlH5ewc3bo1jpENHplmw9GK-0-177f3195b0134ba90f29b48138941552)
将响应{yi}表示为列向量y,式(2.3)的训练损失现在可以简写为
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/35_04.jpg?sign=1739239222-eI1i0y2Di2O4HRacJiiEJQcgPZcevKZb-0-fbf14158679fab64b0edd0ee8e7d28fd)
为了在Gp中找到式(2.4)对应的最佳学习器,我们需要找到式(2.11)的最小值:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/35_05.jpg?sign=1739239222-LpCsUQDEthEwtZExmGRSzknco9unVaI0-0-505f3e1a9f08fda6b99b1a680f89f5f4)
这叫作普通最小二乘解。如图2.5所示,为了求,取
等于y在由矩阵X的列构成的线性空间上的正交投影,即
,其中P是投影矩阵。
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/35_09.jpg?sign=1739239222-0MzFEz2Vt71zaXEYHnMw3UVfWwj43icT-0-afa4c6169dabcada2657a91bc7e6f7d9)
图2.5是y在由矩阵X的列构成的线性空间上的正交投影
根据定理A.4,投影矩阵由下式给出:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/35_11.jpg?sign=1739239222-N129ZiQPKuuLomaLRklZXPz8B2JqxFda-0-343731389e2c482000c82dc310886134)
其中,维数为p×n的矩阵X+是X的伪逆。如果X恰好是列满秩矩阵(矩阵中没有一列可以表示为其他列的线性组合),那么X+=(XTX)-1XT。
在任何情况下,通过=Py和PX=X都可以看出,
满足正规方程:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/35_14.jpg?sign=1739239222-iHWVW7vOERZ9gR48lHJuJMweg1sR9Gr1-0-14c6b2d3c61d60dfc1693f0dc99c2bdc)
这是一组线性方程,可以快速求解,其解可以显式地写成
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/36_01.jpg?sign=1739239222-yok1SeKBGHILiXjJ3dEWBXqduNzK27QV-0-4e49574b85adc23b08ce69738a96c80d)
图2.6显示了不同p值下训练的学习器:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/36_02.jpg?sign=1739239222-81k4FdGq4UQunw0NKegC3ZuMaUN79sxj-0-2be58e96042af7e911014ccbeb30e7bb)
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/36_03.jpg?sign=1739239222-uEDn3r8x6RN9W2KHjVi3xYqaogiHWqHc-0-2368b4e3434a59dbd878f1e2eae1c149)
图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)那样简写为
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/36_05.jpg?sign=1739239222-7jA9114H4TkyqRi7vylFVpHSkki2DZDx-0-a15e06d7f7659c824cc43193a0ea418e)
其中,根据训练数据由式(2.15)给出。
图2.7为测试损失与向量β中参数数量p的关系图。该图具有典型的“浴盆”形状,在p=4时处于最低点,正确地识别出真实模型的多项式阶数为3。注意,测试损失作为式(2.7)所示泛化风险的估计值,在p=16之后数值变得不可靠(图中曲线显示下降,实际上应该上升)。大家可以发现,在p较大时训练损失的图形也有类似的数值不稳定性,实际上数值并没有减少到0,这与理论情况正好相反。之所以产生这样的数值问题是因为,p较大时,矩阵X(范德蒙矩阵)列的大小相差很大,因此浮点误差很快就会变得非常大。
最后,图中显示测试损失的下限为21左右,这对应于最小(平方误差)风险的估计ℓ*=25。
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/37_01.jpg?sign=1739239222-n4PLKHEyBiR8Zxmzio57n8PjffYGx4v7-0-1d4c504e9729d38b721fe54548821fd2)
图2.7 测试损失是模型参数数量p的函数
下面的脚本显示了如何在Python中生成和绘制训练数据:
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/37_02.jpg?sign=1739239222-0FNy6m2UM3PfKHXRlX2Bt19pF0XiuDV7-0-f372f8c9db991ab48511447eda42839d)
下面的代码将导入上面的代码,对训练数据拟合p=1,…,18时的多项式模型,并绘制出选取的拟合曲线,如图2.6所示。
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/37_03.jpg?sign=1739239222-LNVGWZHpLeuau3kyIFTNBfhDgo0DLc0i-0-17c1397df32a4511c5c90b8bace80824)
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/38_01.jpg?sign=1739239222-25RfATYK7DTQcYt695CjLSvMBopj4zk9-0-09d7644286e7a5003db070b35bf6ed88)
下面的代码片段将导入前面的代码,生成测试数据并绘制测试损失图,如图2.7所示。
![](https://epubservercos.yuewen.com/C30954/27086998107751806/epubprivate/OEBPS/Images/38_02.jpg?sign=1739239222-lZUszdatKxOs8MwBeta93iu0Q46ZXM6Z-0-b1fab7a5c9048f433d49e06b85d12d93)