首先三个概念存在于 有监督学习的范畴

python训练集和测试集怎么拆分 训练集和测试集的关系_机器学习

 

具体功能用途区别:

(1)训练集

作用:估计模型

学习样本数据集,通过匹配一些参数来建立一个分类器。建立一种分类的方式,主要是用来训练模型的。

(2)验证集

作用:确定网络结构或者控制模型复杂程度的参数

对学习出来的模型,调整分类器的参数,如在神经网络中选择隐藏单元数。验证集还用来确定网络结构或者控制模型复杂程度的参数。

(3)测试集

作用:检验最终选择最优的模型的性能如何

主要是测试训练好的模型的分辨能力(识别率等)

 

验证集和测试集的划分

 

为什么需要划分?

 

     防止  过度拟合问题

过度拟合概念:在数据挖掘中一般通过一定量打过标签的训练数据来训练模型,然后再使用训练的模型对测试数据进行预测。但是,训练数据不可能涵盖所有的样例,假设你要做的是预测房价,模型是一条曲线,如果你的这条曲线非常完美的通过了训练数据中所有的点,那么你的模型很有可能就是过拟合状态的,就是对训练数据来说过于完美而偏离了真实的曲线,从而导致预测不准。

 

 

参数角度的划分:

训练集就是用来训练参数的,一般是用来梯度下降的。而验证集基本是在每个epoch完成后,用来测试一下当前模型的准确率。因为验证集跟训练集没有交集,因此这个准确率是可靠的。那么为啥还需要一个测试集呢?

对于一个模型来说,其参数可以分为普通参数超参数

(1)在不引入强化学习的前提下,那么普通参数就是可以被梯度下降所更新的,也就是训练集所更新的参数。

(2)超参数,比如网络层数、网络节点数、迭代次数、学习率等等,这些参数不在梯度下降的更新范围内。尽管现在已经有一些算法可以用来搜索模型的超参数,但多数情况下我们还是自己人工根据验证集来调。

 

总结:

training set是用来训练模型或确定模型参数的,如ANN中权值等;

validation set是用来做模型选择(model selection),即做模型的最终优化及确定的,如ANN的结构;

而 test set则纯粹是为了测试已经训练好的模型准确度。

 

test set这并不能保证模型的正确性,他只是说相似的数据用此模型会得出相似的结果。但实际应用中,一般只将数据集分成两类,即training set 和test set,大多数文章并不涉及validation set。

一个典型的划分是训练集占总样本的50%,而其它各占25%,三部分都是从样本中随机抽取。

 

 

python训练集和测试集怎么拆分 训练集和测试集的关系_深度学习_02

样本少的时候,上面的划分就不合适了。常用的是留少部分做测试集。然后对其余N个样本采用K折交叉验证法。就是将样本打乱,然后均匀分成K份,轮流选择其中K-1份训练,剩余的一份做验证,计算预测误差平方和,最后把K次的预测误差平方和再做平均作为选择最优模型结构的依据。特别的K取N,就是留一法(leave one out)

 

训练集与测试集的常规划分方法:

(1)留出法

1. 把数据集分成互不相交的两部分,一部分是训练集,一部分是测试集。

2. 保持数据分布大致一致,类似分层抽样

3. 训练集数据的数量应占2/3到4/5

4. 为了保证随机性,将数据集多次随机划分为训练集和测试集,然后在对多次划分结果取平均。

 

(2)交叉验证法

1. 将数据集随机分为互斥的k个子集,为保证随机性,P次随机划分取平均。

2. 将k个子集随机分为k-1个一组剩下一个为另一组,有k种分法。

3. 将每一种分组结果中,k-1个子集的组当做训练集,另外一个当做测试集,这样就产生了k次预测,对其取平均

4. 称为p次k折交叉验证,一般取k=10

 

(3)自助法

1. 适用于样本量较小,难以划分时。换句话说,样本量足够时,用自助法并不如留出法和交叉验证法,因其无法满足数据分布一致。

2. 每次随机从数据集(有m个样本)抽取一个样本,然后再放回(也就是说可能被重复抽出),m次后得到有m个样本的数据集,将其作为训练集

3. 始终不被抽取到的样本的比例:

python训练集和测试集怎么拆分 训练集和测试集的关系_数据集_03

也就是说这保证了训练集样本数(不重复)在2/3左右

注意:

将数据集划分训练集和测试集是为了选定一个相对好的模型,当模型选定以后,训练数据仍是整个数据集。