zoukankan      html  css  js  c++  java
  • 如何应用ML的建议-下

     

    正则化与过拟合(highvariance)和欠拟合(highbias)的关系-部分(五)

    ML的诊断方法-部分(六)

    如何采取下一步-部分(七)



    部分(五)

    从图中可以看出,正则化项可以用来影响模型函数对数据是否过拟合,正则化项的本意是防止过拟合的,但是对于前面的lamuda的正确的选取却很重要,对于第一个坐标系来说,因为lamuda太大,导致正则化项很小,即在训练后会使得theta(1)~theta(n)都趋向于0,而只有一个参数theta(0),使得决策线(此处举例的是线,而非面)成为了一个常量函数,严重欠拟合;而对于lamuda很小的时候,相当于正则化项不存在(可以近似这么认为),那么还是依然处于过拟合状态。所以lamuda的正确的选取,对于具体的数据集来说是非常重要的,当然这是模型的属性,而非数据集的属性。

        首先,我们假设没有正则化项,先计算在train,validation和test上的错误:

    ,然后选取不同的lamuda,比如0;0.02;0.04;0.06;.......10;10.24等,通过对不同的lamuda的选取然后带入有正则化的损失函数,求出不同lamuda对应的参数theta集,

    如图,在通过有正则化项求出的theta 然后在带入没有正则化项的误差函数中,通过在train和validation上的不同表现来找到最合适的那个lamuda。蓝线表示Jtrain的变化,粉红色表示Jcv的变化,因为最初是没有lamuda的,所以在train上是处于拟合最好,也就是过拟合状态,随着lamuda的增大,开始朝着欠拟合状态发展, 而在validation上的变化显示,开始因为过拟合,所以显示高方差状态,即Jcv是很大的,在后面当lamuda很大的时候,是欠拟合状态,在validation上的表现依然是很差,所以找出那个中间项(个人考虑,那是不是不需要计算Jtrain,直接计算Jcv岂不是省事情?)其实这里只是为了说明一 个状况而已,因为在前面步骤中找到合适的lamuda然后求出相应的theta参数集,而在现实实验中,有可能第一次没有正则化项的对应的参数刚好就是理想的参数时,就不需要正则化项了,所以还是需要将Jtrain和Jcv都计算出来,然后进行相对应的比较,(即这个图是个理想图,而我们遇到的有可能只是图的一部分,所以没法确定是哪一部分,因为有可能有的参数完全不需要正则化项就能不是过拟合状态。)


    部分(六)

    对于开始说的如何对ML进行诊断,这部分给了一些答案,首先看图:

    对于样本数量m来说,当m很小的时候,比如m=1,2,3,4的时候,右上角的图可以看出,模型可以轻松的进行拟合没有任何困难,这使得Jtrain可以直接达到0的状态,但是当m越来越大的时候,模型已经不能以Jtrain=0的状态进行拟合了,这就如左边的大坐标图所示,随着m的变大,Jtrain会变得越来越大,因为数据量越多,而模型处在一个有限拟合的状态,这时候其实也可以说是欠拟合了,但是对于Jcv来说,恰恰相反,因为m很小的时候,模型中的参数学习到的原始数据中的表征信息不是很多,所以无法对外来的数据进行预测,所以模型对于新样本的预测能力很差,随着m的增大,模型的参数越来越能够表示数据中隐藏的表征的信息,也就是这个模型越来越能够代表这些数据,这时候对于外来的样本,即 测试样本来说,他的预测能力就越来越好,所以有如图Jcv的趋势所示。

    当你的模型处于欠拟合状态时:


    如图所示,假设你的模型是欠拟合的,那么Jtrain随着m的增加会呈现图中粉红色曲线的趋势,假设在平坦的部分的时候m小于5,即m=5的情况下,Jtrain已经稳定,那么再多的数据也无法将Jtrain增加(这里认为m已经考虑到所有情况的数据,而后面的数据所产生的Jtrain都在之前的范围内,所以无法增加新的误差,)即如图所示,右下角的图,m增多的情况下,样本都在模型欠拟合状态中,而且,对于图中的例子来说,这时候的直线已经是最理想的直线模型(暂时没考虑其他非直线模型的情况下,即当前模型)而这时候Jcv开始如图中所示是很大的,随着m的增大,能够很好的学习数据的表征信息来进行预测,但是当模型趋于稳定的时候,已经无法将Jcv降得更低。为什么Jtrain会等于Jcv??是因为这里的模型在对于任何数据都是这种欠拟合的状态,在过少的参数和过多的样本的情况下,模型在train集和validation上的表现都是相似的,所以他们最后会趋于相等。


    当你的模型处于过拟合状态时:


    ,这次假设你的模型是一个过拟合模型,产生的模型函数能够很好的拟合数据,对于右图中m=5 和m很大时,模型都能够很好的拟合,这时候随着m很小开始往m很大方向发展时,你发现你的Jtrain从小变大,开始有趋于平稳的趋势,而Jcv如上面欠拟合状况一样,开始很大,随着训练得到的参数的好转,能够表现更好的数据表征,但是当你数据训练结束时发现两者的差距都很大,表现在图中就是那个黑线所示,有很大的gap,而这时候,增加足够多的样本会变得有必要,会使得模型能够拟合更多的数据,如图中黑线右边部分所示,Jtrain和Jcv会趋于相交,但是最终如果增加过多的数据,那么就会如欠拟合所示会达到趋于稳定,最好相等的情况,那时候这个模型已经无法表现更多数据的表征,那么就会变得欠拟合起来。(此处考虑,那是不是不同的数据集,有着不同合适的模型,那对于真实的自然界来说,数据量无穷无尽,岂不是任何的模型最后都会趋于欠拟合状态?但是也有可能当自然状态下所有的数据的表征都能够很好的被捕捉,增加的新的自然界样本只是与之前的数据重复罢了,那么对于模型来说,并未增加新的样本。至少对于科研所使用的不同数据集来说,的确得考虑过拟合和欠拟合状态。)


    部分(七)

    现在可以回到部分(一)中的几种策略了:


    正如ng注释的一样,对于欠拟合(high bias)和过拟合(high variance)的状态,都有着不同的策略,选错了下一步该做什么,那么就无异于浪费时间。

    ng很好的在最后的时候回到了NN来进行讲解:


    这里的cheaper和expensive是相对而言的,当你面对一个数据集,选择的网络太简单,那么就是欠拟合状态,而选择的太复杂,那么就是过拟合状态,这时候最好的选择是增加正则化项来降低过拟合,而不是选择一个简单的模型(个人觉得,一个是因为模型的选择风险太大,增加一哥正则化项所付出的代价较小,)但是在选择几层隐藏层的时候,一个方法是对于hide layer = 1,2,3的情况首先在train集上进行训练得到一个theta参数集,然后用这个集在validation上进行验证,找到你认为最好的那个选择。

      结束。。。




  • 相关阅读:
    C语言运算符优先级和口诀
    跨域问题的解决方案 php
    浅谈跨域攻击及预防
    浅析Websocket--PHP
    linux下的删除目录和文件的方法
    python魔法方法
    双指针
    python常用模块
    python三大器
    对闭包的误区
  • 原文地址:https://www.cnblogs.com/shouhuxianjian/p/4529222.html
Copyright © 2011-2022 走看看