模型训练过程中的训练集、训练开发集、开发集和测试集总结

36.什么时候你应该在不同分布上做训练和测试

当你的猫app已经上传10000张图,你已经人工标记它们有没有猫,同时你有200000张互联网上下载的图,这时你要怎么划分训练开发测试集呢? 
当你训练深度学习模型时,可能必须用到那200000张图,那么训练和测试集的分布就不同,这会怎样影响你的工作呢? 
当然将210000张图片随机分裂到训练开发测试集是一种方法,但我(吴恩达)不推荐这种方法,记住选择开发测试集的推荐方法是:选择你未来预期会得到的数据来作为开发测试集。 
大多数学术文章假设训练开发测试集的分布相同,在机器学习的早期,数据稀缺,常常仅有一个服从同一分布的数据集,所以这一假设能够满足。 
但在大数据时代,从不同分布所收集来的数据,我们也希望能利用上,因为它能提供大量信息。 
对于猫检测这个问题,我们会将猫app上传的5000张图放入开发测试集,训练集大小为205000。 
第二个场景,假设你在做一个语音识别系统为一个导航app来转录得地址,你有20000个用户说的街道地址,500000个语音片段用户说其他的内容,这时你可能用10000个地址样本作为开发测试集,其他用作训练集。 
我们继续假设你的开发测试集具有相同分布,但是必须明白,训练和开发/测试集分布不同,会带来一些特殊的挑战。 
Ps:有些学术研究是训练测试分布不同,但理论和实践中有很大的不同,如果你的训练测试不同分布,那么你的结果很大程度受到运气的影响。

37.如何决定怎么使用你的数据

延续上一章所说,早期的机器学习算法(需要手动设计特征,用一个简单的分类器),将20000张互联图片纳入训练集是很可能带来风险的。但到了大型神经网络时期,这一风险大大削减。这一现象依赖于是存在一个映射能在两种数据上都能表现良好。换句话说,这里存在一个系统不管输入是用户上传的图片还是互联网图片都能可靠的预测标签,即使不知道图片的来源。 
加入20000张图片后有以下影响: 
1.它给你神经网络更多猫是怎么不是怎样的样本。因为用户上传和互联网图片都有共同点,你的神经网络能从互联网图片中学到能应用到用户上传图片的知识。 
2.它迫使神经网络用一些容量来学习互联网图片独特的特征。如果这些特点和用户上传图片很不同,那么因此,它会损伤你的算法的表现。 
幸运的是,如果你有足够的容量,那么这可能不是一个重要的问题。如果你没有足够大的神经网络,那么你应该花费更大的精力在你的训练开发测试集保持同分布上。 
如果你有大量的无关数据,它们跟猫毫无关系,那么就不要把这些数据当做负样本,因为上面所说的第一条的好处可以忽略不计,学到的东西无法应用到你打开发测试集。

38.如何决定是否包括不一致的数据

假设你要预测纽约的房价,如果你有底特律的房价,房价比纽约低很多,那么你应该将这些数据加入到你的训练集中吗? 
房子在底特律还是在纽约会极大影响房价,如果你仅关心纽约的房价,那么最好不加入底特律的数据。 
那么纽约底特律样本和手机互联网猫图有什么不同吗? 
猫图不同点在于,一个系统可以可靠的预测y,不论输入是来自互联网图片还是app图片,因此互联网图片和算法系统一致,而底特律纽约则不一致。 
Ps:事实上可以增加一个新的房子所在地的特征,但是在实际应用中并不常见。

39.给数据权重

在实际应用中,互联图片数量是用户上传图片数量的40倍,如果你没有大量的计算资源,那么你给互联网图片更低的权重作为妥协。这种加权重的方式仅仅当你怀疑添加的数据有不同于开发测试集的分布,或者添加的数据远多于和开发测试集相同分布的数据。

40.从训练集到开发集的泛化

接着上面的问题讨论,如果你的算法在开发测试集上的误差比你预期的更大,那么可能的原因有: 
1.在训练集上的表现也不够好,偏差较大。 
2,在训练集上表现良好,但是不能很好地泛化到和训练集同分布的数据集上,方差较大。 
3.在和训练集同分布的数据集上表现良好,但在开发和测试集上表现不好,称为data mismatch。 
例如,假设人类能在猫识别任务上达到近乎完美的表现,你的算法能达到:

  • 1%的训练误差
  • 1.5%的同分布数据集误差
  • 10%的验证集误差

那么,你可能会尝试让训练数据更接近验证/测试数据,我们之后会讨论一些相关技术。 
为了诊断到底是什么原因,另外构造一个数据集是非常有必要的,即:一个训练集用作训练,一个“Training dev”数据集不用做训练。 
那么现在你有四个数据集:

  1. 训练集:算法学习的数据集(来自互联网的图片和从手机app上传的图片),它不需要服从我们真正在乎的分布。
  2. 训练开发集:和训练集同一分布,不用很大
  3. 开发集:和测试集同一分布,反应了我们正在在乎的分布。
  4. 测试集:和开发集同一分布。

那么现在可以评价:

  1. 训练集误差
  2. 模型泛化到同分布数据集上的能力
  3. 模型在你真正在乎的分布上的表现

41.识别偏差、方差和数据不匹配

假设人能在猫识别上达到0%的误差,假设你的算法:

  • 1%的训练误差
  • 5%的训练验证误差
  • 5%的验证误差

这告诉你的算法高方差。现在假设你的算法:

  • 10%的训练误差
  • 11%的训练验证误差
  • 12%的验证误差

这告诉你,你的算法有高偏差。一个算法可能同时遭遇到高偏差、高方差和数据不匹配的任意组合,如:

  • 10%的训练误差
  • 11%的训练验证误差
  • 20%的验证误差

为了更方便的理解各种不同的误差之间的联系,可以把他们画成一个表 
 
你也可以尝试将空着的两个格子填上,也许你能获得一些算法在不同分布上的效果。对于中间第二格,可以将一小部分B类分布数据加入训练集,然后单独将这一部分的训练误差拿出来。

42.处理数据不匹配

假设你开发了一个语音识别系统,在训练集和训练开发集上表现很好,但是在测试集上表现很差:你的算法有数据不匹配的问题。那么我建议你:(i)试着去弄明白训练和验证集上什么属性有不同(ii)试着去获取更多的符合开发集分布的数据 
例如,你在验证集上做错误分析,假设你发现你的算法系统表现差是因为大多数验证集的语音都是在车内获得的,而训练集中的例子都是在安静背景下获得的,背景音极大的损伤了你算法的表现。这种情况下,你可能会获取更多的车内语音来扩充你的训练集。误差分析的主要目的就是获知训练和开发集的重要不同,就是这个原因导致了数据不匹配。 
如果你的训练和训练测试集包括了车内语音,你需要再检查一下你的的算法系统在这一数据子集上的表现。如果它在训练集的车内语音上表现良好,而在训练开发集上的车内语音上表现不好,这进一步证实了需要获取更多的车内语言。 
但不幸的是,这一过程没有保证。例如,如果你没办法获得更多地和验证集同分布的数据,那么你可能找不到一个清晰的道路来提升表现。

43.人工数据合成

你的语音系统需要更多类似从车内获取的数据,那么人工合成的方法可能更加简单。 
假设你获取了大量车或者路上的噪音,你可以从网上下载这些数据。假设你也有一个很大的人在安静背景下说话的训练集,那么如果你把这两个数据“相加”,你将获得类似人在噪音背景下说话的语音。再例如,你可以发现猫识别器项目中,验证集中的手机拍摄的图片很多都有运动模糊,这个时候可以将图片加上运动模糊,让他们更像验证集里的图片。 
需要注意的是:合成数据的方法,有时创造的数据对人来说是真实的,而不是对电脑来说是真实的。例如你有1000个小时的语音训练集,而仅有1个小时的车噪音,那么合成的数据就会反复使用这段噪音,当人去判断时,噪音对人来说都差不多,而对电脑而言,它会对这段噪音过拟合,所以它的泛化能力可能会很差。 
另外,假设你有1000个小时的车噪音,但它仅从10台不同的车上提取出来的,那么,这种情况下,可能算法会对着10辆车过拟合并对其他车上的语音表现的很差。不幸的是,这些问题很难被发现。 
再来一个例子,假设你要做一个计算机视觉系统来识别汽车,假设你和一家游戏公司有合作,这家游戏公司有些车的电脑模型,为了训练你的模型,你用车的电脑模型合成了很多车的图片,即使合成的图片看上去很真实,但是可能这种方法也不会有效,这个游戏可能在整个游戏里设计20辆车。构建车的3D模型是很贵的,你可能不会注意到你一直在看同一辆车,只不过颜色不同罢了,但同所有跑在路上的车来说,这只是分布里的很小的一部分。因此,如果你训练集里100000个样本都来自20辆车,那么你的算法将对这20辆车过拟合,并且很难泛化。 
当你合成数据时,必须考虑到是否真的合成了具有代表性的数据。同时避免产生能分辨合成和非合成数据的特性,例如所有车都来自20辆原型,所有噪音都来自1个小时的噪声,这一建议很难被遵循。 
当进行数据合成时,在产生数据前我的团队经常花费数周的时间在一些细节上,使其接近真实分布,以便具有显著效果。但是如果你能能正确的获得这些细节,你就能一下子获得一个比原来大很多的数据集。

36.什么时候你应该在不同分布上做训练和测试

当你的猫app已经上传10000张图,你已经人工标记它们有没有猫,同时你有200000张互联网上下载的图,这时你要怎么划分训练开发测试集呢? 
当你训练深度学习模型时,可能必须用到那200000张图,那么训练和测试集的分布就不同,这会怎样影响你的工作呢? 
当然将210000张图片随机分裂到训练开发测试集是一种方法,但我(吴恩达)不推荐这种方法,记住选择开发测试集的推荐方法是:选择你未来预期会得到的数据来作为开发测试集。 
大多数学术文章假设训练开发测试集的分布相同,在机器学习的早期,数据稀缺,常常仅有一个服从同一分布的数据集,所以这一假设能够满足。 
但在大数据时代,从不同分布所收集来的数据,我们也希望能利用上,因为它能提供大量信息。 
对于猫检测这个问题,我们会将猫app上传的5000张图放入开发测试集,训练集大小为205000。 
第二个场景,假设你在做一个语音识别系统为一个导航app来转录得地址,你有20000个用户说的街道地址,500000个语音片段用户说其他的内容,这时你可能用10000个地址样本作为开发测试集,其他用作训练集。 
我们继续假设你的开发测试集具有相同分布,但是必须明白,训练和开发/测试集分布不同,会带来一些特殊的挑战。 
Ps:有些学术研究是训练测试分布不同,但理论和实践中有很大的不同,如果你的训练测试不同分布,那么你的结果很大程度受到运气的影响。

37.如何决定怎么使用你的数据

延续上一章所说,早期的机器学习算法(需要手动设计特征,用一个简单的分类器),将20000张互联图片纳入训练集是很可能带来风险的。但到了大型神经网络时期,这一风险大大削减。这一现象依赖于是存在一个映射能在两种数据上都能表现良好。换句话说,这里存在一个系统不管输入是用户上传的图片还是互联网图片都能可靠的预测标签,即使不知道图片的来源。 
加入20000张图片后有以下影响: 
1.它给你神经网络更多猫是怎么不是怎样的样本。因为用户上传和互联网图片都有共同点,你的神经网络能从互联网图片中学到能应用到用户上传图片的知识。 
2.它迫使神经网络用一些容量来学习互联网图片独特的特征。如果这些特点和用户上传图片很不同,那么因此,它会损伤你的算法的表现。 
幸运的是,如果你有足够的容量,那么这可能不是一个重要的问题。如果你没有足够大的神经网络,那么你应该花费更大的精力在你的训练开发测试集保持同分布上。 
如果你有大量的无关数据,它们跟猫毫无关系,那么就不要把这些数据当做负样本,因为上面所说的第一条的好处可以忽略不计,学到的东西无法应用到你打开发测试集。

38.如何决定是否包括不一致的数据

假设你要预测纽约的房价,如果你有底特律的房价,房价比纽约低很多,那么你应该将这些数据加入到你的训练集中吗? 
房子在底特律还是在纽约会极大影响房价,如果你仅关心纽约的房价,那么最好不加入底特律的数据。 
那么纽约底特律样本和手机互联网猫图有什么不同吗? 
猫图不同点在于,一个系统可以可靠的预测y,不论输入是来自互联网图片还是app图片,因此互联网图片和算法系统一致,而底特律纽约则不一致。 
Ps:事实上可以增加一个新的房子所在地的特征,但是在实际应用中并不常见。

39.给数据权重

在实际应用中,互联图片数量是用户上传图片数量的40倍,如果你没有大量的计算资源,那么你给互联网图片更低的权重作为妥协。这种加权重的方式仅仅当你怀疑添加的数据有不同于开发测试集的分布,或者添加的数据远多于和开发测试集相同分布的数据。

40.从训练集到开发集的泛化

接着上面的问题讨论,如果你的算法在开发测试集上的误差比你预期的更大,那么可能的原因有: 
1.在训练集上的表现也不够好,偏差较大。 
2,在训练集上表现良好,但是不能很好地泛化到和训练集同分布的数据集上,方差较大。 
3.在和训练集同分布的数据集上表现良好,但在开发和测试集上表现不好,称为data mismatch。 
例如,假设人类能在猫识别任务上达到近乎完美的表现,你的算法能达到:

  • 1%的训练误差
  • 1.5%的同分布数据集误差
  • 10%的验证集误差

那么,你可能会尝试让训练数据更接近验证/测试数据,我们之后会讨论一些相关技术。 
为了诊断到底是什么原因,另外构造一个数据集是非常有必要的,即:一个训练集用作训练,一个“Training dev”数据集不用做训练。 
那么现在你有四个数据集:

  1. 训练集:算法学习的数据集(来自互联网的图片和从手机app上传的图片),它不需要服从我们真正在乎的分布。
  2. 训练开发集:和训练集同一分布,不用很大
  3. 开发集:和测试集同一分布,反应了我们正在在乎的分布。
  4. 测试集:和开发集同一分布。

那么现在可以评价:

  1. 训练集误差
  2. 模型泛化到同分布数据集上的能力
  3. 模型在你真正在乎的分布上的表现

41.识别偏差、方差和数据不匹配

假设人能在猫识别上达到0%的误差,假设你的算法:

  • 1%的训练误差
  • 5%的训练验证误差
  • 5%的验证误差

这告诉你的算法高方差。现在假设你的算法:

  • 10%的训练误差
  • 11%的训练验证误差
  • 12%的验证误差

这告诉你,你的算法有高偏差。一个算法可能同时遭遇到高偏差、高方差和数据不匹配的任意组合,如:

  • 10%的训练误差
  • 11%的训练验证误差
  • 20%的验证误差

为了更方便的理解各种不同的误差之间的联系,可以把他们画成一个表 
 
你也可以尝试将空着的两个格子填上,也许你能获得一些算法在不同分布上的效果。对于中间第二格,可以将一小部分B类分布数据加入训练集,然后单独将这一部分的训练误差拿出来。

42.处理数据不匹配

假设你开发了一个语音识别系统,在训练集和训练开发集上表现很好,但是在测试集上表现很差:你的算法有数据不匹配的问题。那么我建议你:(i)试着去弄明白训练和验证集上什么属性有不同(ii)试着去获取更多的符合开发集分布的数据 
例如,你在验证集上做错误分析,假设你发现你的算法系统表现差是因为大多数验证集的语音都是在车内获得的,而训练集中的例子都是在安静背景下获得的,背景音极大的损伤了你算法的表现。这种情况下,你可能会获取更多的车内语音来扩充你的训练集。误差分析的主要目的就是获知训练和开发集的重要不同,就是这个原因导致了数据不匹配。 
如果你的训练和训练测试集包括了车内语音,你需要再检查一下你的的算法系统在这一数据子集上的表现。如果它在训练集的车内语音上表现良好,而在训练开发集上的车内语音上表现不好,这进一步证实了需要获取更多的车内语言。 
但不幸的是,这一过程没有保证。例如,如果你没办法获得更多地和验证集同分布的数据,那么你可能找不到一个清晰的道路来提升表现。

43.人工数据合成

你的语音系统需要更多类似从车内获取的数据,那么人工合成的方法可能更加简单。 
假设你获取了大量车或者路上的噪音,你可以从网上下载这些数据。假设你也有一个很大的人在安静背景下说话的训练集,那么如果你把这两个数据“相加”,你将获得类似人在噪音背景下说话的语音。再例如,你可以发现猫识别器项目中,验证集中的手机拍摄的图片很多都有运动模糊,这个时候可以将图片加上运动模糊,让他们更像验证集里的图片。 
需要注意的是:合成数据的方法,有时创造的数据对人来说是真实的,而不是对电脑来说是真实的。例如你有1000个小时的语音训练集,而仅有1个小时的车噪音,那么合成的数据就会反复使用这段噪音,当人去判断时,噪音对人来说都差不多,而对电脑而言,它会对这段噪音过拟合,所以它的泛化能力可能会很差。 
另外,假设你有1000个小时的车噪音,但它仅从10台不同的车上提取出来的,那么,这种情况下,可能算法会对着10辆车过拟合并对其他车上的语音表现的很差。不幸的是,这些问题很难被发现。 
再来一个例子,假设你要做一个计算机视觉系统来识别汽车,假设你和一家游戏公司有合作,这家游戏公司有些车的电脑模型,为了训练你的模型,你用车的电脑模型合成了很多车的图片,即使合成的图片看上去很真实,但是可能这种方法也不会有效,这个游戏可能在整个游戏里设计20辆车。构建车的3D模型是很贵的,你可能不会注意到你一直在看同一辆车,只不过颜色不同罢了,但同所有跑在路上的车来说,这只是分布里的很小的一部分。因此,如果你训练集里100000个样本都来自20辆车,那么你的算法将对这20辆车过拟合,并且很难泛化。 
当你合成数据时,必须考虑到是否真的合成了具有代表性的数据。同时避免产生能分辨合成和非合成数据的特性,例如所有车都来自20辆原型,所有噪音都来自1个小时的噪声,这一建议很难被遵循。 
当进行数据合成时,在产生数据前我的团队经常花费数周的时间在一些细节上,使其接近真实分布,以便具有显著效果。但是如果你能能正确的获得这些细节,你就能一下子获得一个比原来大很多的数据集。

原文地址:https://www.cnblogs.com/demo-deng/p/10172441.html

时间: 2024-12-22 17:52:27

模型训练过程中的训练集、训练开发集、开发集和测试集总结的相关文章

TensorFlow之tf.nn.dropout():防止模型训练过程中的过拟合问题

一:适用范围: tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层 二:原理: dropout就是在不同的训练过程中随机扔掉一部分神经元.也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算.但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了 三:函数介绍: tf.nn.drop(x,  keep_prob, noise_shape=None, seed=Non

(转)理解YOLOv2训练过程中输出参数含义

最近有人问起在YOLOv2训练过程中输出在终端的不同的参数分别代表什么含义,如何去理解这些参数?本篇文章中我将尝试着去回答这个有趣的问题. 刚好现在我正在训练一个YOLOv2模型,拿这个真实的例子来讨论再合适不过了,下边是我训练中使用的 .cfg 文件(你可以在cfg文件夹下找到它): 以下是训练过程中终端输出的一个截图: 以上截图显示了所有训练图片的一个批次(batch),批次大小的划分根据我们在 .cfg 文件中设置的subdivisions参数.在我使用的 .cfg 文件中 batch =

DeepLearning tutorial(2)机器学习算法在训练过程中保存参数

我是小白,说的不是很好,请原谅 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43169019 参考:pickle - Python object serialization.DeepLearning Getting started 一.python读取"***.pkl.gz"文件 用到Python里的gzip以及cPickle模块,简单的使用代码如下,如果想详细了解可以参考上面给出的链接. [p

AI - MLCC06 - 训练集和测试集 (Training and Test Sets)

原文链接:https://developers.google.com/machine-learning/crash-course/training-and-test-sets 1- 拆分数据 可将单个数据集拆分为一个训练集和一个测试集. 训练集 - 用于训练模型的子集. 测试集 - 用于测试训练后模型的子集. 训练集的规模越大,模型的学习效果越好.测试集规模越大,对于评估指标的信心越充足,置信区间就越窄.在创建一个能够很好地泛化到新数据模型的过程中,测试集充当了新数据的代理. 拆分数据的一些注意

利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试

从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试 通过从零到一的教程,我们已经得到了通过mnist训练集生成的caffemodel,主要包含下面四个文件: 接下来就可以利用模型进行测试了.关于测试方法按照上篇教程还是选择bat文件,当然python.matlab更为方便,比如可以迅速把识别错误的图片显示出来. 一.均值文件mean.binaryproto 在进行分类之前首先需要产生所有图片的平均值图片,真正分类时的每个图片都会先减去这张平均值图片

将数据划分为训练集和测试集;缩放特征区间

导入葡萄酒数据: 1 import numpy as np 2 import pandas as pd 3 4 df_wine = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", header=None) 5 df_wine.columns = ["class label", "alcohol", 6 "mal

随机切分csv训练集和测试集

使用numpy切分训练集和测试集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 序言 在机器学习的任务中,时常需要将一个完整的数据集切分为训练集和测试集.此处我们使用numpy完成这个任务. iris数据集中有150条数据,我们将120条数据整合为训练集,将30条数据整合为测试集. iris.csv下载 程序 import csv import os import numpy as np '''将iris.csv中的数据分成train_iris和test_iris两个csv文件,其中t

sklearn——train_test_split 随机划分训练集和测试集

sklearn--train_test_split 随机划分训练集和测试集 sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html 一般形式: train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和

tensorflow识别Mnist时,训练集与验证集精度acc高,但是测试集精度低的比较隐蔽的原因

tensorflow识别Mnist时,训练集与验证集精度acc高,但是测试集精度低的比较隐蔽的原因除了网上说的主要原因https://blog.csdn.net/wangdong2017/article/details/90176323 之外,还有一种是比较隐蔽的原因(可能对于大多数人不会犯这种低级错误),作为新手的我找了半天才找到,原因是在程序中创建了一个会话之后又重新创建了一个会话,代码程序见我博客https://www.cnblogs.com/hujinzhou/p/guobao_2020

sklearn获得某个参数的不同取值在训练集和测试集上的表现的曲线刻画

from sklearn.svm import SVC from sklearn.datasets import make_classification import numpy as np X,y = make_classification() def plot_validation_curve(estimator,X,y,param_name="gamma", param_range=np.logspace(-6,-1,5),cv=5,scoring="accuracy&