深度学习数据集处理(二)数据集划分训练集、测试集

深度学习数据集处理系列

  • 深度学习数据集处理(一)获取公开数据集
  • 深度学习数据集处理(三)将自己数据集制作为TFrecords

为何需要进行数据集划分?

  • 再训练模型时,我们得到了一个较高的准确率,比如达到了99%,训练误差只有1%,本以为此模型在应用于评估新样本时,可以得到好的结果,但是令我们意外的是,结果竟然十分差。所以,这样的模型好不好呢?显然这不是我们想要的模型。
  • 实际上,我们希望的是,一个模型在新样本上能够得到好的结果。所以说,当学习器把训练样本训练到太好了,很有可能是已经把训练样本自身的一些特点当做了所有潜在样本都会具有的一般性质,这样泛化能力也就降低了。这样的情况我们可以称之为**过拟合(overfitting)**与欠拟合(underfitting)对应。所以,我们需要一个测试集测试学习器对新样本的判别能力。以测试误差作为泛化误差的近似。注意,测试集应该与训练集互斥。

常用的划分方法

1. 留出法

  • 留出法(hold-out)将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即 D = S ∪ T , S ∩ T = ∅ D=S \cup T, S \cap T=\emptyset D=ST,ST=在S上训练出模型后,用T作为评估其测试误差,作为对泛化误差得估计。
  • 训练/测试及的划分要尽可能的保持数据分布的一致性,避免因数据划分过程引入额外的偏差对最终结果产生影响。例如对D进行分层采样获得 70 70% 70样本作为训练集S, 30 30% 30样本作为测试集,如果D包含500正样本,500负样本,则分层采样的S应该包含350正样本,350负样本,T中则包含150正样本,150负样本,如果S、T中样本类别差别很大,则误差估计将由于训练/测试数据分布得=的差异性产生偏差。
  • 另外,在采用留出法时要采用若干次随机划分,每次产生一个训练/测试集用于实验的评估。
  • 此外若训练集S包含绝大多数样本,则训练出来的结果可能更接近D训练出的模型,由于T比较小,评估结果可能不够稳定准确;若令测试集T多包含样本,则训练集S与D差别更大了,被评估的模型与用D训练出来的模型相比可能较大差别,从而降低了评估结果的保真·性。常用的做法是将大约2/3~4/5样本用于训练,剩余的样本用于测试。

2. 交叉验证法

  • 交叉验证法(cross validation)先将数据集D划分为K个大小相似的互斥子集,即$ D = D 1 ∪ D 1 ∪ . . . ∪ D k , D i ∩ D j = ∅ ( i ≠ j ) D=D_1 \cup D_1\cup ...\cup D_k,D_i \cap D_j= \emptyset(i \neq j) D=D1D1...Dk,DiDj=(i̸=j)每个子集 D i D_i Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次永 k − 1 k-1 k1个子集作为训练集,剩余的那个子集作为测试集;这样就可以获得 k k k组训练/测试集,从而可以进行k次训练和测试,最终返回k个测试结果的均值。显然,交叉验证法结果的稳定性和保真性在很大程度上取决于k的取值,通常把交叉验证法称为“K折交叉验证”,k的取值常用10,此时为10折交叉验证。其他常用的有5,、20等。下图为10折交叉验证示意图:
    深度学习数据集处理(二)数据集划分训练集、测试集_第1张图片
注:引自周华志《机器学习》
  • 与留出法类似,将数据集D划分为K个子集同样有多种方式,为减小因为样本划分不同而引起的差别,K折交叉验证通常随机使用不同的划分重复 P P P次最终结果为 p p p次K折交叉验证结果的均值,常见的有“10次10折交叉验证 ”。
  • 假定数据集D包含m个样本,若 k = m k=m k=m,得到的交叉验证法的特例:留一法(LOO),显然,留一法不受随机样本划分的影响。

3. 自助法

  • 自助法直接以自助采集法(bootstrap sampling)为基础,给定包含m个样本的数据集D,对其进行采样产生数据集 D ‘ D^ ` D:每次随机从D中挑选一个样本,将其拷贝到 D ‘ D^` D中,然后再将该样本放入初始数据集D中,使样本在下次采样时任然可能被采样到,这个过程重复执行m次,得到包含m个样本的数据集 D ‘ D^` D这就是自助法的结果。显然,D中有一部分样本会在 D ‘ D^` D中多次出现,而另一部分不出现。可以做一个简单的估计,样本在m次采样中始终不被采样的概率 ( 1 − 1 m ) m (1- {1 \over m} )^m (1m1)m取得极限为 1 e ≈ 0.386 {1 \over e} \approx 0.386 e10.386所以初始数据集D中约有36.8%样本未出现在数据集 D ‘ D^` D中所以可以用 D ‘ D^` D作为训练集,D\ D ‘ D^` D作为测试集。

参考:周华志《机器学习》

你可能感兴趣的:(tensorflow,Python,深度学习,Deep,learning)