为啥要划分训练集、验证集和测试集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥要划分训练集、验证集和测试集相关的知识,希望对你有一定的参考价值。

参考技术A

一般来说机器学习的数据集都会被划分成三个个子集 训练集,验证集 测试集

我们拿到的数据集通常都是由人工或者半自动化的方式收集来的,每个输入数据都有对应的输出,机器学习要做的是学习这些已经收集好的数据中所包含的信息,并且在新的输入数据出现时成功预测到输出。

在实现机器学习的过程中, 训练集 是用来训练模型的,给模型输入和对应的输出,让模型学习它们之间的关系。

验证集 是用来估计模型的训练水平,比如分类器的分类精确度,预测的误差等,我们可以根据验证集的表现来选择最好的模型。

测试集 是输入数据在最终得到的模型得到的结果,是训练好的模型在模拟的“新”输入数据上得到的输出。测试集只能在最后用于测试模型的性能,不能拿来训练。

最后,应用阶段,训练好的模型可以被应用在实际获得的数据并且得到结果,但是这个阶段是没办法评价的,模型的质量只能从验证集和测试集上看出来。

大概就是:机器学习(背答案)——>做题(默写答案)——>模考(看答案背的怎么样)——>高考(生死由命)

比较常见的划分数据集的方式是:50%用于训练,25%用于验证,25%用于测试。这个比例也可以根据数据集的大小和数据信噪比来改变。

数据集划分可以用sklearn的train_test_split函数:

数据集的划分

参考技术A

按一定比例划分为训练集和测试集
这种方法也称为保留法。我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证模型的有效性。
在验证集上计算出来的最后评估指标与原始分组有很大关系。

交叉验证一般采用k折交叉验证,即,往往k取为10。在这种数据集划分法中,我们将数据集划分为k个子集, 每个子集均做一次测试集,每次将其余的作为训练集 。在交叉验证时,我们重复训练k次,每次选择一个子集作为测试集,并将k次的平均交叉验证的正确率作为最终的结果。

K越大,Bias越小。Variance越大
最后,我们要说说K的选取。事实上,和开头给出的文章里的部分内容一样,K的选取是一个Bias和Variance的trade-off。
K越大,每次投入的训练集的数据越多,模型的Bias越小。但是K越大,又意味着每一次选取的训练集之前的相关性越大(考虑最极端的例子,当k=N,也就是在LOOCV里,每次都训练数据几乎是一样的)。而这种大相关性会导致最终的test error具有更大的Variance。
一般来说,根据经验我们一般选择k=5或10。

不管是 Holdout检验还是交叉检验,都是基于划分训练集和测试集的方法进行模型评估的。然而,当样本规模比较小时,将样本集进行划分会让训练集进一步减小,这可能会影响模型训练效果。有没有能维持训练集样本规模的验证方法呢?自助法可以比较好地解决这个问题。自助法是基于自助采样法的检验方法。对于总数为n的样本集合, 进行n次有放回的随机抽样,得到大小为n的训练集。n次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集,进行模型验证 ,这就是自助法的验证过程。

以上是关于为啥要划分训练集、验证集和测试集的主要内容,如果未能解决你的问题,请参考以下文章

训练集和测试集

训练集,验证集,测试集的作用

如何利用python将txt文件划分训练集和测试集

数据集的划分

目标检测---数据集格式转化及训练集和验证集划分

如何把数据集划分成训练集和测试集