模型评估
误差(error):学习器实际预测输出与真实输出之间的差异。
训练误差(training error):学习器在训练集上的误差。
泛化误差(generalization error):学习器在新样本上的误差。
模型选择的理想方案是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个。通常,可通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此,需使用一个“测试集”(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”(testing error)作为泛化差的近似。通常假设测试样本也是从样本真实分布中独立同分布采样而得、但需注意的是,测试集应该尽可能与训练集互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过。通过对数据集进行适当的处理可以得到训练集和测试集,常用的有交叉验证法和自助法。
所以,模型评估主要分为三个步骤:
- 对数据集进行划分,分为训练集和测试集两部分;
- 对模型在测试集上面的泛化性能进行度量;
- 基于测试集上面的泛化性能,依据假设检验来推广到全部数据集上面的泛化性能。
1. 交叉验证法
1.1 验证集方法
验证集方法是一种非常简单的方法:
首先随机的把获得的观测集分为两部分:训练集和验证集。模型在训练集上拟合,然后用拟合的模型来预测验证集中观测的响应变量(因变量)。最后得到一个验证集的错误率,提供了对于测试错误率的估计。
验证集方法的原理简单,且易于执行。但其有以下两个缺点:
- 在验证方法中测试的错误率波动很大。测试的错误率主要取决于哪些观测数据被划分到训练集中,哪些被划分到测试集中。
- 验证集错误率可能会高估整个数据集的测试错误率。因为只有一部分数据被用于训练,而用于训练的观测越少,模型训练的表现可能越不好。
在Auto数据集上,用验证集方法来用horsepower来预测mpg所产生的测试误差。左图是用一次验证集方法所产生的测试误差。右图是将该方法运用十次的测试误差。
1.2 留一交叉验证法(leave-one-out cross-validation, LOOCV)
与验证集方法一样,LOOCV也将观测集分为两部分。如果数据集 D D D的大小为 N N N,那么用 N − 1 N-1 N−1条数据进行训练,用剩下的一条数据 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)作为验证。由于在拟合过程中没有用到 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),所以可以用 M S E 1 = ( y 1 − y 1 ^ ) 2 MSE_1=(y_1-\hat{y_1})^2 MSE1=(y1−y1^)2计算测试误差。但由于 M S E 1 MSE_1 MSE1是基于一个单独的观测计算得出的,具有高度的波动性。
于是,重复这个步骤,把 ( x 2 , y 3 ) (x_2,y_3) (x2,y3)选为验证数据,在剩下的 N − 1 N-1 N−1个观测 { ( x 1 , y 1 ) , ( x 3 , y 3 ) , . . . , ( x n , y n ) } \{(x_1,y_1),(x_3,y_3),...,(x_n,y_n)\} {
(x1,y1),(x3,y3),...,(xn,yn)}上训练统计学习方法,然后计算 M S E 2 = ( y 2 − y 2 ^ ) 2 MSE_2=(y_2-\hat{y_2})^2 MSE2=(y2−y2^)2。重复这个方法 N N N次会得到 N N N个均方误差, M S E 1 , . . . , M S E n MSE_1,...,MSE_n MSE1,...,MSEn。测试均方误差是这些测试误差估计的均值:
C V ( n ) = 1 n ∑ i = 1 n M S E i CV_{(n)}=\frac{1}{n}\sum_{i=1}^n MSE_i CV