Advice for applying machine learning(对于应用机器学习的建议)

前言

       这一章内容还是紧接上一章内容,在前面给大家介绍了线性回归,逻辑回归还有神经网络算法。在实际中,很多研究人员在解决一个问题时,选用了其中的一种算法,然而在经过了大量的计算后,结果可能不是预想的结果,这个时候,大家可能想着是研究的数据不够,就又会去大量地统计数据,比如预测房子价格问题,可能会去采访大量的户主来获取更多的信息,这个就需要花上好几个月的时间,而且最终可能并没有起什么作用,所以我们就会思考,如果我们发现我们预测的结果不是很理想时,我们需要做哪些措施来进行有效的补救,这就是这章讨论的重点。

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

【机器学习系列】【第七章:神经网络学习】【第九章:机器学习系统的设计

第八章 Advice for applying machine learning(对于应用机器学习的建议)

8.1 下一步该如何做

      假设当你在做一个预测房子价格问题时,你已经对你需要训练的数据做出了很好的分析,构造出了预测函数,对于costFunction也是当前最小值,然而在对一个新的数据进行预测时确发现结果有很大的误差,这个时候我们从哪些方面进行改进了?你可能会这样做:

1)去得到更多的训练数据

2)尝试选用更少的数据特征,丢掉一些特征

3)尝试添加多项式的项比如增加x1x2,x1^2,x2^2等等

4)尝试减小\lambda

5)尝试增大\lambda

...

那么问题就来了,是不是以上任意一种方法就可以解决问题?答案肯定是不对的,就如对症下药,所以我们也需要针对不同的问题采用不同的方法进行改进。

      对于以上的分析,我们就有了一个诊断法,用来诊断一个机器学习方法出现了什么问题,需要怎样的改进。诊断法同样需要花时间去落实,但是总比无头苍蝇做一些无用功好,这可以充分地利用我们的时间。

8.2 评估一个假设

      我们首先要做的即是对我们做出的假设进行评估,先以一个线性回归的问题来进行说明,例如我们在前面讨论过的房子预测问题的过度拟合,如图1所示。

                                                                                     图1 过度拟合

在这个问题中,我们发现对于训练数据,我们进行了很好的训练,使它的代价函数值接近0,然而对于新的预测数据确不是很好,在这里由于开始我们对于我们做出的假设并不知道它的适应性如何,所以我们就需要通过原本的数据集就可以知道我们的假设是否合理,在这里我们有一个做法就是,把所有的训练数据分成两部分,70%的还是用做训练数据,而剩下的30%则作为测试数据。具体做法如下:对70%的训练数据进行学习,求得使代价函数J(\theta )最小的\theta值,然后用训练数据得出的结果对30%的测试数据进行求代价函数,则可以判断其假设的不合理性。

      前面给大家介绍的是怎样判断线性回归问题的合理性,同样逻辑回归也适用,也是进行把训练数据分成两部分,70%的训练集和30%的测试集,通过训练集得出的结果在对测试集求其代价函数时,即可以判断在分类时误判的可能性。

8.3 对模型的挑选

     在前面也给大家介绍了,我们的假设模型不止一种,虽然在前面我们喜欢以线性关系来模拟输入和输出的关系,但我也给大家进行了说明,实际问题中,很多问题以线性关系来进行模拟会有很大的偏差,那么我们该如何选取模型了?在这里将给大家介绍一个严谨的评判标准。在这里我们依旧拿出预测房子价格问题来解释这个方法,在图1中出现了过度拟合的问题,那么我们到底选择多项式的次数为多少的模型才能更好地预测结果了?

    在这里我们对不同的假设模型通过训练集的数据计算出使代价函数值J(\theta )最小的\theta,并带入测试数据中求出测试数据的J(\theta ),进行比较,得到最小值,即我们认为是最好的预测模型。

1)h_{\theta }(x)=\theta _{0}+\theta _{1}x  \rightarrow \Theta ^{(1)}\rightarrow J_{test}(\Theta ^{(1)})

2)h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}  \rightarrow \Theta ^{(2)}\rightarrow J_{test}(\Theta ^{(2)})

3)h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}+\theta _{3}x^3  \rightarrow \Theta ^{(3)}\rightarrow J_{test}(\Theta ^{(3)})

...

10)h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}+...+\theta _{10}x^{10}  \rightarrow \Theta ^{(10)}\rightarrow J_{test}(\Theta ^{(10)})

经过分析比较,我们选择了h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}+...+\theta _{5}x^{5},当这个能是否能很好地预测新的数据了?有没有可能我们所选择出来的只是适合测试数据而已,所以我们为了避免这个问题,我们对数据集又重新进行规划,60%的还是作为训练集,20%作为交叉验证集,20%作为测试集,这个时候我们用来选择的是根据交叉验证集的代价函数值来选择,这个时候就成了如下这样:

1)h_{\theta }(x)=\theta _{0}+\theta _{1}x  \rightarrow \Theta ^{(1)}\rightarrow J_{cv}(\Theta ^{(1)})

2)h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}  \rightarrow \Theta ^{(2)}\rightarrow J_{cv}(\Theta ^{(2)})

3)h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}+\theta _{3}x^3  \rightarrow \Theta ^{(3)}\rightarrow J_{cv}(\Theta ^{(3)})

...

10)h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}+...+\theta _{10}x^{10}  \rightarrow \Theta ^{(10)}\rightarrow J_{cv}(\Theta ^{(10)})

再通过J_{test}(\theta ^{(4)})来检测这个泛化误差。

      把数据分成三部分也一直是大家公认的比较好的方法,通过这个方法,我们就没有直接通过训练集来预测数据,这样弱化了训练集的作用,比较有普遍性。

8.4 Bias or  Variance(偏差还是方差)

       对于前面也给大家说明了,我们要对模型进行诊断,既然有诊断就必须有个结论,在结论中,我们会有两种结论偏差或者方差,下面我们详细分析什么情况是偏差,什么情况是方差。

       如图2所示,这是我们前面在对房子价格预测问题上,对假设做出的几个不同的模型,对模型我们也进行了分析比较,对于第一个模型,我们给出的结论是欠拟合,第二个模型是正好,第三个模型是过拟合。

                                                                               图2 不同模型的图像

Training error:J_{train}(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^2

Cross validition error:J_{cv}(\theta )=\frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_{\theta }(x_{cv}^{(i)})-y_{cv}^{(i)})^2

对于图2中不同程度的多项式(我们用d来表示多项式的次数),我们有如图3所示的J_{train}(\theta ),J_{cv}(\theta )关于d的图。

                                                                    

                                                              图3  J_{train}(\theta ),J_{cv}(\theta )和d的关系

如果我们的预测不是很好的话,那么我们的J_{cv}(\theta )orJ_{test}(\theta )就会很高,那么这是偏差问题还是方差问题了?

Bias(underfit):J_{train}(\theta )会很高,而J_{cv}(\theta )\approx J_{train}(\theta ) (d较小)

Variance(overfit):J_{train}(\theta )会很低,而J_{cv}(\theta )\gg J_{train}(\theta )  (d较大)

对于上面的定义,也不难解释,对于过度拟合,就是模型尽可能接近训练集数据,所以我们的训练误差会很小,而欠拟合则是模型没有很好地贴近训练集,所以训练误差会很大,而不管是两者中的哪一种,都不是很好的预测模型,所以我们的交叉误差都会很大。

8.4 正则化和偏差或者方差的关系

      对于上面的讨论,我们都还没考虑正则化项,而对于正则化中,我们引入了一个新的变量\lambda,所以我们需要讨论下\lambda对模型的影响,如图4所示,我们的模型是:h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^2+\theta _{3}x^3+\theta _{4}x^4,而J(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^2+\frac{\lambda }{2m}\sum_{j=1}^{n}\theta _{j}^{2}\lambda很大时,我们就可以忽略掉后面4项了,这个时候就是一条水平线了如图4的第一个图,而当\lambda很小时,假设为0,则如图4的第三个图。

                                                                                 图4 不同\lambda对模型的影响

 同样地,我们在这里选取不同的\lambda,分别求出使J(\theta)最小的\theta,然后对应地带入到J_{cv}(\theta ),得到最小的\theta^{(j)}带入J_{test}(\theta )计算泛化误差。

    我们在这里同样地做出J_{train}(\theta ),J_{cv}(\theta )关于\lambda的图,如图5所示。

                                                               图5  J_{train}(\theta ),J_{cv}(\theta )\lambda的关系

在这里,当\lambda较小时,J_{train}(\theta )很低,而J_{cv}(\theta )很高,是方差;当\lambda较大时,J_{train}(\theta )很高,而J_{cv}(\theta )也很高,是偏差。

8.5 学习曲线

         回到我们这章的主要问题上来,我们要进行判断的是进行改进的方法是否有效,在这里我给大家介绍一个learning curves(学习曲线法)来判断此方法是否有效,比如我们前面的方法之一增加训练的数据,即增加m。

1)当是高偏差问题时

       我们画出J_{train}(\theta ),J_{cv}(\theta )关于m的图像,如图6所示,从图中我们会发现,当m很小时,J_{train}(\theta )较小,比如图7所示,而我们的J_{cv}(\theta )很大,当m很大时,J_{train}(\theta )慢慢增大接近一个水平,J_{cv}(\theta )会慢慢减小,接近水平,两者近似相等,当m再增大,我们会发现两者不会有什么改变,所以可以说明增加m不会对高偏差问题有所改善。

                                                                                      图6 高偏差

                                                                                         图7 m较小时

2)当是高方差问题时

      我们同样有J_{train}(\theta ),J_{cv}(\theta )关于m的图像,如图8所示,我们会发现随着m的增加,J_{cv}(\theta )会不断地减小,所以对于高方差问题来说,增加m是有用的。

                                                                              图8 高方差问题

8.6 总结

     在前面我们提出了下一步该如何做的一些做法,但没有指明是解决那类问题的,在这里我们重新拿出那些做法来一一说到。

1)去得到更多的训练数据    \Rightarrow高方差

2)尝试选用更少的数据特征,丢掉一些特征  \Rightarrow高方差

3)尝试添加多项式的项比如增加x1x2,x1^2,x2^2等等  \Rightarrow高偏差

4)尝试减小\lambda  \Rightarrow高偏差

5)尝试增大\lambda  \Rightarrow高方差

     最后跟大家提一下神经网络,在神经网络中,如果模型的层次比较少即\Theta较少,则容易发生欠拟合问题,而如果层次比较多即\Theta较多,则容易发生过度拟合问题,我们同样用正则化来解决这个问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Scala:Applied Machine Learning by Pascal Bugnion English | 23 Feb. 2017 | ISBN-13: 9781787126640 | 1843 Pages | EPUB/PDF (conv) | 33.15 MB Leverage the power of Scala and master the art of building, improving, and validating scalable machine learning and AI applications using Scala's most advanced and finest features. About This Book Build functional, type-safe routines to interact with relational and NoSQL databases with the help of the tutorials and examples provided Leverage your expertise in Scala programming to create and customize your own scalable machine learning algorithms Experiment with different techniques; evaluate their benefits and limitations using real-world financial applications Get to know the best practices to incorporate new Big Data machine learning in your data-driven enterprise and gain future scalability and maintainability Who This Book Is For This Learning Path is for engineers and scientists who are familiar with Scala and want to learn how to create, validate, and apply machine learning algorithms. It will also benefit software developers with a background in Scala programming who want to apply machine learning. What You Will Learn Create Scala web applications that couple with JavaScript libraries such as D3 to create compelling interactive visualizations Deploy scalable parallel applications using Apache Spark, loading data from HDFS or Hive Solve big data problems with Scala parallel collections, Akka actors, and Apache Spark clusters Apply key learning strategies to perform technical analysis of financial markets Understand the principles of supervised and unsupervised learning in machine learning Work with unstructured data and serialize it using Kryo, Protobuf, Avro, and AvroParquet Construct reliable and robust data pipelines and manage data in a data-driven enterprise Implement scalable model monitoring and alerts with Scala In Detail This Learning Path aims to put the entire world of machine learning with Scala in fron

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烊萌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值