作者:jliang
https://blog.youkuaiyun.com/jliang3
《深度学习工程师-吴恩达》04结构化机器学习项目--机器学习(ML)策略2 笔记
1.重点归纳
1)误差分析:如果算法还达不到理想效果,那么人工检查一下算法所犯的错误,也许可以让你了解接下来应该做什么,这个过程称为误差分析。
(1)例子:一个取得90%准确率猫分类器,注意到有部分狗样本被识别为猫,使用误差分析来估计是否应该专门解决这个问题。随机抽样100个错误样本,检查把狗分类成猫的样本数量,如果这个样本占比很小,则不值得专门去优化这个问题。
(2)在做误差分析时也可以同时并行评估几个想法
- 建立一个表格来记录被抽样的错误样本属于哪种情况,并在每个样本中备注情况(如狗被识别为猫,备注上写上狗类型)。分别人工统计每种想法中误分类的错误样本数量,并计算每个错误类型的百分比。
- 建立一个表格来记录被抽样的错误样本属于哪种情况,并在每个样本中备注情况(如狗被识别为猫,备注上写上狗类型)。分别人工统计每种想法中误分类的错误样本数量,并计算每个错误类型的百分比。
(3)进行误差分析时应该找一组错误例子(验证集或测试集中的错误例子),观察错误标记的例子看看假阳性和假阴性,统计属于不同错误类型的错误数量。
- 这个过程中,可能会得到启发,归纳出新的误差类型。
- 通过统计不同类型错误标记类型占比总数的百分比,可以帮你发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。
2)标注错误的数据
(1)深度学习算法对训练集的随机误差是相当鲁棒的
- 只要你的标记出错的例子与随机误差相差不大,误差足够随机,那么不管这些误差也没有问题,而不要花太多时间修复它们
- 只要你的标记出错的例子与随机误差相差不大,误差足够随机,那么不管这些误差也没有问题,而不要花太多时间修复它们
(2)深度学习算法对系统性的错误就没有那么鲁棒了。比如说,如果做标记的人一直把白色的狗标记成猫。
(3)如果验证集和测试集中有标记错误的样本
- 误差分析时增加一个额外的列来统计标记出错的例子数,根据标记出错样本数来估计修改错误后对误差值的影响。
- 如果这些标记错误的例子验证影响了你在验证集上评估算法的能力,那么就应该花时间修正错误的标签。如果它没有严重到影响到用验证集评估成本偏差的能力,那就不需要花费宝贵的时间去处理。
- 需要修正验证集标记错误的例子:假设系统达到98%准确度(2%的错误),假设错误标记引起的错误对验证集误差的影响为0.6%(30%*2%=0.6%)。评估模型时模型A误差是2.1%,模型B为1.9%,此时标记错误的样本足以影响我们评估哪个模型更好,此时应该修正验证集中的错误标记
(4)修正数据时指引和原则
- 应该同时修改验证集和测试集上的错误,验证集和测试集必须来自相同的分布,但训练集可以来自稍微不同的分布。
- 检查数据时检测全部验证/测试集,而不是只检测判断错误的样本。否则有可能有些被正确判断的样本其实是判断错误的,修正样本标签后导致对算法偏差的估计可能变得更大。
- 由于训练集数据量比较大,也因为前面讨论过的训练集的随机误差对算法影响不大,所以我们可能会只修正验证集和测试集的错误标记,而不修改训练集的错误标记。此时,训练集与验证集和测试集来自不同的数据分布。
3)开发一个全新的机器学习应用时,应该尽快建立第一个系统原型,然后快速迭代。
(1)流程
- 首先,快速设立验证集和测试集,还有评估指标。它决定了你的目标在哪里,如果你的目标定错了,之后改也是可以的。
- 然后搭好一个机器学习系统原型,然后找到训练集,看看训练效果如何,在验证集合测试集评估指标表现如何。
- 再进行偏差方差分析以及误差分析来确定下一步优先做什么。特别是如果误差分析让你了解到大部分误差的来源。
- 建立初始系统的意义在于有一个训练过的系统让你确定偏差方差的范围,就可以知道下一步应该优先做什么。让你能够进行误差分析,可以观察一些错误,然后想出所有能进行的方向,知道哪些是最优希望的方向。
(2)以下情况,快速搭建第一个系统的建议的适用程度要低一些,一开始就搭建比较复杂的系统
- 如果你在这个应用程序领域有很多经验
- 如果一个领域有很多可以借鉴的学术文献(如人脸识别领域),可以从现有大量文献为基础出发,一开始就搭建比较复杂的系统
4)训练样本与验证/测试来自不同的分布
(1)深度学习算法需要大量的数据,即使大部分数据来自不同的分布也比只有很少的数据好,从而导致训练集、验证集和测试集数据分布不一样的情况出现,越来越多团队都用来自和验证集和测试集分布不同的数据来训练。
(2)例子:猫分类器,训练数据来自网络(很清晰),测试数据来自手机拍照(很模糊)
(3)错误的组合数据方式:把两组照片混合在一起,然后进行混洗,然后再按比例把照片分配到训练集、 验证集和测试集上。
(4)猫分类器正确的组合数据方式:
- 训练集205000张=全部网络照片20万张+一半用户上传的照片5000张,验证集和测试集都是2500张用户上传的照片(都是真实关心的数据分布)。
- 这样划分数据的好处在于,现在瞄准的目标就是我们想要处理的目标。
- 缺点在于训练集分布和验证集以及测试集分布不一样,但事实证明这样的数据划分在长期能带来更好的系统性能。
(5)例子:语音识别系统的后视镜,如:“后视镜,请帮我找找到最近的加油站的导航方向”。很多数据(共500000条)来自其他语音识别应用,如:数据供应商买来的数据、智能语音激活音箱的数据、语音激活键盘的数据,只有20000条数据来自后视镜设备
- 划分方式一:训练集=全部其他语音识别数据500000条,验证集和测试集数据都是来自后视镜的数据各10000条。
- 划分方式二(如果你觉得验证集和测试集不需要这么多数据):训练集=全部其他语音识别数据500000条+后视镜数据10000条,验证集和测试集数据都是来自后视镜的数据各5000条。
5) 不匹配数据划分的偏差和方差
(1)估计学习算法的偏差和方差可以帮我们确定接下来应该优先做的方向,但是如果训练集和验证集及测试集分布不同时,分析偏差和方差的方式会不一样。
(2)为了确认是由于泛化能力,还是由于数据分布不一样的原因,需要定义一组新的数据“训练-验证集”。数据集分为4份:训练集、训练-验证集、验证集、测试集
(3)训练集误差与训练-验证集误差的差距代表了模型的方差问题的可优化空间,从中可以知道模型的泛化能力。
(4)训练-验证集误差与验证集误差之间的差距代表数据不匹配的程度,因为算法没有直接在训练-验证集或验证集上训练过,这两者的数据来自不同的分布。
(5)各个数据集误差差距总结
- 训练集误差与贝叶斯误差的差值为可避免偏差值大小。
- 训练-验证集误差与训练集误差的差值为方差值大小。
- 验证集误差与训练-验证集误差的差值为数据不匹配问题的大小。
- 测试集误差与验证集误差的差值为对验证集过拟合的程度,如果差值很大,说明需要一个更大的验证集。
(6)贝叶斯误差、训练集误差、训练-验证集误差、验证集误差和测试集误差的值应该是从越来越大
- 训练集和训练-验证集误差是从训练集分布评估的,验证集和测试集误差是对验证集测试集分布评估的。
- 如果某个值没有变大(比上一个误差要小),如下面例子,说明训练数据比验证集和测试集数据难识别多了。
- 人类水平误差为4%
- 训练集误差为7%