【结构化机器学习项目】Lesson 1--机器学习策略1

课程来源:吴恩达 深度学习课程 《结构化机器学习项目》
笔记整理:王小草
时间:2018年6月1日


为什么我们需要使用机器学习策略?因为机器学习策略可以帮助我们在正确的方向上优化模型。

本文主要分成4部分,
第一部分介绍一下什么是正交化;
第二部分介绍监督模型的评价指标;
第三部分介绍训练集/开发集/测试集的划分;
第四部分比较模型与人的表现。

这些都是一些机器学习模型训练过程中的细节注意点,能帮助你有效地进行模型的训练与优化,从而事半功倍。

1.orthogonalization(正交化)

牛逼的机器学习大神们需要具备的基本特点是,他们清晰地知道,为了实现某个效果,需要去调整什么东东。这个步骤称之为正交化(orthogonalization)。

一个表现好的有监督系统需要在以下4个维度上确保:
(1)至少要在training set上表现优秀
否则应采取措施:增加训练集/更换更好的算法

(2)也要在dev set上表现优秀
否则应采取措施:增大训练集/正则化

(3)也要在test set上表现优秀
否则应采取措施:改变开发集或成本函数

(4)在真实世界的数据上表现优秀

  • 表现优秀不优秀需要事先确定一个评估模型的指标。
  • 不建议采用early stoping来防止过拟合,这样会影响训练集的拟合

2.evaluation metric(评估指标)

2.1 single number evaluation metric(单一数字评估指标)

为了评估模型的表现,需要确定一个评估指标,来快速地告诉你,当前模型到底还是比你上一个模型更好了还是更差了。

2.1.1 常用指标

在分类模型中,常用的指标如下:
(1)recall
真实正例有多少比例被模型也预测为正例了。

(2)precision
预测的正例中有多少比例是真实的正例。

(3)F1 score
recall与precision是需要权衡,在recall上表现好,可能在precision上表现就差了,为了可以统一评估这两个指标,可以使用F1 score.
计算公式如下:

F1_score = 2 / (1/precision + 1/recall)

2.1.2 如何评估

使用训练集训练好模型之后,用模型预测dev set的样本,并计算以上指标在sev set上的表现来评估模型。

2.1.3 多个模型的比较

假设有多个分类器,且分别在多个数据集上进行训练,会发现有些分类器在某些数据集上表现好,再另一些上表现差。此时,要比较分类器的综合效果,可以将分类器在不同数据集上的表现(如F1 score)求均值,再进行比较。

2.2 satisficing and optimizing metrics(满足与优化指标)

要将所有指标整合成单一指标有时并不容易,而同时最优化所有指标又难以实现,因此可以使用策略:set saticfing as well as optimizing metric。

具体是怎么操作呢?
假设有n个评估指标,为其中n-1个指标设定一个约束条件,或者说设置定一个阀值,只要这些指标满足约束条件或者满足阀值,则表示satificing满足,不最求它们的最大化;而对于另一个指标,则选择该指标最大的那个模型,即optimizing。

举个例子,假设有A,B,C3个分类器,有两个评估指标,分别是accuracy和running time.
image_1cem63hk11v2c14l21mbj2e1cm09.png-20.5kB
要同时满足accuracy和running time都最优的分类器并不存在。
此时,选择running time满足小于100ms就可以;在满足的分类器中选择accuracy最大的那个分类器,即B.

3.train/dev/test(训练/开发/测试集)

3.1 train/dev/test的作用

回顾三个数据集的角色分别是:
training set(训练集) –> 用训练集训练不同的模型

dev set(开发集/保留交叉验证集) + evaluation metric –> 用开发集去评估不同的训练集训出来的模型,不断迭代训练,最终选出一个最好的模型,得到一个令人满意的成本。

test set(测试集) –> 评估dev set选出来的最好的模型

3.2 train/dev/test的分布

直接一个例子:
假设你有一份数据,分别是来自8个不同国家的数据。现在要对数据进行分割成以上3份数据。你可能会不假思索的将其中4个国家的数据当做dev set, 把另外四个国家的数据当做test set:
image_1cen46cmb1q5s1ils2pt1eft6udm.png-58kB
但这样做大错特错。因为在这个例子中,每个国家的数据分布很可能不同,因此你的dev set和test set将会来自不同分布。不同的分布,意味着实现的目标就不同了,dev set在优化A目标,但没想到,在test set上目标却是B,如此导致前期的训练工作南辕北辙。

因此要谨记的是,在分割数据的时候,一定一定一定要保证你的dev set 和test set要来自于相同的分布!

上述例子,可以把所有8个国家的数据全部打乱放在一起,然后随机(注意是随机)从中取出一部分数据作为dev set,一部分作为test set,如此就保证了它们来自同一份分布。

3.3 train/dev/test的大小

早期的划分比例:
image_1cen4u4r46pg3ks1tk21gie5al13.png-53.6kB
training set:70%
test set :30%
或者
training set:60%
dev set :20%
test set: 20%

因为早期的机器学习数据集往往比较小,比如几万个数据。但是现在的机器学习往往都是在大数据集上进行,动辄100万,因此划分的方式也不再入从前。
若遇大数据集,则划分可如下:
image_1cen52knf1s8l1nr2k6tqjb4hp1g.png-24.9kB
training set:98%
dev set :1%
test set: 1%

3.4 什么时候改变开发/测试集的指标

3.4.1 情况1

假设我们选用了
metric: classification error

得到两个模型分别的指标为
algrithom A: 3% error
algrithom B: 5% error

如果仅仅根据error这个指标,algrithom A表现更好。
然而,仔细分析,发现A误分了pornograhic图片,而B中却没有。而pornograhic是无法容忍的,因此这么看B会更好了。但根据evaluation metric, A会被认为更好,那咋办呢?

一个解决办法是,对pornograhic的误分设置更高的error权重(需要前期将pornograhic图片标记好)。比如,如果pornograhic误分,则该样本的error * 10,如果是其他图片误分,则权重为error * 1.

3.4.2 情况2

机器学习的任务可以分成如下两个步骤:
(1)为模型定义一个评估指标–制定目标
(2)在数据集上分别去寻找如何实现该指标最优,如制定cost function, 并在training set上最小化损失 –实现目标

如果你在当前的dev/test数据集上取得了针对某metric较好的表现,并不意味着你一定能在real world也取得同样好的表现。若real world表现不好,则需要改变你的metric,或者改变你的dev/test数据集。

4.与人类水平比较(comparing to human-level performance)

在过去的几年里,许多机器学习团队一直在讨论,如何比较机器学习系统和人类的表现。

4.1 为啥要与人类水平比较呢

大概有两个原因:
(1)最近几年深度学习的火热发展,使得在某些任务上机器学习系统的表现已经可以威胁到人类的表现了。
(2)让机器做人类能做的事,能更精细地设计机器学习系统的工作流程。

4.2 bayes optimal error

来看看如何比较。
用一个坐标轴来直观表示,横轴是时间,纵轴是accuracy,给出人类水平的线:
image_1cen83500drd1g37avfrt12a41t.png-26.3kB

然后给出机器表现的线,随着时间上升,数据集的扩大,模型的表现会越来越接近人类的水平,一旦到达人类的水平,其上升的幅度就逐渐减减少了,而且始终无法超过某个理论上限,这个理论上限称之为“bayes optimal error”.bayes optimal error永远无法被超越。
image_1cen88l9e1tk61s96134j8fgmud2a.png-60.2kB

因此完美的accuracy并不是100%(因为有样本人类和机器都无法识别),而是bayes optimal error。

为什么机器在超过人类水平之后,上升的幅度就大大减小了呢?原因有2“
(1)人类的水平离bayes optimal error已经非常接近了,因此再往上,there is not much head room to still improve.
(2)在低于human level时,有一些工具可以用来提升Model,但一旦高于human level, 工具就失效了。比如:
- 标注的数据是人类标注的
- 人类分析badcase以提升Model
- 对偏差与方差的分析也来自于人类
这些模型提升的方向都是依靠人类的,自然很难超越人类。

4.2 可避免偏差

第一类可避免偏差:
human error: 1%
training error: 8%
test error: 10%

此时,human error与trainning error相差7%的偏差,这个偏差是可以通过优化模型避免的。

第二类可避免偏差
human error: 7.5%
training error: 8%
test error: 10%

此时training error和human error已经非常接近,可能很难有提升。而test error却与training error还有差距,还可以进行正则化等方式进行提升。

因此,其实是将human error代替了bayes optimal error,只要training error接近human error就表示模型在拟合上表现优异,不需要再优化train set了。

4.3 理解人的表现

既然用human performance代替了bayes optimal performance,那么到底是什么样的human呢?不同的人对事物的认知与能力都不同,其产生的performance也是各有差异的。

比如对一张放射科图片的识别误差可以有一下几类:
- typical human: 3% error
- typical doctor: 1% error
- experienced doctor 0.7% error
- team of experienced doctor 0.5% error (可以看做是人类做高水平)
在实际应用中,若认为typical doctor已经够了,则模型表现的上限应该是 1% error
–>因此不同的项目,不同的目标,评估的上限也不同。

4.4 超过人的表现

人的表现很难超越,但是在某些问题上,机器确实超越了人类。比如:
商品推荐
在线广告
预测运输时间
预测还贷款倾向
等等

以上问题有一个共性,就是模型可以从大量的结构化数据中去学习,而对大量数据的处理,人脑往往不及计算机。

但是在另一些问题,比如涉及人类感知方面机器有时候弱得要命,比如
自然语言处理
视觉
等等。

4.5 改善你的模型的表现

监督模型的两个基本的假设:
(1)你能够很好地拟合训练集–实现low avoidable bias
(2)训练数据集上的表现能够扩展到dev/test数据集上 –variance is not bad.

对于出现high bias or high variance的情况下应该如何做去改善模型:
high bias:
- 训练更复杂的模型
- 换更优秀的算法
- 调整神经网络结构
- 超参数调优
high variance:
- 更多训练数据
- 使用正则化
- 调整神经网络结构
- 超参数调优

猜你喜欢

转载自blog.csdn.net/sinat_33761963/article/details/80559088