在商业应用中,我们经常会有多个学习算法可供选择,甚至对同一个学习算法,使用不同的参数配置时也会产生不同的模型。那么我们应该选择哪一个学习算法,使用哪一种参数配置呢。理想的解决方法是对候选模型的泛化误差进行评估,然后选择泛化误差最小的模型。但是又会陷入如何直接获得泛化误差的问题中。而只依靠训练误差又会因为过拟合现象的存在而不适用作为标准。
一、评估方法:
虽然无法直接获得模型的泛化误差,但是我们可以通过实验测试的方法来对学习期的泛化误差进行评估进而选出最合适的模型。为此我们需要“测试集”来测试学习期对新样本的判别能力,然后以测试集上的“测试误差”作为泛化误差的近似。为了保证“测试误差”对泛化误差的近似效果,我们应尽量保证测试样本从样本真实分布中独立同分布采样得到。
1、留出法
“留出法”(hold-out)直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,在S上训练出模型后用T评估测试误差,作为对泛化误差的估计。
“留出法”需要注意两个方面:
(1)训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程中引入的额外偏差对最终效果造成影响。
(2)单词使用留出法的估计效果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
(3)训练集S过大会导致T的评估结果不够稳定准确,S过小又会导致训练样本不够,降低了评估结果的保真性(训练结果与真实样本的模型结果相差甚远),经验上一般取2/3到4/5的样本作为训练集。
2、交叉验证法
交叉验证法(cross validation)先将数据集D划分为k个大小相似的互斥子集,即
其中每个子集同样要尽可能保持数据分布的一致性,之后每次用k-1个子集作为训练集,余下的那个子集作为测试集。 最终取k次测试结果的均值作为返回结果。
3、留一法
假定数据集中包含m个样本,若令k=m,则得到了交叉验证法的一个特例:留一法(Leave-One-Out,简称LOO)。留一法不受随机样本划分的方式影响而且留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。
因此留一法的评估结果往往被认为比较准确。但是在数据集较大时训练模型开销极大,而且“没有免费的午餐”定理对实验评估方法同样适用,不能保证留一法的估计结果永远比其他评估方法准确。
4、自助法“boostrapping”
在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致得到估计偏差。留一法能保证训练集S得到的模型结果与用D训练的模型结果相似,但计算复杂度太高。“自助法”是一个比较好的解决方案。
假定训练集D有m个样本,我们对D进行m次有放回重复抽样产生数据集D'。当m足够大时,可以通过取极限算出来样本在m次采样中始终不被采到的概率是
我们可将D'作为训练集,D\D'作为测试集。这样实际评估的模型与期望评估的模型都使用m个样本,而我们仍有数据总量约1/3的没在训练集中出现的样本用于测试,这样的测试结果也交做“包外测试”。
优点:在数据集较小,难以划分训练/测试集时很有用;从能初始数据中产生多个不同的训练集,对于集成学习等方法有很大的好处。
缺点:自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。
因此在初始数据量足够时,留出法和交叉验证法更加常用。