正则化与过拟合(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上进行验证,找到你认为最好的那个选择。

结束。。。

如何应用ML的建议-下的更多相关文章

  1. 如何应用ML的建议-上

    本博资料来自andrew ng的13年的ML视频中10_X._Advice_for_Applying_Machine_Learning. 遇到问题-部分(一) 错误统计-部分(二) 正确的选取数据集- ...

  2. [ML] I'm back for Machine Learning

    Hi, Long time no see. Briefly, I plan to step into this new area, data analysis. In the past few yea ...

  3. ML面试1000题系列(91-100)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 91 简单说说RNN的原理?我们升学到高三准备高 ...

  4. Linux下栈溢出导致的core dump

    1 问题产生 前两天在干活的时候,写好的一个daemon程序,一跑就core,连main函数都进不去.从来没见过这阵势的职场新人被吓尿了,幸好不是在生产环境上测试.找来同事帮忙,看了好久也没看出问题, ...

  5. python安装MySQLdb:在windows下或linux下(以及eclipse中pydev使用msqldb的配置方法)

    写的非常好,可以解决问题: windows下:http://blog.csdn.net/wklken/article/details/7253245 linux下:http://blog.csdn.n ...

  6. AI繁荣下的隐忧——Google Tensorflow安全风险剖析

    本文由云+社区发表 作者:[ Tencent Blade Team ] Cradmin 我们身处一个巨变的时代,各种新技术层出不穷,人工智能作为一个诞生于上世纪50年代的概念,近两年出现井喷式发展,得 ...

  7. python MySQLdb在windows环境下的快速安装

    python MySQLdb在windows环境下的快速安装.问题解决方式 使用python访问mysql,需要一系列安装 linux下MySQLdb安装见 Python MySQLdb在Linux下 ...

  8. windows 环境下安装python MySQLdb

    使用Python访问MySQL,需要一系列安装 Linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://blog.csdn.NET/wklken/arti ...

  9. 117、python MySQLdb在windows环境下的快速安装、问题解决方式

    使用Python访问MySQL,需要一系列安装 Linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://blog.csdn.NET/wklken/arti ...

随机推荐

  1. pygame编组(精灵组)Group中的常用方法介绍

    说明: 1.以下所用的Group均为Group类的对象实例 2.Group类是对AbstractGroup类的继承 sprite.py文档中描述如下: class Group(AbstractGrou ...

  2. 洛谷P3987 我永远喜欢珂朵莉~(set 树状数组)

    题意 题目链接 Sol 不会卡常,自愧不如.下面的代码只有66分.我实在懒得手写平衡树了.. 思路比较直观:拿个set维护每个数出现的位置,再写个线段树维护区间和 #include<bits/s ...

  3. Echarts简单案例

    官网: http://echarts.baidu.com/index.html 文档:  http://echarts.baidu.com/echarts2/doc/doc.html <html ...

  4. Kafka初入门简单配置与使用

    一 Kafka概述 1.1 Kafka是什么 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 1)Apache Kafka是一个开源消息系统,由Scala写成. ...

  5. Visualforce简介

    Visualforce Visualforce是一个和Apex语言相匹配的开发框架.开发者可以使用Visualforce和Apex建立自定义网络应用程序. Visualforce的基本功能类似于前端框 ...

  6. “由于无法验证发行者,所以WINDOWS已经阻止此软件”的解决方法

    Vista 和 Windows7 系统都很注重系统的安全性,在提高安全性的同时,也给我们某些应用带来不便,例如需要安装插件或证书,可能会弹出“由于无法验证发行者,所以WINDOWS已经阻止此软件”的相 ...

  7. loadrunner 脚本开发-文件读写操作

    脚本开发-文件读写操作 by:授客 QQ:1033553122 函数说明 函数原型: size_t fwrite( const void *buffer, size_t size, size_t co ...

  8. etcd raft如何实现Linearizable Read

    Linearizable Read通俗来讲,就是读请求需要读到最新的已经commit的数据,不会读到老数据. 对于使用raft协议来保证多副本强一致的系统中,读写请求都可以通过走一次raft协议来满足 ...

  9. Linux (Fedora 28) 如何查看 CPU 温度

    机器突然负载有点高,查看CPU 温度的方法: 1.yum install lm_sensors; 2.sensors-detect 3.sensors   这些需要机器具备相应的设备,如果在虚拟机运行 ...

  10. shell基本语法记录

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个 ...