[DeeplearningAI笔记]第三章2.4-2.6不匹配的训练和开发/测试数据
觉得有用的话,欢迎一起讨论相互学习~
2.4在不同分布上训练和测试数据
- 在深度学习时代,越来越多的团队使用和开发集/测试集不同分布的数据来训练模型.下面解释一些方法来处理训练集和测试集存在差异的情况.
Example1
- 假设你要开发一个识别猫的机器学习系统,其中 需要识别的是用户手机上传的猫的图片 这些图片往往清晰度低,取景不专业,识别度低.由于用户量少的缘故,这些图片量很少,只有大约1W张.但是从网上可以下载大量清晰度高,取景专业,辨识度高的猫的图片,大约20W张. 1W张的用户图片是我们真正关心的数据,但是这对于训练模型是远远不够的.所以我们将20W网上下载的高清图片作为训练集,但这和想要实际处理的数据并不一样
Solution1
- 将20W张高清图片与1W张用户手机上传的模糊图片混合,随机分配到训练,开发和测试集中.假设你已经确定开发集和测试集中各包含2500个样本,训练集包括205000个样本.
- 这种方式很大的坏处在于:对于 开发集 的2500个样本,大部分来自于网上下载的高清图片.这并不是你真正关心的数据分布.由数学期望我们计算出大约有(frac{200K}{210K}=2381)张图片来自高清数据集,有(frac{10K}{210K}=119)张图片来自于用户上传图片即真正应该关心的数据.
- 所以这种方式的结果是系统的大部分工作是优化网上下载的高清图片.这并不是我们需要的分布.
- 这种方式不推荐使用
Solution2
- 为了避免Solution1中带来的问题,我们将使用网上的高清图片200K张图片和5K张来自用户手机的上传图片作为 训练集,而 开发集 和 测试集 都是2500张不同的手机图片.
- 这种方式的好处在于:开发集和测试集中的图片来与用户上传的手机图片 这才是你系统真正关心的重点.
Example2
- 假设你要开发一个智能语音汽车后视镜,你现在有很多语音数据,但是这些都不是来自智能语音后视镜的.下面解释如何来分配训练集,开发集和测试集.
- 训练集
- 500K段语音数据:
- 购买的带标签的语音数据
- 智能音箱,语音激活音箱数据
- 语音激活键盘数据
- 10K段语音激活后视镜数据
- 500K段语音数据:
- 开发集/测试集语音数据:
- 各来自实际语音激活后视镜的数据5K段语音数据.
2.5 不匹配分布的偏差和方差
- 对于训练集和开发/测试集来自不同的分布的情况而言,我们计算偏差和方差的方法不同.
Notics
- 算法只见过训练集数据,没见过开发集数据
- 开发集数据来自不同的分布
- 需要辨清开发集上的误差有多少是来自算法没看到开发集中的数据导致的<方差>,多少是因为开发集数据分布本身就不一样<数据不匹配>
Solution
- 定义一个新的数据train-dev set 从训练集中抽取数据,和训练集数据来自同一个数据分布,但是不用于训练数据.
- 分别将分类器在训练集/训练-开发集/开发集上运行,获取其准确率信息
-
假如在训练集上误差为1%,在训练-开发集上误差为9%,在开发集上误差为10%
- 分类器在训练集和训练开发集上误差差距较大,这表明算法没有识别没有看到过的数据,这表明分类器本身方差较大
- 分类器在训练-开发集和开发集上误差差距不大,表明算法误差的差距不是主要由于数据 分布不一样 导致的
-
假如在训练集上误差为1%,在训练-开发集上误差为1.5%,在开发集上误差为10%
- 分类器在训练集和训练开发集上误差差距较小,这表明分类器本身方差不大
- 分类器在训练-开发集和开发集上误差差距很大,表明算法误差的差距主要由于 数据不匹配 导致的
-
2.6 定位数据不匹配
- 如果你的训练集和开发/测试集来自不同的数据分布,并且误差分析的结果表明你有一个数据不匹配的问题,这个问题没有标准的解决方案,但是我们可以尝试一些可以做的事情.
Suggestion
- 做误差分析,并且了解训练集和开发/测试集的具体差异.
- 人为加工训练集(人工合成数据),使其和开发/测试集更加相近,或者收集更多的类似于开发/测试集的数据.
- 对于作者举例的语音识别智能后视镜的例子,我们可以先准备大量清晰的音频(不带马路噪音的数据),然后手机汽车噪音的音频,将两者合成后成为人工合成的数据.
- 但是应该注意,任意重复噪音,容易造成模型对该段噪音的过拟合.最好是不要重复噪音数据,而是收集等长的噪音数据.学习算法有可能取得更好的性能.
- 当使用人工数据合成时,一定谨记有可能人工合成的数据只是从所有可能性的空间选取了很小一部分去模拟数据.