Machine learning system design(机器学习系统的设计)

前言

       这一章内容还是紧接上一章内容的,在上一章我们给大家介绍了当我们在构建了一个学习模型后,我们发现用这个模型去预测新的数据时,有很大的偏差,我们该如何进行改进。也跟大家介绍了出现问题的类型包括高偏差和高方差,和如何用learning curve去判断这个改进方法是否有效等等,在这一章我将给大家介绍在构建一个学习系统前该做些什么工作。

      最后,如果有理解不对的地方,希望大家不吝赐教,谢谢!

【机器学习系列】【第八章:对于应用机器学习的建议】【第十章:支持向量机

第九章 Machine learning system design(机器学习系统的设计)

9.1 优先要做什么

      在这里,我们用一个例子来说明我们在构建一个学习系统时该优先做什么。在第一章给大家介绍监督学习时,就给大家举例了对邮件分类问题,在这里我们又拿出来详细地进行讨论。当收到一封邮件时,我们是怎么判断它是spam(垃圾邮件)还是non-spam(非垃圾邮件)?如图1我们收到了两封邮件。

                                                                                             图1 两封邮件

      对于图1所示的两封邮件,左边的是spam(1),右边是non-spam(0),我们该如何来选取特征作为我们的输入x,来进行判断区分了?在这里,我们可能会选取是否有收件人的名字,比如Andrew,或者buy、deal、discount、now等等(这些和金钱有关的可能是垃圾邮件),我们定义x_{j}=\left\{\begin{matrix} 1 &if &word &j & appears &in & email\\ 0 & othewise & & & & & \end{matrix}\right.,则对于图2所示的邮件我们有x=\begin{bmatrix} 0\\ 1 \\ 1 \\ ... \\ 1 \\ ... \\ \end{bmatrix}\Leftarrow \begin{bmatrix} andrew\\ buy \\ deal \\ discount \\ ... \\ now \\ ... \end{bmatrix}x\in R^{100}我们选取了100种特征来对此进行统计。其实在实际中,我们要选取的特征往往不止这些,我们一般要选取10000~50000种,而且这些词汇都是经过统计出现比较频繁的,这才能更具一般性。

                                                                                     图2 spam

    我们该如何做让我们的系统具有更低的错误率了?

1.收集大量数据

2.构造复杂的特征信息通过邮件的标题

3.构造一些对于信息体的特征,比如针对是否把discount和discouts看作同一个词,还有deal和dealer,或者针对标点符号的特征

4.研究一个复杂的算法来解决拼写错误的问题(比如m0rtgage、med1cine)

...

对于以上的这些做法,我们现在不好直接回答是否有用,在后面的分析中,我们会一一解释。

9.2 误差分析

      通过前面的分析,我们在进行一个机器学习时,我们的建议是:1.先从一个简单的可以落实这个问题的算法开始入手,实现越快越好,再根据交叉数据进行测试。在这里说明下,并不是一开始选用一个复杂的算法就更好,我们要的一直是更快的解决问题,再通过测试进行改进。2.通过绘制学习曲线来判断增加更多的数据或者特征等等是否有效。3.进行误差分析。我们可以手动根据那些分错类的邮件具有哪些特征,人工进行统计分析。

      下面针对上面的第三步误差分析,来给大家进行详细说明。假设我们的交叉数据集有m_{cv}=500,而其中有100封邮件分类错误,第一步:我们对这100封邮件进行人工特征检测,看下这些都是什么类别的,经过分析有pharma(药)、replica/fake(复制品)、steal passwords(窃取密码)...还有统计一些拼写错误,他们的路径来源,常见的标点符号等等,如图3所示是统计的结果。

                                                                         图3 错误分类的特征统计结果

那么第二步,就是判断哪些特征我们是用的,即可以给他们进行正确分类。

      对于是否有用,我们直观判断可能不具有科学性,我们需要的是用数据来说话,在判断是否把discount,discounts等等一些词看作同一个词的问题上,目前有一个软件是“stemming”,对主干进行提取,像上面我们提到的词都可以判断为同一个词。而如果我们有universe和university,那么它就也会判断为同一个词,这样就会出错,所以我们不能凭直观给出是否可以这样做,我们需要做的是对两者分别用交叉数据进行测试,根据数据结果来判断是否要这样做。经过测试没有使用stemming的错误率是:5%,而使用了后错误率是3%,可以发现使用后错误率下降了,所以是有用的,在后面我们需要判断一个方法是否有效时,我们都可以根据交叉数据来进行测试。

9.3 Error metrics for skewed classes(倾斜类的误差标准)

      有一类数据比较特殊,我们用预测癌症的例子来给大家进行说明。在cancer的问题中,我们用y=1表示患有癌症,用y=0表示没有癌症。在测试数据中,我们发现有1%的错误判断,99%的正确判断,而实际情况却是只有0.5%的人患有癌症,对于这个结果大量偏向一边的问题,我们称此为倾斜类问题。如果我们在进行算法的编写上,我们这样做:

function y=predictCancer(x)

          y=0; %ignore x

return

这个时候,我们不管输入,输出都为0,错误率有0.5%。

    对于这个问题,我们需要检验的是y=1的表现,所以显然不能直接这样做。我们在这里给大家定义两个新的变量,对于如图4所示的一张表格,我们有precision(精度),recall(召回)

precision=\frac{True positive}{all positive}=\frac{True Pos}{TruePos+FalsePos}(在我们的预测有cancer中,我们真正有哪些是确实患有cancer的)

recall=\frac{TruePositive}{allPositive}=\frac{TruePos}{TruePos+FalseNeg}(在我们预测有cancer中,我们还有哪些被遗漏的)

                                                                                  图4 实际和预测结果的关系

    在这里我们肯定既需要我们能够准确地预测出真正患有cancer的人,即precision要高,我们也希望患有cancer的人能被我们检测出来,即recall要高,而实际情况是很难两者都达到特别高的,那么我们该如何权衡了?在前面分类的问题中,0\leq h_{\theta }(x)\leq 1,我们设的阈值是0.5,即当h(x)>=0.5时,我们预测为1,而当h(x)<0.5时,我们预测为0,假设我们把阈值设为0.9,那么这个时候对于我们要预测为1,即预测为cancer的可能性更小了,所以我们的precision会很高,而对于recall则会很低,因为阈值很高,我们遗漏的患者会更多。假设我们设的阈值是0.3,则结果正好相反,precision会很低,而recall会很高,看似两者很难选择,对此可能大家最容易想到的是取两者的平均值,即\frac{P+R}{2},对于如图5所示的P和R,我们对每一组分别求得平均值为0.45、0.4、0.51,我们会发现第三组貌似更好一些,然而对于第三组,我们会发现这就是对于所有的输入,预测结果都为1,显然是不可取的,所以在这里我们引入了一个新的判决方法叫F方法,常写作F_{1}=2\frac{PR}{P+R},这样我们就避免了输出一直是一种结果的问题,因为这样P或者R会特别小,因此我们的F也会特别小,则不是最合适的,比如图5所示F分别为0.45、0.175、0.039,很明显第三组是不合适的,而第一组才是最合适的。

                                                                                图5 Precision和Recall

9.4 机器学习的数据

      在前面也给大家说明了,当我们构造的学习模型不是很好时,我们经常会去获取更多的数据,大量的数据确实对一个机器学习系统有很大的帮助,有人就说过一个好的学习系统不是拥有好的算法而是拥有大量好的数据。比如在预测房子的价格问题中,如果我们只有房子大小这一个数据,那么我们可能对房子做出准确的预测吗?答案是不能的,因为我们不知道一个房子有几间房间,是新的还是旧的等等,所以当有大量的数据时,我们才能进行更好的判断。在前面也跟大家介绍了,当有大量数据时,过度拟合问题也会有所改善,J_{train}也会降低,并接近J_{test}等等,所以我们确实需要更多的数据,这样我们对我们所构造的学习系统才更有信心。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
吴恩达的机器学习系统设计选择题主要包含以下几个方面: 1. 训练集和开发/测试集:选择合适的训练集和开发/测试集对于构建有效的机器学习系统非常重要。我们需要确保训练集和开发/测试集能够代表真实的数据分布,并且在划分数据集时要考虑到数据的随机性和一致性。 2. 性能指标选择:根据具体的问题和需求,选择合适的性能指标来评估机器学习系统的表现。如分类问题可以选择准确率、精确率、召回率等指标,回归问题可以选择均方误差或相关系数等指标。 3. 偏差和方差的平衡:在机器学习系统中,我们通常会面临偏差和方差之间的权衡。通过增加模型的复杂度可以降低偏差,但容易引起方差过高;通过减小模型的复杂度可以减小方差,但容易导致偏差过高。需要根据具体情况选择适当的模型复杂度。 4. 错误分析:在构建机器学习系统时,我们需要进行错误分析来深入了解模型在不同数据集上的表现。通过错误分析,我们可以找出模型存在的问题,并采取相应的措施进行修正和优化。 5. 学习曲线:学习曲线可以帮助我们了解模型的训练过程。通过绘制训练集和开发/测试集的误差随着训练集大小变化的曲线,我们可以判断模型是否出现高偏差或高方差的情况,从而决定是否需要增加更多的训练数据或者调整模型复杂度。 吴恩达强调了以上几个方面的重要性,并提供了相应的选择题帮助我们更好地设计和调整机器学习系统,以获得更好的性能和效果。这些选择题的回答需要结合具体问题和数据情况进行分析和判断,从而做出最合理的决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烊萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值