7、 正则化(Regularization)

7、 正则化(Regularization)7.1过拟合的问题到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fittin

大家好,又见面了,我是你们的朋友全栈君。

7.1 过拟合的问题

  到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fitting)的问题,可能会导致它们效果很差。

  在这段视频中,我将为你解释什么是过度拟合问题,并且在此之后接下来的几个视频中,我们将谈论一种称为正则化(regularization)的技术,它可以改善或者减少过度拟合问题

如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为0),但是可能会不能推广到新的数据。

下图是一个回归问题的例子:

 <span role="heading" aria-level="2">7、 正则化(Regularization)

第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。

分类问题中也存在这样的问题:

<span role="heading" aria-level="2">7、 正则化(Regularization)

就以多项式理解,x$的次数越高,拟合的越好,但相应的预测的能力就可能变差。

问题是,如果我们发现了过拟合问题,应该如何处理?

  1. 丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)

  2. 正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

7.2 代价函数

上面的回归问题中如果我们的模型是: 

<span role="heading" aria-level="2">7、 正则化(Regularization)

  我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0的话,我们就能很好的拟合了。

  所以我们要做的就是在一定程度上减小这些参数θ 的值,这就是正则化的基本方法。我们决定要减少θ3和θ4的大小,我们要做的便是修改代价函数,在其中θ3和θ4设置一点惩罚。这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的θ3和θ4。 修改后的代价函数如下:

<span role="heading" aria-level="2">7、 正则化(Regularization)

通过这样的代价函数选择出的θ3和θ4 对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:

<span role="heading" aria-level="2">7、 正则化(Regularization)

其中?称为正则化参数(Regularization Parameter)。 注:根据惯例,我们不对?0   进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:

<span role="heading" aria-level="2">7、 正则化(Regularization)

  如果选择的正则化参数λ大,则会把所有的参数都最小化了,导致模型变成 hθ(x)=θ0,也就是上图中红色直线所示的情况,造成欠拟合。

   那为什么增加的一项<span role="heading" aria-level="2">7、 正则化(Regularization)可以使θ的值减小呢?

   因为如果我们令  ?   的值很大的话,为了使Cost Function 尽可能的小,所有的θ 的值(不包括θ0)都会在一定程度上减小。 但若? 的值太大了,那么θ 的值(不包括θ0)都会趋近于0,这样我们所得到的只能是一条平行于x轴的直线。 所以对于正则化,我们要取一个合理的  ?  的值,这样才能更好的应用正则化。 回顾一下代价函数,为了使用正则化,让我们把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。

 7.3 正则化线性回归

对于线性回归的求解,我们之前推导了两种学习算法:一种基于梯度下降,一种基于正规方程。

正则化线性回归的代价函数为:

<span role="heading" aria-level="2">7、 正则化(Regularization)

如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对进行正则化,所以梯度下降算法将分两种情形:

<span role="heading" aria-level="2">7、 正则化(Regularization)

 

 

 对上面的算法中? = 1,2, . . . , ?  时的更新式子进行调整可得:

<span role="heading" aria-level="2">7、 正则化(Regularization)

 

 

 可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令?值减少了一个额外的值。

我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示:

<span role="heading" aria-level="2">7、 正则化(Regularization)

 

 

 图中的矩阵尺寸为 (n+1)*(n+1)。

7.4 正则化的逻辑回归模型

  针对逻辑回归问题,我们在之前的课程已经学习过两种优化算法:我们首先学习了使用梯度下降法来优化代价函数?(?),接下来学习了更高级的优化算法,这些高级优化算法需要你自己设计代价函数?(?)。

<span role="heading" aria-level="2">7、 正则化(Regularization)

 

 自己计算导数同样对于逻辑回归,我们也给代价函数增加一个正则化的表达式,得到代价函数:

<span role="heading" aria-level="2">7、 正则化(Regularization)

 

 python代码:

 1 import numpy as np 
 2 def costReg(theta, X, y, learningRate): 3 theta = np.matrix(theta) 4 X = np.matrix(X) 5 y = np.matrix(y) 6 first = np.multiply(-y, np.log(sigmoid(X*theta.T))) 7 second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T))) 8 reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:the 9 ta.shape[1]],2)) 10 return np.sum(first - second) / (len(X)) + reg 

要最小化该代价函数,通过求导,得出梯度下降算法为:

<span role="heading" aria-level="2">7、 正则化(Regularization)

注:看上去同线性回归一样,但是知道 hθ(x)=g(θTX),所以与线性回归不同。

 Octave 中,我们依旧可以用 fminuc 函数来求解代价函数最小化的参数,值得注意的是参数θ0的更新规则与其他情况不同。 注意:

  1. 虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但由于两者的hθ(x)不同所以还是有很大差别。

  2. θ0不参与其中的任何一个正则化。

  目前大家对机器学习算法可能还只是略懂,但是一旦你精通了线性回归、高级优化算法和正则化技术,坦率地说,你对机器学习的理解可能已经比许多工程师深入了。现在,你已经有了丰富的机器学习知识,目测比那些硅谷工程师还厉害,或者用机器学习算法来做产品。

  接下来的课程中,我们将学习一个非常强大的非线性分类器,无论是线性回归问题,还是逻辑回归问题,都可以构造多项式来解决。你将逐渐发现还有更强大的非线性分类器,可以用来解决多项式回归问题。我们接下来将将学会,比现在解决问题的方法强大N倍的学习算法。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154380.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android Studio入门到精通[通俗易懂]

    Android Studio入门到精通[通俗易懂]PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!目标:AndroidStudio新手–>下载安装配置–>零基础入门–>基本使用–>调试技能–>构建项目基础–>使用AS应对常规应用开发AS简介经过2年时间的研发,Google终于正式发布了面向Android开发者的集成开发环境AndroidStudio1.2(稳定

    2022年6月5日
    40
  • 时滞系统matlab仿真_时滞模型的matlab编程

    时滞系统matlab仿真_时滞模型的matlab编程ddesd求解带有常规时滞的时滞微分方程(DDE)语法sol=ddesd(ddefun,delays,history,tspan)sol=ddesd(ddefun,delays,history,tspan,options)参数ddefun用于对微分方程y′(t)=f(t,y(t),y(d(1),…,y(d(k)))的右侧进行计算的函数句柄。此函数必须为以下形式:dydt=…

    2022年9月1日
    3
  • pycharm如何打开原来的项目_terminal怎么打开

    pycharm如何打开原来的项目_terminal怎么打开Pycharm的下方工具栏中有两个窗口:PythonConsole和Terminal(如下图)其中,PythonConsole叫做Python控制台,即Python交互模式;Terminal叫做终端,即命令行模式。Python交互模式主要有两种:CPython用>>>作为提示符,而IPython用In[序号]:作为提示符。Python交互式模式可以直接输入代码,然后执行,并立刻得到结果,因此Python交互模式主要是为了调试Python代码用的。命..

    2022年8月28日
    4
  • Git拉取代码报密码错误「建议收藏」

    Git拉取代码报密码错误「建议收藏」刚刚Git拉取代码,显示密码错误。我就奇怪了,密码输入了好几次,还是错误。但是马上得提交了,又很着急 ,将最简单的处理 方法忘记了。冷静下来,细细分析。刚学习时好像遇到过此类问题,于是直接删除凭证,再次拉取,正常。真的越着急越乱,遇到问题还是要冷静分析。…

    2022年6月13日
    36
  • netstat和netstat -ano

    netstat和netstat -ano(1)在命令行窗口中输入netstat后应该怎能读呢?本机地址为10.1.127.144,本机的52051端口正在和IP地址为183.192.164.67的8864端口进行通信,而且通信使用的是TCP协议(本机使用52021端口,对方使用8864端口)(2)在命令行中输入netstat-ano可以看出多了PID这一列(表示是PID为这个数的程序正在占用某个端口和外部某台机器的某个端口进行通信)所以netstat-ano比netstat能显示更多的信息,是升级版本,plus版本

    2022年10月21日
    2
  • Win7如何分享局域网并设置共享文件夹账户和密码

    Win7如何分享局域网并设置共享文件夹账户和密码

    2021年10月9日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号