结构化机器学习项目

学习资料:深度学习笔记、deeplearning.ai的《结构化机器学习项目》课程。

这篇笔记主要记录的是在做机器学习项目时需要关注的一些问题,牢记这些对改善项目很有帮助。

一. 指标

1. 常用指标

准确率、精确率、召回率、F1值

混淆矩阵

TP:True Positive 真阳

FP:False Positive 假阳

FN: Flase Negative 假阴

TN: True Negative 真阴

一般优先将关注度高的作为正类(阳性)。比如检查是否为病人,是病人则代表阳性;兴奋剂检测,阳性表示的就是兴奋剂超标。

混淆矩阵的样本全集为四个的并集,任何样本属于且只属于4个集合中的一个。

精确率P

P指的是正类数量占全部预测正类结果的比率

预测阳性的所有结果中 预测正确的比率

[P=frac{TP}{TP+FP} ]

召回率R

答案是阳性的所有结果中 预测正确的比率

[R = frac{TP}{TP+FN} ]

(F_1)

(F_1)值是精确率和召回率的调和平均

[F_1=frac{2*P*R}{P+R} ]

总结

P和R分子都是真阳样本数,不过P值分母是预测阳性的数量,R值分母是答案阳性的数量,这两个值一般一个高另一个就低,比较难平衡;(F_1)是P和R的调和平均

2. 优化指标、满足指标

  • 如果有几个指标不能很好的融合成单一指标,可以用优化指标、满足指标的方法。

  • 假设有k个指标,就指定k-1个为满足指标,意思是只要这些指标达到一个阈值就行了,不需要特别好;1个作为优化指标,意思是这个指标是我关注的重点指标,这个指标越高越好。

二. 训练集、验证集、测试集

1. 数据集划分

较细致的一种是训练集、验证集和测试集;还有一种划分是训练集、测试集。划分的目的都是为了得到精确度最高、泛化能力最佳的模型。

训练集(Training set)

通过设置不同的超参,不同的模型,利用训练集大量训练从而得到几个比较好的模型。

验证集(Development set)

对训练出的几个模型的好坏进行评估

测试集(Test set)

通过训练集和验证集得出最优模型后,用测试集进一步验证所得的模型。目的是进一步确定该模型是否有较强的泛化能力。

2. 验证集、测试集分布

三个集如果都能和实际应用时的数据来自同一分布自然是最好。如果没有这么多的数据,一定要保证验证集和测试集与实际应用的数据来自同一分布,保证验证/测试集更接近实际应用场景。因为训练集需要大量数据,可以适当用一些有较多数据的其他分布。

3. 验证集、测试集大小

三. 正则化与过拟合

算法模型训练过后一般会有两种情况:

  • 欠拟合underfitting ——高偏差 high bias
  • 过拟合overfitting ——高方差 high variance -> 泛化能力差

改善欠拟合问题:

  • 增加数据特征、提高模型复杂度;
  • 减少正则化系数

改善过拟合问题:

  • 降低模型复杂度、舍弃一些不能帮助我们正确预测的特征;
  • 正则化或加大正则化系数。保留所有的特征,但是对一些特征进行惩罚。在代价函数里加入正则化项。对部分特征参数加入惩罚,使他们参数值接近0;
  • 引入先验。

四. 机器学习中的正交化

搭建建立机器学习系统的挑战之一是,可以尝试和改变的东西太多太多了,比如说,有太多的超参数可以调。再调参的过程中我们应该遵循正交化。正交化就是将机器学习的整个过程的所有需要解决的问题(要调的n个参数)独立开来。针对于某个方面的问题有相应的解决方法,尽量不要用一个方法去尝试解决多个方面的问题。

如上图,主要有四个方面的问题:拟合训练集、拟合验证集、拟合测试集、在实际使用预测中能够很好的泛化
最好的是一个个的解决问题,先拟合训练集,然后做其他的……如果用early stopping之类的同时影响两个问题的方法就不是很好。

  • 不要一次改变太多的东西(比如参数),一次改变一个往往更好;

  • 不要一次想通过改变一个东西解决几个问题,往往改变一个专门解决对应的问题。

五. 比较人类表现水平

1. 贝叶斯最佳误差

  • 贝叶斯最佳误差:最优误差。计算机所能达到的最优水平,一般与人类水平相似。注意:训练集的准确度不是要非常好,因为有贝叶斯误差,所以达到一定的理想水平就可以了。

  • 根据最优误差来判断训练集误差,训练集误差接近最优误差则偏差大,若训练集误差较大则偏差小

  • 验证集误差接近训练集误差,则方差低。反之,方差高。

  • 关注贝叶斯误差和人类误差是为了实时的判断目前是需要降低方差还是降低偏差

2. 改进方向

全部来自同一分布

如果某模型在训练集上的错误率为 0.7%,验证集的错误率为 0.8%。如果选择的人类水平误差为 0.5%,那么偏差(bias)比方差(variance)更加突出;而如果选择的人类水平误差为 0.7%,则方差更加突出。也就是说,根据人类水平误差的不同选择,我们可能因此选择不同的优化操作。

当训练集来自不同分布

如果因为接近实际应用场景的数据较少,导致训练集与“验证集和测试集”数据来自不同分布。这种情况结果发现训练集和验证集误差过大,原因有二:

  1. 过拟合(方差大)
  2. 数据不匹配

解决方法:
首先:将一部分training set和dev set组成新的training-dev set,对这个新数据的结果进行分析:
training-dev set大部分数据属于training set,和training set是同分布,此时, training set 与 training-dev set之间的误差是因为方差, training-dev set与 dev set之间是因为数据不匹配

然后:根据结果得出是因为方差、偏差、还是数据不匹配(不同分布);如果是数据不匹配,解决方法一般是:

  1. 进行误差分析,分析dev set和train set,找出两个分布差异的原因
  2. 尝试找一些与dev set相似的数据,也可以采取人工数据合成的方法

六. 误差分析

通过人工检查机器学习模型得出的结果中出现的一些错误,有助于深入了解下一步要进行的工作。取出一些错误的例子,人工统计分析不能拟合的原因。在这个过程中,你可能会得到启发,归纳出新的错误类型。总之,通过统计不同错误标记类型占总数的百分比,有助于发现哪些问题亟待解决,或者提供构思新优化方向的灵感。

如猫分类器的模型,分析出也许有很大比例的误差都是因为猫狗识别错误,就要特别针对猫狗识别来处理;如果大多数误差都是因为图片模糊,则要特别针对图像清晰度处理。

人工统计分析很重要,有必要花这个时间!!!

如下图:

错误标签

在做误差分析时,有时会注意到数据集中有些样本被人为地错误标记(incorrectly labeled)了。

对于训练集,如果只是偶然的随机错误,因为算法模型都有一定的鲁棒性,一般不值得花费时间去修改。

对于测试集和验证集,和误差分析一起统计,根据比例大小决定是否需要修正。

如果确定要修正,建议:

  1. 一定要同时修改测试集和验证集
  2. 同时检查判断正确和判断错误的例子(通常不用这么做);

七. 快速搭建系统并迭代

快速搭建一个系统:

  1. 快速找好训练集、验证集、测试集,设定好指标。尽快建立一个学习模型进行迭代(宁可之后再修改)。
  2. 再进行偏差方差分析、误差分析,找出重点问题具体分析解决,在解决的过程中注意要正交化(这才是重点)

注:不要刚开始想把系统建的多完美,多复杂quick and dirty system is good enough.

八. 迁移学习

迁移学习(Tranfer Learning)是通过将已训练好的神经网络模型的一部分网络结构应用到另一模型,将一个神经网络从某个任务中学到的知识和经验运用到另一个任务中,以显著提高学习任务的性能。迁移对象两者之间是有关联的。比如猫狗识别与放射诊断的低层特征是相似的, 都是关于图像处理的边缘检测、线条的特征等等, 这就是两个学习任务共同的知识。在迁移学习中就可以省略这些层数的重新训练。

如果新的数据集很小,可能只需要重新训练输出层前的最后一层的权重,即(W^{[L]}、b^{[L]}),并保持其他参数不变;而如果有足够多的数据,可以只保留网络结构,重新训练神经网络中所有层的系数。这时初始权重由之前的模型训练得到,这个过程称为预训练(Pre-Training),之后的权重更新过程称为微调(Fine-Tuning)

在下述场合进行迁移学习是有意义的:

  1. 两个任务有同样的输入(比如都是图像或者都是音频);
  2. 拥有更多数据的任务迁移到数据较少的任务
  3. 某一任务的低层次特征(底层神经网络的某些功能)对另一个任务的学习有帮助。

九. 多任务学习

迁移学习中的步骤将一个任务的模型用到另一个相关联任务上;而多任务学习(Multi-Task Learning)是:因为相关联任务之间低层次内容相似,所以使用单个神经网络模型同时来并行训练同时学习多个任务。

用单个神经网络训练多个问题(问题之间有关联),比如在一张图中同时识别车、行人、交通牌……

多任务学习的要求是:

  1. 任务之间的低层次内容应该是一致的
  2. 每个任务都必须有足够且接近的数据
  3. 深度学习模型要足够的大

如果模型足够大,一般多任务学习会比分开单独的学习模型效果更好。

多任务学习和 Softmax 回归看上去有些类似,容易混淆。它们的区别是,Softmax 回归的输出向量 y 中只有一个元素为 1;而多任务学习的输出向量 y 中可以有多个元素为 1。

多任务学习和迁移学习有点类似。但是最明显的区别是迁移学习的对象一个数据很多,另一个数据较少;而多任务学习要求每个问题的数据都很多。这就使得迁移学习的使用频率更高。

十. 端到端的学习

在传统的机器学习分块模型中,每一个模块处理一种输入,然后其输出作为下一个模块的输入,构成一条流水线。而端到端深度学习(End-to-end Deep Learning)只用一个单一的神经网络模型来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。

如果数据量较少,传统机器学习分块模型所构成的流水线效果会很不错。但如果训练样本足够大,并且训练出的神经网络模型足够复杂,那么端到端深度学习模型的性能会比传统机器学习分块模型更好。

而如果数据集规模适中,还是可以使用流水线方法,但是可以混合端到端深度学习,通过神经网络绕过某些模块,直接输出某些特征。

缺点:

  1. 要求有大量的数据来训练
  2. 忽略了一些精心设计的非常好的中间件

在决定是否使用端到端时要考虑几个点:

  1. 数据是否足够多
  2. 问题的复杂度(用端到端是否可行)
原文地址:https://www.cnblogs.com/z1xiang/p/12675697.html