图 7.1 演示了评估学习方法泛化能力的重要问题。首先考虑一个数值或区间范围的输出变量。目标变量为 $Y$,输入向量为 $X$,$\hat{f}(X)$ 是从训练集 $\mathcal{T}$ 估计得到的预测模型。用来衡量 $Y$ 与 $\hat{f}(X)$ 之间误差的损失函数记为 $L(Y, \hat{f}(X))$,常见的选择有:
$$L(Y,\hat{f}(X))=\begin{cases} (Y - \hat{f}(X))^2 & \text{ 平方误差(squared error)} \\ |Y-\hat{f}(X)| & \text{ 绝对误差(absolute error)} \end{cases}\tag{7.1}$$测试误差(test error),也称为泛化误差(generlization error),为在一个独立的测试样本上的预测误差:
$$\text{Err}_{\mathcal{T}} = \operatorname{E}[L(Y, \hat{f}(X)) | \mathcal{T}] \tag{7.2}$$其中 $X$ 和 $Y$ 的期望是对它们的(总体)联合分布计算的。这里的训练集 $\mathcal{T}$ 是固定的,测试误差指的是这个特定训练集(得出的预测函数)的误差。另一个相关的指标是期望预测误差(或期望测试误差):
$$\text{Err} = \operatorname{E}[L(Y, \hat{f}(X))] =\operatorname{E}[\text{Err}_{\mathcal{T}}] \tag{7.3}$$注意在上式中的期望是对所有随机成分的平均,包括训练得出 $\hat{f}$ 的训练集的随机性。
图 7.1 中展示了 100 组大小为 50 的模拟训练集的预测误差 $\text{Err}_\mathcal{T}$(浅红色曲线)。预测误差对模型复杂度的曲线来自套索(lasso)拟合(第 3.4.2 节)。深红色曲线为它们的平均,所以它是对 $\text{Err}$ 的估计。
通常的目标是估计 $\text{Err}_\mathcal{T}$,但 $\operatorname{Err}$ 更易于进行统计分析,并且大多数方法实际上都是对预期误差的估计。在只有一个训练集的情况下,反而不太可能有效地估计出条件误差。第 7.12 节会对此进行更多讨论。
训练误差(training error) 是在训练样本上的平均误差:
$$\overline{\text{err}} = \frac{1}{N} \sum_{i=1}^N L(y_i, \hat{f}(x_i)) \tag{7.4}$$我们想要的是估计模型 $\hat{f}$ 的预期测试误差。模型越复杂,对训练集的使用越彻底,同时会适应数据中更复杂的潜在结构。所以,偏差会降低而方差会升高。这其中会有一个复杂度适中的模型可以达到最小的期望测试误差。
但如图 7.1 所示,训练误差并不是对测试误差的一个好的估计。训练误差随着模型复杂度增大而持续降低,如果将复杂度增加到一定程度,通常会下降到零。不过零训练误差的模型是对训练集的过拟合,通常泛化表现会很差。
对定性(qualitative)或分类(categorical)输出变量也有一样的结论,假设 $G$ 取值为集合 $\mathcal{G}$ 中 $K$ 个元素之一,方便起见标记为 $1,2,\dots,K$。通常会对概率 $p_k(X)=\operatorname{Pr}(G=k|X)$(或它们的某个单调变换 $f_k(X)$)建模,再按规则分类 $\hat{G}(X)=\operatorname{argmax}_k\hat{p}_k(X)$。在某些案例中,比如 1-最近邻分类(第二章和十三章),也可直接生成 $\hat{G}(X)$。损失函数通常为:
$$\begin{align} L(G,\hat{G}(X))&= \underbrace{I(G \ne \hat{G}(X))}_\text{0-1 loss} \tag{7.5}\\ L(G,\hat{p}(X))&= -2 \sum_{k=1}^K I(G=k) \log\hat{p}_k(X) \\ &=\underbrace{-2\log\hat{p}_G(X)}_{-2 \times \text{log-likelihood}} \tag{7.6}\end{align}$$其中 -2 与对数似然度的乘积有时被称为偏差(deviance)。
这里的测试误差同样为 $\text{Err}_\mathcal{T}=\operatorname{E}[L(G,\hat{G}(X))|\mathcal{T}]$,即用样本 $\mathcal{T}$ 训练出的分类器的总体误分类误差;同时 $\text{Err}$ 则是期望误分类误差。
训练误差是在训练样本上的类比定义,例如使用样本对数似然度的模型训练误差为:
$$\overline{\operatorname{err}} = -\frac{2}{N} \sum_{i=1}^N \log\hat{p}\_{g_i}(x_i) \tag{7.7}$$对数似然度可作为一般性的概率密度的损失函数,比如泊松(Poisson)、伽玛(Gamma)、指数(exponential)、对数正态(log-normal)以及其他分布。若 $Y$ 的概率密度 $\operatorname{Pr}_{\theta(X)}(Y)$ 的参数 $\theta(X)$ 依赖于自变量 $X$,那么:
$$L(Y, \theta(X)) = -2 \cdot \log\operatorname{Pr}_{\theta(X)}(Y) \tag{7.8}$$定义式中的“-2”使高斯分布的对数似然度损失恰好等价于平方误差损失。
由于本章主要集中在量化输出变量(平方误差损失函数)的场景,为了便于阐述,本章后续会用 $Y$ 和 $f(X)$ 进行讨论。其他场景通过一些简单的恰当转换后即可适用。
本章会介绍估计一个模型的期望测试误差的不同方法。模型通常会有一个或多个调节参数 $\alpha$,因此可将预测写为 $\hat{f}_\alpha(x)$。调节参数控制着模型的复杂度,我们想要寻找最小化误差的 $\alpha$ 取值,即在图 7.1 对应着平均测试误差曲线最低点的取值。即使如此,通常为了书写简便不会强调 $\hat{f}(x)$ 对 $\alpha$ 的依赖。
需要引起注意的是这里有两个不同的目标:
- 模型选择:估计不同模型的表现,来选择最佳模型。
- 模型评估:选定了最终模型,估计其在新数据上的预测误差(泛化误差)。
如果数据量足够大,上述两个问题的最佳解决方法是将样本随机分成三部分:训练集、验证集和测试集。训练集用来拟合模型;验证集用来估计预测误差,选择模型;测试集用来评估最终选定模型的泛化误差。最好将测试集保存在“保险柜”中,只在模型分析的最后才被取出来。如果在之前的分析中使用了测试集,比如根据测试集上的误差选择模型,那么最终选定模型的测试集误差会低估真实的测试误差,有时低估的程度会很大。
很难给出如何选择三个数据集的样本量的普适规则,因为这通常取决于数据中的信号噪声比以及样本量的大小。一个典型的划分方法为训练集 50%,验证集和测试集各 25%。
本章中的方法适用于数据量不足以支撑划分为三部分的场景中。需要再一次说明,很难给出样本量应该有多大的一般性规则;这取决于隐含的回归函数的信号噪声比,待拟合模型的复杂度,以及其他相关背景。
本章中的方法通过分析的方法(AIC,BIC,MDL,SRM)或对样本有效地再利用(交叉验证和自助抽样)来近似上述的模型验证步骤。除了用于模型选择外,这些方法同时也在某种程度上提供了对最终选定模型测试误差的一个可信的估计。
在介绍这些方法之前,下一节会先详细地探究测试误差的性质,以及偏差方差的权衡。