机器学习 吴恩达 第十章 笔记

十、机器学习系统的设计(Machine Learning System Design)

11.1 确定执行的优先级

  在接下来的视频中,我将谈到机器学习系统的设计.这些视频将谈及在设计复杂的机器学习系统时,你将遇到的主要问题.同时我们会试着给出一些关于如何巧妙构建一个复杂的机器学习系统的建议.
  下面的课程的的数学性可能不是那么强,但是我认为我们将要讲到的这些东西是非常有用的,可能在构建大型的机器学习系统时,节省大量的时间.本周以一个垃圾邮件分类器算法为例进行讨论.
   为了解决这样一个问题,我们首先要做的决定是如何选择并表达邮件特征向量\(x\).我们可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0),尺寸为100×1.这里只是举例,实际用法最多的是采取训练集中出现频率最多的n(10000 ~ 50000)个单词,将其作为特征向量.
  那么如何让分类器有高精准度和低错误率.
1.收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
2.基于邮件的路由信息开发一系列复杂的特征
3.基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
4.为探测刻意的拼写错误(把watch 写成w4tch)开发复杂的算法
  在上面这些选项中,非常难决定应该在哪一项上花费时间和精力,作出明智的选择,比随着感觉走要更好.当我们使用机器学习时,总是可以"头脑风暴"一下,想出一堆方法来试试.实际上,当你需要通过头脑风暴来想出不同方法来尝试去提高精度的时候,你可能已经超越了很多人了.
  我们将在随后的课程中讲误差分析,我会告诉你怎样用一个更加系统性的方法,从一堆不同的方法中,选取合适的那一个。因此,你更有可能选择一个真正的好方法,能让你花上几天几周,甚至是几个月去进行深入的研究.

11.2 误差分析

  在本次课程中,我们将会讲到误差分析(Error Analysis)的概念.这会帮助你更系统地做出决定.
  如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,拥有多么复杂的变量;而是构建一个简单的算法,这样你可以很快地实现它.
  每当我研究机器学习的问题时,我最多只会花一天的时间,就是字面意义上的24小时,将项目简单粗暴地做出来.做完后,可以画出学习曲线,通过画出学习曲线,以及检验误差,来找出你的算法是否有高偏差和高方差的问题,或者别的问题.在这样分析之后,再来决定用更多的数据训练,或者加入更多的特征变量是否有用.这么做的原因是:这在你刚接触机器学习问题时是一个很好的方法,你并不能提前知道你是否需要复杂的特征变量,或者你是否需要更多的数据.因为你缺少证据,缺少学习曲线.因此,你很难知道你应该把时间花在什么地方来提高算法的表现.
  除了画出学习曲线之外,一件非常有用的事是误差分析.我的意思是说:当我们在构造垃圾邮件分类器时,我会看一看我的交叉验证数据集,然后亲自看一看哪些邮件被算法错误地分类.因此,通过这些被算法错误分类的垃圾邮件与非垃圾邮件,你可以发现某些系统性的规律:什么类型的邮件总是被错误分类.经常地这样做之后,这个过程能启发你构造新的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它.
  以我们的垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看:是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等.然后看分类器对哪一组邮件的预测误差最大,并着手优化.思考怎样能改进分类器.例如,发现是否缺少某些特征,记下这些特征出现的次数.例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从出现次数最多的情况开始着手优化.误差分析并不总能帮助我们判断应该采取怎样的行动.
  最后,在改进学习算法时,还有一个方法是保证自己对学习算法有一种数值分析.意思是当执行学习算法的时候,算法能够返回一个评价指标来估计算法执行的效果.可能算法是正确的也可能是错误的,但是这个数值表示算法效果有多好.误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是计算交叉验证集的误差(即数值是交叉验证集的错误率).在我们的垃圾邮件分类器例子中,对于“我们是否应该将discount/discounts/discounted/discounting处理成同一个词?”如果这样做可以改善我们算法,我们会采用一些截词软件。误差分析不能帮助我们做出这类判断,我们只能尝试采用和不采用截词软件这两种不同方案,然后根据数值检验的结果来判断哪一种更好.因此,当你在构造学习算法的时候,你总是会去尝试很多新的想法,实现出很多版本的学习算法,如果每一次你实践新想法的时候,你都要手动地检测这些例子,去看看是表现差还是表现好

11.3 不对称性分类的误差评估

  有了算法的评估和误差度量值,还有一件重要的事情要注意,就是使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题.
  类偏斜情况表现为我们的训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本.例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤.假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%.然而我们通过训练而得到的神经网络算法却有1%的误差.这时,误差的大小是不能视为评判算法效果的依据的.
  当我们遇到偏斜类,我们希望有一个不同的误差度量值.其中一种叫查准率和查全率.查准率(Precision)和查全率(Recall)我们将算法预测的结果分成四种情况:

  1. 正确肯定(True Positive,TP):预测为真,实际为真
  2. 正确否定(True Negative,TN):预测为假,实际为假
  3. 错误肯定(False Positive,FP):预测为真,实际为假
  4. 错误否定(False Negative,FN):预测为假,实际为真

  查准率=TP/(TP+FP).例:在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好.
  查全率=TP/(TP+FN).例:在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好.这样,对于我们刚才那个总是预测病人肿瘤为良性的算法,其查全率是0.
image
  在有这个度量后,即使有一个非常偏斜的类,算法也不能欺骗我们.

11.4 查准率和查全率之间的权衡

  在之前的课程中,我们谈到查准率和召回率,作为遇到偏斜类问题的评估度量值.在很多应用中,我们希望能够保证查准率和召回率的相对平衡.在这节课中,我将告诉你应该怎么做,同时也向你展示一些查准率和召回率作为算法评估度量值的更有效的方式.
  继续沿用刚才预测肿瘤性质的例子.假使,我们的算法输出的结果在0-1 之间,我们使用阀值0.5来预测真和假.但有时我们需要在非常确信的情况下,才确诊肿瘤.
  如果我们希望提高查全率(但会有较低查准率),尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阀值,如0.3.
  一种做法是修改算法,提高阈值.我们可以使用比0.5更大的阀值,如0.7,0.9.这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况.这样会有更高的查准率,更低的查全率.
   我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
image
  当有多个算法时,我们计算出查全率和查准率,那么我们怎么选择出最好的那个算法呢?
image
  正常思路可能会选择P和R的平均数,但是我们可以明显发现无论如何\(y=1\)在偏斜类的情况下平均值也会很高.因此这种度量是被舍弃的.
  我们希望有一个帮助我们选择这个度量的方法:一种方法是计算F1 值(F1 Score),其计算公式为:

\[F_1 Score = 2\frac{PR}{P+R} \]

其中P是查准率,R是查全率,我们选择使得F1值最高的临界值(通常测试不同的阈值)一般在交叉验证集上选择.

11.5 机器学习的数据

  在之前的小节中,我们讨论了评价指标.在本小节中,我要稍微转换一下,讨论一下机器学习系统设计中另一个重要的方面,这往往涉及到用来训练的数据有多少.
  我曾告诫大家不要盲目地花大量的时间来收集数据,因为数据有时不是唯一能实际起到作用的.但事实证明,在一定条件下,大量的数据可以训练出效果很好的算法.本节我们讲述这个条件是什么.
  很多很多年前,我认识的两位研究人员Michele Banko 和Eric Brill进行了一项有趣的研究,他们尝试通过机器学习算法来区分常见的易混淆的单词,他们尝试了许多种不同的算法,并发现数据量非常大时,这些不同类型的算法效果都很好.
image

  比如,在这样的句子中:早餐我吃了__个鸡蛋(to,two,too),在这个例子中,"早餐我吃了2个鸡蛋",这是一个易混淆的单词的例子.于是他们把诸如这样的机器学习问题,当做一类监督学习问题,并尝试将其分类,什么样的词,在一个英文句子特定的位置(图内横线位置),才是合适的.上图的四个算法的细节不那么重要,我们下面希望探讨,什么时候我们会希望获得更多数据,而非修改算法.他们所做的就是改变了训练数据集的大小,并尝试将这些学习算法用于不同大小的训练数据集中,这就是他们得到的结果.
image
  首先大部分算法,都具有相似的性能,其次,随着训练数据集的增大,在横轴上代表以百万为单位的训练集大小,从0.1个百万到1000百万,也就是到了10亿规模的训练集的样本,这些算法的性能也都对应地增强了.事实上,如果你选择任意一个算法,可能是选择了一个"劣等的"算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其他算法更好,甚至会比"优等算法"更好.
  这节个人认为有点混乱:当特征多数据集不够大时,就会发生过拟合.当特征多而数据集足够大时就不容易发生过拟合.高偏差问题,可以通过确保有一个具有很多参数的学习算法来解决.而高方差问题,可以通过大量训练集来解决.这是一个关键的假设:特征值有足够的信息量,且我们有一类很好的函数,这是为什么能保证低误差的关键所在.它有大量的训练数据集,这能保证得到更低的方差值.

  好的总结:当算法有低偏差和高方差问题,增大训练集可能会对算法有帮助.

posted @ 2023-02-07 02:37  acmloser  阅读(52)  评论(0编辑  收藏  举报