训练集、开发集和测试集数据划分以及机器学习参数调整

Posted by Chen Quan on January 19, 2018

1.如何选择训练集、开发集和测试集数据?

a.一般需要将样本分成独立的三部分训练集(train set),开发集(develop set)和测试集(test set)。其中训练集用来估计模型,开发集用来确定网络结构或者控制模型复杂程度的参数,而测试集则检验最终选择最优的模型的性能如何。一个典型的划分是训练集占总样本的50%,而其它各占25%,三部分都是从样本中随机抽取。

b.在大数据时代的机器学习或者深度学习领域中,如果还是按照传统的数据划分方式不是十分合理,因为测试集和验证集用于评估模型和选择模型,所需要的数据量和传统的数据量差不多,但是由于收集到的数据远远大于传统机器学习时代的数据量,所以占的比例也就要缩小。比如我们拥有1000000,这么多的数据,训练集:验证集:测试集=98:1:1。如果是两类,也就是相同的道理。

如果你的训练和测试数据来自相同的分布

1.打乱并将您的数据分成训练/开发/测试集

Ng建议训练/开发/测试拆分约70%/ 15%/ 15%。

2.测量你的训练错误和开发集错误,并计算偏差和方差

计算你的偏差和方差为:

偏差=(训练集错误) - (人为错误)

方差=(开发集错误) - (训练集错误)

3.你的偏差值高吗?

高偏差的例子:

错误类型 错误率
人为错误 1%
训练集错误 5%
开发集错误 6%

在进入下一步之前修正高偏差。

4.你有高方差吗?

高方差的例子:

错误类型 错误率
人为错误 1%
训练集错误 2%
开发集错误 6%

一旦你解决了高方差,那么你完成了!

如果你的训练和测试数据不在同一分布上

1.拆分你的数据

如果你的训练和测试数据来自不同的分布,请确保至少您的开发和测试集是从相同的分布。你可以这样做,采取你的测试集,并使用一半作为开发和一半作为测试。

把你的训练集中的一小部分(称之为“训练-开发”),并将您的测试数据分解为开发和测试:

训练(分布1)   测试(分布2)  
训练 训练-开发 开发 测试

2.测量你的错误,并计算相关指标

计算这些指标,以帮助你了解你的工作重点:

错误类型 公式
偏差 (训练错误)-(人为错误)
方差 (训练-开发错误)-(训练错误)
训练/测试不匹配 (开发错误) - (训练-开发错误)
开发错误 (测试错误) - (开发错误)

3.你有高偏差吗?

高偏差的例子:

错误类型 错误率
人为错误 1%
训练集错误 10%
训练-开发错误 10.1%
开发集错误 10.2%

在进入下一步之前修正高偏差。

4.你有高方差吗?

高方差的例子:

错误类型 错误率
人为错误 1%
训练集错误 2%
训练-开发错误 10.1%
开发集错误 10.2%

在进入下一步之前修正高方差。

5.你有训练/测试不匹配吗

训练/测试不匹配的例子:

错误类型 错误率
人为错误 1%
训练集错误 2%
训练-开发错误 2.1%
开发集错误 10%

在进入下一步之前修正训练/测试不匹配。

6.你是否过度拟合你的开发集?

过度拟合开发集的例子:

错误类型 错误率
人为错误 1%
训练集错误 2%
训练-开发错误 2.1%
开发集错误 2.2%
测试错误 10%

一旦你解决了拟合开发集,那么你完成了!

如何修正高偏差

img

Ng提出了这样一种修正高偏差模型的方法:

  • 尝试一个更大的模型

  • 尝试更长时间的训练

  • 尝试一个新的模式架构(这可能很难)

如何修复高方差

Ng提出了一些修正高方差模型的方法:

  • 获取更多数据

  • 这包括数据合成和数据扩充

  • 尝试添加正则化

  • 尝试提前停止

  • 尝试新的模型架构(这可能很难)

如何修复训练/测试不匹配

img

Ng建议用这种方式来修正一个具有高训练/测试不匹配的模型:

  • 尝试获得更多与你的测试数据类似的数据

  • 尝试数据合成和数据扩充

  • 尝试新的模型架构(这可能很难)

如何解决过度拟合你的开发组

Ng建议只有一种方式来修复设备过度配置:

  • 获取更多的开发数据,这也将包括数据合成和数据增加。