训练集和测试集的划分方法

当我们只有一个包含m个样例的数据集D={(x1,y1),(x2,y2),...,(xm,ym)},既要训练又要测试,怎样才能做到呢?答案是对D进行适当的处理,从中产生出训练集S和测试集T,下面介绍几种常见的方法。(内容来自西瓜书)

1.流出法

 留出法(hold-out)直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。

 需要注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似。(从采样角度来看则保留类别比例的采样方式通常称为“分层采样”)。例如:对D进行分层采样而获得含百分之70样本的训练集S和含百分之30的样本的测试集T,若D包含500个正例500个反例,则分层采样得到的S包含350个正例350个反例,T包含150个正例和150个反例。若S,T中样本类别比例差别很大,则误差估计将由训练/测试数据分布的差异而产生偏差。

   另一个与要注意的问题是,即便在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集D进行分割。例如在上面的例子中,可以把D中的样本排序,然后把前350个正例放到训练集中,也可以把最后350个正例放到训练集中,。。。这些不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。因此,单次使用留出法得到的评级结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随即划分、重复进行实验评估后取平均值作为留出法的评估结果

  此外,我们希望评估的是用D训练出的模型的性能,但留出法需划分训练/测试集,这就会导致一个窘境:若令训练集S包含绝大多数样本,则训练出的模型可能更接近于用D训练出的模型,但由于T比较小,评估结果可能可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性。这个问题没有完美的解决方案,常见做法是将大约2/3-4/5的样本用于训练,剩余样本用于测试。

2.2交叉验证法

 交叉验证法(cross validation)先将数据集D划分为k个大小相似的互斥子集.每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可以获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个 测试结果的均值。显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为强调这一点,通常把交叉验证法成为"k折交叉验证"(k-fold cross validation).k最常用的取值是10,其他常用的k值有5 20等。

   与留出法相似,将数据集D划分为k个子集同样存在多种划分方式。为减小因样本划分不同而引入的偏差,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的有"10次10折交叉验证"

  假定数据集D中包含m个样本,若令k=m,则得到了交叉验证法的一个特例:留一法(Leave One Out).显然,留一法不受随机样本划分方式的影响。因为m个样本只有唯一的方式划分为m个子集(每个子集包含一个样本);留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。因此,留一法的评估结果往往被认为比较准确。然而 留一法也有其缺陷:在数据集比较大时,训练m个模型的计算开销可能时难以忍受的(例如数据集包含1百万个样本,则需要训练1百万个模型),而这还是在未考虑算法调参的情况下。另外,留一法的估计结果也未必永远比其他评估方法准确;“没有免费的午餐”定义对实验评估方法同样使用。 

3.自助法

  我们希望评估的是用D训练出的模型,但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差。留一法受训练样本呢规模变化的影响较小,但计算复杂度又太高了。有没有什么办法可以减少训练样本规模不同造成的影响,同时还能比较高效的进行实验估计呢?

  “自助法”(bootstrapping)是一个比较好的解决方案,他直接以自助采样法(bootstrap sampling)为基础。给定包含m个样本的数据集D,我们对他进行采样产生数据集D*:每次随即从D中挑选一个样本,将其拷贝放入D*,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采到;这个时候重复执行m次后,我们就得到了一个包含m个样本呢的数据集D*,这就是自助采样的结果。显然,D中有一部分样本会在D*中多次出现,而另一部分样本不出现。可以做一个简单的估计,样本在m次采样中始终不被采到的概率是(1-\frac{1}{m})^{m},取极限得到:\lim_{m\rightarrow \propto }(1-\frac{1}{m})^{m} \rightarrow \frac{1}{e}\approx 0.368.即通过自助采样,初始数据集D中约有百分之36.8的样本未出现在采样数据集D*中。于是我们可将D*作为训练集,D\D*用作测试集;这样,实际评估的模型与期望估计的模型都使用m个训练样本,而我们仍有数据总量约为1/3的、没在训练集中出现的样本用于测试。这样的测试结果也成为“包外估计”(out of bagestimate)

   自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够时,留出法和交叉验证法更常用一些。

你可能感兴趣的:(深度学习,机器学习)