当我们用“训练集”训练好一个模型之后,首先希望看看它的性能如何,一般情况下,我们通常使用一个“测试集”来测试模型对新样本的判别能力,然后以测试集上的“测试误差”来作为泛化误差的近似,通常我们假设测试样本也是从样本真实分布中独立同分布采样得到的,但是,测试集应尽可能与训练集互斥,因为只有当测试样本没有在训练过程中使用过时,才能检验模型对新样本的判别能力。
可是,我们只有一个包含m个样例的数据集D={(x1,y1),(x2,y2),......,(xm,ym)},既要训练,又要测试,我们该怎么对D进行适当的处理,才能从中产生合适的训练集S和测试集T呢。常见的做法有以下三种:
留出法:
“留出法”直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即D=SUT,S∩T=?,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
以二分类任务为例,假定D包含1000个样本,将其划分为S包含700个样本,T包含300个样本,用S进行训练后,如果模型在T上有90个样本分类错误,那么其错误率为(90/300)*100%=30%,相应的,精度为1-30%=70%。
一方面,训练集和测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,从采样的角度来说,则是要采用“分层采样”的方式,例如D包含500个正例和500个反例,则通过分层采样获得含70%样本的训练集S和含30%样本的测试集S,即S包含350个正例和350个反例,而T包含150个正例和150个反例,如果S,T中样本类别比例差别很大,则误差估计将由于训练集和测试集数据分布的差异而产生偏差。另一方面,即使给定训练集和测试集的比例后,仍然存在多种方式对初始数据集进行分割,例如对D中的样本进行排序,可以把前350个正例给训练集,也可以把后350个正例给训练集,......这些不同的划分将导致不同的训练集和测试集,相应的,模型评估的结果也会有差别,因此,单次使用留出法得到的结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分,重复进行实验评估后取平均值作为留出法的评测结果。、
此外,我们希望评估的是用D训练出的模型的性能,但留出法需划分训练集和测试集,这就产生了矛盾:若令训练集S包含绝大多数样本,则训练出的模型可能更接近用D训练出的模型,但由于T比较小,评估结果可能不够稳定准确,若令测试集T多包含一些样本,则训练集S与D的差别更大了,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性,这个问题没有完美的解决方案,常见做法是将大学2/3~4/5的样本用于训练,剩余样本用于测试。
交叉验证法:
“交叉验证法”先将数据集D划分为k个大小相似的互斥子集,即D=D1D2Dk,DiDj=(i!=j)。每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采用得到,然后每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样就可获得k组训练/测试集,从而进行k次训练和测试,最终取k个测试结果的平均值,显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,通常我们把交叉验证法称为“K折交叉验证”,k最常用的取值是10,称为10折交叉验证,下图给出了10折交叉验证的示意图
与留出法类似,存在多种方式将数据集D划分为k个子集,为减小因样本划分不同而引入的差别,通常随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,常见的是“10次10折交叉验证”。
假设数据集D有m个样本,若令k=m,则得到交叉验证的一个特例:留一法,显然,留一法不受随机样本划分方式的影响,因为m个样本划分为m个子集只有一种方式,而且每个子集中只有一个样本,这使得训练集只比原始数据集少了一个样本,从而实际评估的模型与期望评估的用D训练的模型很相似,所以,留一法的评估结果往往被认为比较准确,然而,留一法也有其缺陷,当数据集比较大时,训练m个模型的计算开销将会非常巨大。
自助法:
我们希望评估的是用原始数据集D训练出的模型,但在留出法和交叉验证法中,都保留了一小部分样本用于测试,因此实际评估的模型多使用的训练集比D少,这必然会引入一些因训练样本规模不同而导致的估计偏差,留一法受训练样本规模变化的影响较小,但是计算复杂度太高。
“自助法”可以减少训练样本规模不同造成的影响,同时还能比较高效的进行实验评估,它直接以自主采样法为基础,假定原始数据集D包含m个样本,通过采样产生数据集D‘,每次随机从D中挑选一个样本,将其拷贝放入D‘,然后再将该样本放回D中,是的该样本在下次采样时仍有可能被采到,重复这个过程m次,我们就得到了一个包含m个样本的数据集D‘,显然,D中有一部分样本会在D‘中多次出现,而另一部分不出现,样本在m次采样中始终不被采样到的概率是(1-1/m)m,取极限可得:
通过自助采样,D中约有36.8%的样本未出现在采样数据集D‘中,于是我们可将D‘用作训练集,D\\D‘用作测试集,这样实际评估的模型与期望评估的模型都使用m个训练样本,而我们仍有约1/3未在训练集中出现的样本用于测试,这样的测试结果,亦称“包外估计”。
自助法在数据集较小,难以有效划分训练集和测试集是很有用,此外,自助法从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处,然而,自助法产生的数据集改变初始数据集的分布,这会引入估计偏差,因此,在初始数据量足够时,留出法和交叉验证法更常用一些。