训练集、测试集的划分
机器学习中,将数据集划分为训练集、验证集、测试集。训练集构建模型,然后用模型计算测试集的测试误差,最后以测试集的测试误差近似为模型的泛化能力,根据泛化能力来评估模型的优劣。
本文首先引入数据集概率分布的概念,然后介绍模型评估方法。
1. 数据集的概率分布
总体样本服从某一分布P(X),数据集D是从总体样本中独立随机抽样m次获取的,数据集D = {(x1, y1), (x2, y2), (x3, y3),...(xm, ym)}.
D的概率分布:
P(D) = P(x1)*P(x2)*P(x3)...*p(xm)
若再次从总体样本中随机抽样m次得到数据集D1,数据集D1 = {(x1', y1), (x2', y2),(x3', y3)...(xm', ym)},若数据集不同,那么数据集构建的最优模型也不同。
2. 模型评估方法
模型评估方法是数据集划分训练集和测试集的方法。常用的方法有留出法、交叉验证法、自助法。
2.1 留出法
“留出法”(hold-out)将数据集D划分为两个互斥的集合,其中一个集合为训练集S,另一个作为测试集T,即
D = SυT,S∩T = Φ
训练集S具体划分为训练集和验证集,训练集模型构建模型,验证集对该模型进行参数择优,选择最优模型,测试集T测试最优模型的泛化能力。
训练集和测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。如数据集D包含500个正样本,500个负样本,数据集D划分为70%样本的训练集和30%样本的测试集,为了保证训练和测试正负样本比例与数据D比例相同,采用分层抽样的方法,先从500个正样本随机抽取350次,500个负样本随机抽取350次,然后剩下的样本作为测试集,分层抽样保证训练集的正负样本的比例与数据集D的正负样本比例相同。
留出法的另一个问题是训练集S和测试集T是从数据集D随机抽样得到的,因此偶然性较大,需要多次进行留出法计算每次的测试误差率,然后对每次的测试误差求平均(如下图),减小偶然因素。
图1、 平均留出法
初始数据集D的概率分布:
P(D) = P(S1)*P(T1)
第一次留出法抽样的训练集的概率分布:P(S1)
留出法的训练集只包含了一定比例的初始数据集,留出法训练数据集S1和初始数据集D的概率分布不一样,因此用留出法估计的模型存在估计偏差。
2.2 交叉验证法
“交叉验证法”(cross validation)先将数据集D划分为k个大小相似的互斥子集
D = D1 υ D2 υ D3...υ Dk,Di∩Dj = Φ(i ≠ j)
每个子集Di通过分层采样得到(如上所述,为了保证正负样本的比例与数据集D的比例相同),然后用k-1个子集的并集作为训练集,余下的子集作为测试集;这样就获得k组训练/测试集,从而进行k次训练和测试,最终返回的是这k个测试结果的均值。通常把交叉验证法称为“K折交叉验证法”,k最常用的取值是10,此时称为10折交叉验证。下图为10折交叉验证的示意图。
图2、10折交叉验证示意图
初始数据集的概率分布:
P(D) = p(D1)*P(D2)*P(D3)*...*P(D9)*P(D10)
十折交叉验证的第一折的训练集的概率分布:
P(D') = P(D1)*P(D2)*P(D3)*...*P(D9)
十折交叉验证的训练集只包含初始数据集的90%,训练数据集D'和初始数据集D的概率分布不一样,因此用十折交叉验证估计的模型存在估计偏差。
若数据集D包含m个样本,先将数据集D划分为m个大小相似的子集,每个子集只有一个样本数据,则得到了交叉验证法的一个特例,留一法(Leave-One-Out,简称LOO)。因为留一法的训练数据集相比原始样本数据集D只少了一个样本,因此留一法的评估结果比较准确。但留一法在训练训练数据比较大时,训练m个模型的计算开销可能是难以忍受的(例如数据集包含1百万个样本,则需要训练1百万个模型),若考虑模型参数优化的情况下,计算量则会成倍增加。
2.3 自助法
我们希望评估的是用原始数据集D训练出的模型,但是留出法和交叉验证法训练的数据集比原始的数据集D小,这必然会引入因训练数据集不同导致的估计偏差,留一法受训练样本规模变化的影响较小,但是计算复杂度太高。
“自助法”(bootstrapping)是放回抽样,给定包含m个样本的数据集D,我们对它进行采样产生数据集D':每次随机从D中挑选一个样本,将该样本拷贝放入D',然后再将该样本放回初始数据集D中,下次抽样时仍有可能被采到;重复执行m次该过程,我们就得到包含m个样本数据集D',这就是自主采样的结果。初始数据集D中有一部分样本会在数据集D'中多次出现,也有一部分样本不会在数据集D'中出现。
样本在m次采样中始终不被采到的概率是:
P(一次都未被采集) = (1-1/m)m
对m取极限得到:
上式可知,通过自助采样,初始数据集D中约有36.8%的样本未出现在采集数据集D',于是我们可将D'用作训练集,实际评估的模型与期望评估的模型都使用m个训练样本,我们仍有数据总量约1/3的,没在训练集中出现的样本作为测试集用于测试,这样的测试结果,亦称“外包估计”。
自助法在数据集较小,难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习(强学习分类器)等方法有很大的好处,然而,自助法产生数据集改变了初始数据集的分布,这会引入估计偏差。
数据集D分为D1,D2,D3,D4数据集,假设知道自助采样的数据集结果,比较自助法采样产生的数据集分布和初始数据集的分布。
初始数据集D的概率分布:
P(D) = P(D1)*P(D2)*P(D3)*P(D4)
第一次自助采样D1'的概率分布:
P(D1') = P(D1)*P(D1)*P(D2)*P(D2)
第二次自助采样D2'的概率分布:
P(D2') = P(D2)*P(D3)*P(D3)*P(D4)
由上述表达式可知道,初始数据集与自助采样数据集D1'、自助采样数据集D2'的概率分布不一样,且自助法采样的数据集正负类别比例与原始数据集不同,因此用自助法采样的数据集代替初始数据集来构建模型存在估计偏差。
3. 讨论
本文讨论了三种机器学习模型评估方法;留出法、交叉验证法和自助法。留出法和交叉验证法虽然通过分层抽样的方法没有改变初始数据集正负类比的比例,但是训练数据集的样本数少于原始数据集,训练数据集的概率分布与原始数据集的概率分布不一样,因此留出法和交叉验证法在构建模型时存在估计偏差;自助法虽然样本容量和初始数据集一样,但是改变了初始数据集的分布和正负类别比例,用自助法抽样的数据集分布来代替初始数据集的分布,同样存在估计偏差。
因此,若对于小样本的数据集,个人建议采用自助法抽样的方法,然后用强训练分类器构建模型;若对于大一点的样本数据集则建议采用十折交叉验证法,超大样本数据及则建议采用留出法构建模型。