machine learning yearning 吴恩达——笔记

前言:吴恩达的新书,目前只看到前14章,做个学习笔记。

深度学习(神经网络)已经出现多年,为何有些概念最近才火,有两个条件:

  • 可获取数据,大数据的到来,使数据量足够作为训练数据
  • 计算能力变强

对于传统算法,比如logistic回归,数据量变大并不会大幅度提高性能,而在较少的隐藏层的神经网络上就可以有较高提升。
目前,提高算法性能的方法:
1)训练更多的网络,train a bigger network
2)获取更多数据
例子:自动辨别出有猫的图片

建立训练集和交叉验证集

从网上找图片,分别是有猫的和无猫的图片,拆分数据集,训练数据,以此为模型,放到app线上使用时,模型效果很差。
原因:网上图片质量好,清晰,而用手机拍的往往比较模糊。

  • 训练集:跑学习的算法
  • 交叉验证集:调参数,选特征
  • 测试集:评估模型的好坏

本质:测试集和被预测的数据分布不同。
做法:选择的验证集和测试集数据要与将来真正用来预测的数据大致一致。分布完全一致是不可能的,尽量使验证集数据能够反映将来要预测的数据。

验证集和测试集数据的分布应该一致

如果模型在验证集上效果很好,但在测试集上不好,而它俩的分布是一致的,则说明模型在验证集上过拟合了,此时需要获取更多的验证数据。
不过当验证集和测试集分布不一致时,有可能犯以下错误:
1. 验证集上过拟合。
2. 测试集数据比验证集困难,需要提高算法。(就比如手机拍的像素差)。
3. 验证集和测试集数据不一致,此时在验证集上改进算法也无法获得提高。

**总结:
1.验证集和测试集的数据要与预测数据分布尽量一致;
2.验证集和测试集分布要一致。**

验证集和测试集的数据应该多大?

在小数据集中,90%和90.1%的差别不大,但是一般验证集数据都在千、万级别,此时提升0.1%也有不少的改进。。
一般测试集为30%,但是随着大数据的到来,其实不必完全遵守,因为30%的话数据量也很大了。不必过分追求太大数据量大验证集和测试集。

建立单一评价准则,以此进行优化

分类问题中的精确度就是单一评价准则,而precision和recall就不是,此时假如一个值大一个值小,无法判断哪种模型效果更好。
建议将precision和recall融合成一个指标,比如说F1值,即取调和平均值,而不是简单的取均值。这样更利于做决策。
另外,比如对于四个地区的猫图片,会有四种评估结果,可以取均值或加权均值,最后也是指采用一个评估指标。
建议:采用一个值作为模型的评估指标,比如F1值,或均值、加权均值。

优化和指定的准则

另一种结合多种评估准则的方法。
考虑准确率和运行时间,可以通过比如Accuracy-0.5 x RunningTime作为单一指标。但这里推荐另一种做法:
首先,设置运行时间在100s内是可接受的,在此情况下再优化准确率。运行时间就是“satisficing metric”,准确率就是“optimizing metric”。
如果有n个评估指标,取n-1个作为“satisficing metric”,每个指标先设置好一个特定的值,最后一个作为“optimizing metric”,对它进行优化。
此时要考虑到你更关心的是哪种错误,第一种错误还是第二种错误。比如对于唤醒siri之类的,false negative rate表示有人说话却没唤醒它,false positive rate表示没人说话却唤醒了。此时可以考虑优化的目标是:在24h内false positive不超过一次(fatisficing metric)的情况下,使得false negative尽可能小(optimizing metric)。
重点:使优化目标只有一个,类似控制变量法,但也有侧重点,看你的问题关注点所在

有验证集和评价准则可使收敛更快

idea——>code——>experiment
就跟打比赛时线下先验证效果,再把模型代入线上数据。能够知道哪个模型有提高。

何时应该改变验证集/测试集和评价准则

首先尽快建立验证集/测试集和评价准则,之后再慢慢进行优化。
如果验证集或评价准则得出的结果与你的预期有出入,尽快换掉。比如你认为A应该比B分数高,但基于之前的验证集和评价准则得出的结果却是相反的。
三个可能的原因:
1. 要预测的数据分布与验证集不同。
2. 验证集上过拟合了。
3. 评价准则选取不当。比如说A经常允许色情图片进入,尽管A模型准确率比较高,但其实这不是我们想要的。此时可以换评价准则,比如说加大对色情图片的惩罚因子。

1.总结:建立验证集和测试集

  • 选择与将来要预测的数据分布一致的验证集和测试集。与训练集数据分布不一致是可以的。
  • 验证集和测试集的数据尽量一致。
  • 对单一评价准则进行优化。有多种考虑的话,将它们结合到单一的公式中。
  • 机器学习需要不断迭代优化:尝试很多方法
  • 有验证集/测试集和单一的评价准则会使迭代更快。
  • 要做一个app时,尝试尽快先建立验证集/测试集和评价准则,至少一周之内。如果是做一个成熟的app的话时间可以更久一些。
  • 70%/30%的训练集/测试集拆分可能并不适合数据量大的情况。验证集和测试集的数据可以比30%少。
  • 验证集的数据要足够多,要能捕捉到算法准确度的变化,也不必十分大。测试集的数据要足够大,要能准确估计最后的系统性能。
  • 如果验证集和评价准则不再能正确反映效果的时候,及时改变它们:
    1. 过拟合的话就加大验证集数据
    2. 实际数据和验证集/测试集不一致的话,就找新的验证集/测试集。
    3. 评价准则不能准确反映效果的时候,改评价准则。

13.误差分析:看验证集的错误结果长啥样

假设验证集中有一部分是狗的图片,此时:
1.看一部分验证集中被误判的数据具体是什么图片;
2. 手动看样例数据,输出一共有几张狗的图片。
查看被误判的数据,这个叫误差分析。比如说,只有5%的误判数据是狗,那么无论你在狗的问题上做多大努力,最多只能提高5%的准确率。比如说原来准确率是90%,此时最多只能提高到90.5%。但如果你发现误判的图片中有50%是狗,那么此时处理狗的问题,可以最多提高到95%。
这样你能判断,要对狗的问题做研究是否值的。
误差分析能够帮助你明白在哪个方向上改进能够得到明显的效果。
误差分析指的是检查在验证集数据中,被算法误判的那些数据,以此来检查为什么犯错。找对方向,会节省很多时间。

14.在误差分析过程中,同时评估多种原因,找出有利于改进且提高大的那个原因

比如同时有以下几个原因可能会导致误判:
1. 改进狗的问题。
2. 改进误认狮子的问题。
3. 改善图片模糊的问题。
做个电子表格,将一部分验证集中的每一条误判记录,都记录下来,是问题1、2还是3,打勾,并作相应备注。
在做的过程中,还可能会有新的原因导致误判,比如是滤镜导致的。此时将这条原因也再加上去。
有方法可以进行的才是最有用的错误类别。比如你有方法取消图片等滤镜,那么有滤镜这个原因导致的误判能过被改正。也不一定是有方法,这给你提供了一个可以往哪方面改进的思路。
误差分析是一个迭代的过程,可以一开始根本不知道错误产生的原因,但经过人工看误差数据,可以分析出改进哪方面可以有更高的提高。比如在误判中,原因1只占8%,原因3占了61%,那么改进原因3可能比较好。

猜你喜欢

转载自blog.csdn.net/minixuezhen/article/details/73186345