吴恩达机器学习笔记---应用机器学习的建议_ML0209的博客-程序员宝宝

技术标签: 机器学习  人工智能  

前言

 1.决定下一步要做什么(Deciding What to Try Next)
 2.评估假设(Evaluating a Hypothesis)
 3.模型选择和交叉验证集(Model Selection and Train_Validation)
 4.诊断偏差和方差(Diagnosing Bias vs. Variance)
 5.正则化和偏差/方差(Regularization and Bias_Variance)
 6.学习曲线(Learning Curves)
 7.决定下一步做什么(Deciding What to Do Next Revisited)

应用机器学习的建议

(一)决定下一步要做什么(Deciding What to Try Next)

  之前我们学习过许多机器学习的算法了,也在具体的问题中实现了这些算法。但是,如果我们在解决实际问题的时候,发现我们的模型预测和实际结果有很大的误差,我们想改进这个算法,我们应该怎么做 ?具体的我们有以下方法:

  • 获得更多的训练样本(通常是有效的,但代价较大,可考虑先采用下面的几种方法)

  • 尝试减少特征的数量

  • 尝试获得更多的特征

  • 尝试增加多项式特征

  • 尝试减少正则化程度 λ \lambda λ

  • 尝试增加正则化程度 λ \lambda λ

  虽然有以上方法,但我们不能凭感觉随机地选择一种,因为它可能耗费我们几个月的时间而看不到任何效果。我们运用“机器学习诊断法”来判断我们的模型有什么问题,从而选择相应的解决方法。第一步就是判断我的模型到底是好还是不好,也就是评估假设。

(二)评估假设(Evaluating a Hypothesis)

  之前我们对假设的评估主要依靠代价函数,代价函数越小,训练的误差也就越小,我们认为假设拟合数据拟合的越好。但这不是完全正确的,因为我们知道存在过拟合现象,过拟合会导致误差很小,但是模型的泛化能力很差,对于新数据的预测往往误差很大。那我们怎样判断模型是否存在过拟合现象呢?最简单的办法就是对假设函数 h ( x ) h(x) h(x)进行画图。如图:
在这里插入图片描述
  很明显,该假设存在过拟合现象。可见,画图在特征数量很少时确实可行,但是,当我们的特征数量很大时,画图就没那么容易了。因此,我们需要另一种方法来评估我们的假设函数。我们将数据分成训练集train测试集test,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。为了保证数据的随机性,我们一般会对数据进行“洗牌”,然后再分成训练集和测试集。
  我们用训练集进行参数优化,拟合出 θ \theta θ的值,然后将 θ \theta θ的值代入到代价函数中,对测试集中的数据求取误差,我们有两种方式计算误差:

  • 对于线性回归模型,我们直接利用测试集数据计算代价函数 J J J
  • 对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:
    J t e s t ( θ ) = − 1 m t e s t ∑ i = 1 m t e s t ( y ( i ) t e s t ) log ⁡ h θ ( x ( i ) t e s t ) + ( 1 − y ( i ) t e s t ) log ⁡ h θ ( x t e s t ( i ) ) J_{test}{(\theta)} = -\frac{1}{ {m}_{test}}\sum\limits_{i=1}^{m_{test}}({y^{(i)}{test}})\log{h_{\theta}(x^{(i)}{test})}+(1-{y^{(i)}{test}})\log{h_{\theta}(x^{(i)}_{test})} Jtest(θ)=mtest1i=1mtest(y(i)test)loghθ(x(i)test)+(1y(i)test)loghθ(xtest(i))

还可以利用误分类率,对于每一个测试集样本,计算:
在这里插入图片描述
然后求取平均值。如果存在过拟合,那么训练集的代价函数的值会很小,测试集的误差则会很大。

(三)模型选择和交叉验证集(Model Selection and Train_Validation)

  模型选择也是我们很关心的一个问题,最主要的就是确定特征的最高阶次,例如:
在这里插入图片描述
  越高次数的多项式模型肯定是越能适应我们的训练集数据,但不代表可以推广到更一般的情况,所以我们需要衡量到底哪种才是最好的。如何选择呢?很简单,一一实现一遍。我们把以上10个假设全部实现一遍,选择效果最好的作为最终的假设。由于我们多了确定最高次数这一步,所以我们需要对数据集进行进一步地划分:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集。具体的实现过程是这样的:

  • 使用训练集训练出10个模型,得到每个模型的最优参数 θ \theta θ

  • 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值),选取代价函数值最小的模型,也就是确定好了模型

  • 用选出的模型对测试集计算得出推广误差(代价函数的值),也就是前面说的对该假设进行评估

训练集的误差公式(得到 θ \theta θ):

J t r a i n ( θ ) = 1 2 m ∑ i = 1 m t r a i n ( h θ ( x t r a i n ( i ) ) − y t r a i n ( i ) ) 2 J_{train}(\theta)=\frac{1}{2m}\sum\limits_{i=1}^{m_{train}}(h_{\theta}(x^{(i)}_{train})-y^{(i)}_{train})^2 Jtrain(θ)=2m1i=1mtrain(hθ(xtrain(i))ytrain(i))2

交叉验证集误差(选中模型):

J c v ( θ ) = 1 2 m c v ∑ i = 1 m c v ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2 J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum\limits_{i=1}^{m_{cv}}(h_{\theta}(x^{(i)}_{cv})-y^{(i)}_{cv})^2 Jcv(θ)=2mcv1i=1mcv(hθ(xcv(i))ycv(i))2

测试集误差(评估假设):

J t e s t ( θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h θ ( x t e s t ( i ) ) − y t e s t ( i ) ) 2 J_{test}(\theta) = \frac{1}{2m_{test}}\sum\limits_{i=1}^{m_{test}}(h_{\theta}(x^{(i)}_{test})-y^{(i)}_{test})^2 Jtest(θ)=2mtest1i=1mtest(hθ(xtest(i))ytest(i))2

(四)诊断偏差和方差(Diagnosing Bias vs. Variance)

  当我们运行一个学习算法的时候,结果可能并不理想,多半是由于欠拟合和过拟合现象,它们所对应的分别是偏差较大和方差较大的问题。当运行结果不理想的时候,能够确定算法是偏差还是方差的问题是很重要的。如我们很熟悉的下图,第一个是欠拟合,对应高偏差;第三个是过拟合,对应高方差。
在这里插入图片描述
  我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析。我们知道,当假设函数的多项式的次数越高时,拟合的效果会越好,但同时会带来过拟合的问题,也就是算法的泛化能力很差,在交叉验证集上的误差往往较大。所以,我们建立一个图像,以多项式的次数为横轴,以代价函数的误差为纵轴。考虑训练集上的误差,由于次数越高,拟合效果越好,所以随着次数的增加,训练集上的误差会越来越小;考虑交叉验证集上的误差,在一开始次数增加的时候,假设函数由欠拟合逐渐改善,拟合越来越好,误差也自然降低,但是,随着次数的继续增加,过拟合现象产生,泛化能力的减弱导致误差会逐渐增大。而且,由于训练集是用来最优化参数的,所以其误差肯定是小于交叉验证集误差的,所以图像相对在下。总结起来可以用下图表示:
在这里插入图片描述
  所以,我们在判断是高偏差还是高方差的时候,用图像就可以很容易判断。当训练集误差和交叉验证集误差都很大而且相近的时候,就是高偏差;当训练集误差很小,而交叉验证集误差很大时,就是高方差。可以总结成下图,当训练集和交叉验证集的误差都较小时,对应的次数就是我们想要的。

在这里插入图片描述

(五)正则化和偏差/方差(Regularization and Bias_Variance)

  上面我们讲了偏差和方差的问题,也就是欠拟合和过拟合的问题,我们可以通过正则化的方法来防止过拟合的发生。回顾一下正则化的公式:
在这里插入图片描述
  和上面选择多项式的次数一样,正则化系数的选择也很重要,当 λ \lambda λ 的值太小,接近0的时候,相当于没有正则化,那么可能会导致过拟合,也就是高方差的问题;当 λ \lambda λ 的值太大,那么对每个模型参数的惩罚力度也就会很大,会导致所有的参数都会变得很小,接近0,那么拟合出来的就是一条横线,大小就是 θ 0 \theta_{0} θ0,这就导致了欠拟合,也就是高偏差的问题。归纳为下图:
在这里插入图片描述
  那么我们如何选择 λ \lambda λ呢?首先,我们列出一系列的待选用的 λ \lambda λ的值,比如0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5,12,10共12个;然后我们在训练集上对每个不同 λ \lambda λ所对应的代价函数进行优化,得到12个不同正则化程度的模型;我们在交叉验证集上运行每个模型,得到误差最小的那个作为我们最终的模型;最后,用我们选择的模型在测试集上计算推广误差。
在这里插入图片描述

  借鉴选择多项式次数的方法,我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ \lambda λ的值绘制在一张图表上。随着 λ \lambda λ值的不断增大,模型参数的值会越来越接近0,发生欠拟合线性,导致训练集的误差会越来越大;对于交叉验证集的误差,一开始,随着 λ \lambda λ的增大,正则化现象得到改善,模型的泛化能力得到提高,所以误差会逐渐减少,当 λ \lambda λ增大到某一值的时候,欠拟合现象会导致误差又逐渐增大,总结起来可以用下图表示,中间的 λ \lambda λ的值就是我们需要的。
在这里插入图片描述

(六)学习曲线(Learning Curves)

  学习曲线就是将训练集误差和交叉验证集误差作为训练集样本数量( m m m)的函数绘制的图表。也就是随着样本数的增加,观察训练集和交叉验证集的误差的变化。
在这里插入图片描述
  通过下面这个例子大致感受下学习曲线的含义。在这里插入图片描述
  假设我们用一个二次多项式拟合我们的数据,我们会发现最开始只有一两个样本的时候二次曲线拟合效果非常好,可以说没有误差,当样本量逐渐增加的时候,训练集的误差也会随之慢慢增加。对于交叉验证集,当只有一两个样本的时候,虽然拟合的曲线对于训练集来说很好,但是由于样本量太少,拟合的曲线泛化能力太差,交叉验证集的误差会很大,随着样本量的增加,这一现象会得到改善,误差也会逐渐减少。可以用下图总结:
在这里插入图片描述
  进一步地,我们利用学习曲线识别高偏差和高方差问题。

  • 首先是高偏差,也就是欠拟合问题。假设我们用一条直线拟合数据,不论样本量怎么增加,我们都是用直线拟合,我们会发现无论样本量怎么增加,最后训练集的误差都不会有太大的改善,也就是对于高偏差问题,增加样本量不一定有帮助。
    在这里插入图片描述
      画出的学习曲线如下,随着样本量的增加,训练集和交叉验证集的误差逐渐接近,最后趋于一个稳定值不会有太大的变化。
    在这里插入图片描述
  • 然后是高方差,也就是过拟合现象。假设我们用100次的多项式拟合数据,拟合效果会很好,随着样本量的增加,训练集的误差会缓缓增加,而交叉验证集的误差会缓缓下降。
    在这里插入图片描述
      学习曲线如下,训练集和交叉验证集的误差之间保持较大的差距,随着样本数的增加,两条曲线的差距会逐渐减小,训练集的误差会增大,而交叉验证集的误差会减小,所以增大样本数量对于高方差现象是有用的。
    在这里插入图片描述

(七)决定下一步做什么(Deciding What to Do Next Revisited)

  在最开始,我们给出了一些解决运行学习算法时出现问题的解决方法,我们没有指出每个方法对应能够解决的问题,通过上面的分析,我们对每个方法的解决对象有了认识,总结起来如下:

  • 获得更多的训练样本——解决高方差

  • 尝试减少特征的数量——解决高方差

  • 尝试获得更多的特征——解决高偏差

  • 尝试增加多项式特征——解决高偏差

  • 尝试减少正则化程度λ——解决高偏差

  • 尝试增加正则化程度λ——解决高方差

  进一步地,我们了解一下神经网络的方差和偏差。使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合问题,但计算使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合问题。但是,往往较大的神经网络有更强的能力,所以通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
  对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45604750/article/details/107875041

智能推荐

UPX脱壳总结_fawdlstty的博客-程序员宝宝_upx 脱壳

我近期研究了一下UPX壳的脱壳方法,下面给出脱壳示例:UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒【熊猫烧香】就是使用这款加密壳。现在我们一起来脱UPX壳来揭开它的神秘面纱。首先,PEiD载入含UPX壳的程序,结果如下:UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo然后用OD载入,OEP如下:

【苹果推软件】Apple IOS推送证书 如何创建CSR文件_SenderN的博客-程序员宝宝_苹果csr证书

APNS证书。本教程要求您使用Mac计算机,您可以使用有效的Apple Developer帐户。 1. Apple Open Safari浏览器,地址栏输入并打开此URL:https://developer.apple.com/mbercenter/index.action,然后使用Developer帐户登录。 选择单击证书,标识符和配置文件。 打开列表后,选择列表下的类别类。 子类出现如下:APNS-01.png然后单击右上角的+数字图标以创建证书(显示在红色箭头中)。2.根据您的需求(沙箱)或Ap

关于goland中的unsafe.sizeof() 函数详解_Lit_leaf的博客-程序员宝宝_unsafe.sizeof

切片的内存大小slice := []int{1,2,3}fmt.Println(unsafe.Sizeof(slice)) //24上面声明了一个切片,然后打印出sizeof的值为24,但是不管slice里的元素为多少,sizeof返回的数据都是24。原因:官方文档解释Sizeof takes an expression x of any type and returns the si...

ListView Item点击事件失效_maojycom的博客-程序员宝宝_listviewitem点击事件不起作用

学习android ,练习使用ListView的时候出现了一个问题,

解决联想小新笔记本电脑触摸板失灵_^sky^的博客-程序员宝宝_联想小新触摸板没反应

1、右下角搜索框中输入sbgl,打开设备管理器,如图:2、打开鼠标和其他指针设备,选择Synaptics Pointing Device并右键,卸载此设备,如图:3、勾选删除此设备的驱动程序软件,点击卸载,并重启电脑【卸载只是重置了一下】,如图:注:如果没有设备,点击查看(V) ----> 显示隐藏的设备(W),显示全部隐藏的设备,如图:————————————————版权声明:本文为CSDN博主「UserGuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上.

centos7 python3.7 ssl_centos 解决python3.7 安装时No module named _ssl_weixin_39595271的博客-程序员宝宝

centos安装python3.7时遇到如下问题,查阅知需要的openssl版本最低为1.0.2,但是centos 默认的为1.0.1,所以需要重新更新opensslimport _ssl # if we can't import it, let the error propagateImportError: No module named _ssl1、安装依赖库:yum instal...

随便推点

睿江云主机性能测试_chunlu2438的博客-程序员宝宝

睿江云主机:1核CPU,1G内存,20G 固态硬盘系统:centos7 64bit(中文版)机房:广东(5G的免费清洗)带宽:BGP IP一、查看CPU信息[[email protected] ~]# cat /proc/cpuinfoCPU型号:E5-2650v4CPU个数:1每个CP...

2018.12.24-3881-[Coci2015]Divljak_weixin_34256074的博客-程序员宝宝

算法标签:AC自动机思路:我们可以先把所有s串在AC 自动机上跑一遍,考虑如果一个串出现了,则我所能指向的所有fail节点都可以获得贡献,于是我们建出一棵fail树。接下来考虑把T串加入,自己思考我们发现如果只是单纯把我到根节点的路径权值都+1,我们可能会重复计算答案,于是就要树链合并,即按照dfs序排序后,每一只修改我和上一个点的lca到我的路径,就不会重复。有点卡空间,我的做法是l...

Js处理Form表单空提交问题_布吉_岛的博客-程序员宝宝_form submit时,表单为空

对于 Form 表单提交数据,有时候页面没有任何字段需要进行校验,但这样就会导致不填写任何数据,都可以直接保存、编辑,产生很多无用的记录,这样的体验很不好,我们需要能进行判断是否表单全局为空,如何解决这种问题 ?实现思路:首先拿到 Form 表单中的所有 input、textarea、select 的数据(一般使用:$("#xxxForm").serialize() 方式),然后因为经常载...

node.js 聊天室 android,用nodejs写的一个简单的聊天室_鹤立烟雨的博客-程序员宝宝

项目目录:image.png借鉴自:https://www.w3cschool.cn/socket/socket-ulbj2eii.htmlhtml:Socket.IO chat* { margin: 0; padding: 0; box-sizing: border-box; }body { font: 13px Helvetica, Arial; }div { background: #000...

poj1716(差分约束+SPFA)_Keep_Trying_Go的博客-程序员宝宝

题意:整数间隔[a,b],a<b,是以a开头和以b结尾的所有连续整数的集合。在包含至少两个不同整数的集合中找到每个间隔的最小元素数。思路:采用差分约束算法:当问题可以转化为形如一组 xi‑x’i<=yi 或一组 xi‑x’i>=yi ,求任一满足的可行解的问题时,可以将其转化为最短路/最长路问题。题目已经说了在包含至少两个不同整数的集合,则根据差分的思想:x[b+1]-x[a]>=2;x[i+1]-x[i]>=0&&x[i+1]-x[i]<=1

很认真的聊一聊程序员的自我修养_sinat_25233885的博客-程序员宝宝

今天逛博客园,看到了一篇推荐的文章《浅谈程序员的英语学习》,就点进去看了一下,对于文章中的观点我非常认同,英语是非常重要的,但文章站的高度还是太高,具体表述的学习方法我不是很认同,也认为不太实际,恰好之前有一篇一直没有发表到首页的文章想重新发布,今天就借此机会和大家很认真的谈一谈程序员的自我修养问题。    先介绍一下利益相关,我的背景:初中开始参加信息学与数学竞赛,大学本科软件工