机器学习中数据集划分方法

1.留出法(hold-out)

       例如我们现在有一个包含m个样例的数据集D = {(x1,y1),(x2,y2)···,(x3,y3)},需要训练、测试,就要对其进行划分,分为训练集S,测试集T。
       该方法直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个则作为T,当在S上训练得到模型后,再用T评估模型的测试误差(对泛化误差的估计)。泛化误差是指模型(学习器)在新样本上的误差,反应的是模型适应能力,泛化误差越小的模型越好。举个留出法的🌰:
       现有1000组数据的数据集D,现将其划分为训练集S包含700个样本,测试集T包含300个样本,通过训练算法训练得到的模型对测试集进行测试,若有60个数据出现与预期结果不同,得到错误率为(60/300)x100% = 20%则训练精度为1-20% = 80%。
       划分应注意数据在训练集与测试集中的分布一致性(保留数据在不同集合中的类别比例),主要采用分层采样的方法,避免因数据划分过程引入额外的偏差而对最终结果产生影响。还应注意的是,同一划分比例下划分方式的不同(如提取前700的数据与提取后700的数据),也会导致模型评估的结果出现差别。因而在使用留出法时划分数据集时,通常不是单次使用该方法,需要多次随机划分、重复进行实验评估后取平均值作为留出法的评估结果
       该方法的一些矛盾之处:在划分时,若令训练集包含较多样本,则训练出来的结果可能能更接近适用D训练出的模型,但由于测试集比较小,评估结果可能不够稳定准确。若测试集包含较多的样本,则训练出来的模型与用D训练出来的模型可能有较大差别,从而降低了评估结果的保真性(fidelity)。常见采用2/3~4/5的样本用于训练,其余样本用于测试。

2.交叉验证法(cross validation)

       同样是m个样本的数据集D,通过分层采样(确保数据分布的一致性)的方法将数据集D划分为k个大小相等的互斥子集,每次将其中k-1个子集取并集作为训练集,剩余一个作为测试集,从而可以进行k次训练和测试,最终得到的结果是k次测试结果的均值。
       评估结果的稳定性和保真性取决于k的取值,通常把该方法又叫做k折交叉验证(k-fold cross validation)k通常取值 5 10 20等。同时将数据集划分为k个子集的划分方式的不同也会导致评估结果出现差别,为减小这样的差别,可以随机划分方法并重复取平均值,例如随机重复划分p次的k折交叉验证
       特殊情况:对于含m个样例的数据集D若采用m折划分即k = m,每个子集中只含一个样例,则称这种方式为留一法,显然,留一法训练得到的模型与D训练出的模型很相似,因此这种方法的评估结果比较准确。但其仍有缺点,由于训练样本与原数据集相差无几,所以若原数据集很大,通过留一法进行训练模型,计算开销非常大。

3.自助法(bootstrapping)
       为减小因为训练集合没有达到预期数据集大小而带来的估计误差(前两种方法),同时降低训练集数据量过大时的计算复杂度(留一法),保持高效、有效的实验估计而提出一种自助采样法(bootstarp sampling)
       从数据集D中采样得到数据集D’,每次随机从D中挑选一个样本,将其拷贝放入D’,再将样本放回D重复m次,样本在m次采样中始终不被采到的概率是(1 - 1/m)m,取极限得到概率约为0.368。通过自助采样的方法,还应36.8%的数据未出现在D’中,于是使用D’作为训练集,D中剩余部分作为测试集。这样可以看作实际参与训练的样本数与期望参与训练的样本数都为m个,而测试集中仍有1/3的样本,因此这种方式也叫包外估计(out-of-bag estiamte)
       显然对于数据集小、样本难以有效划分两个集合时自助法很有效,同时也改变了数据样本的分布,这会对训练得到的模型带来估计误差。
参考文献:🍉书

更多推荐