机器学习(四)

如何改进机器学习系统的性能

以预测房价为例,假设你已经完成了正则化线性回归,也就是最小化代价函数J的值。在得到学习参数后,如果你将假设函数放到一组新的房屋样本上进行测试,假如说你发现在预测房价时,产生了巨大的误差,现在你的问题是想要改进这个算法需要怎么办?

  • 获得更多的训练样本。(fixes high variance)
  • 尝试选用更少的特征。(fixes high variance)
  • 尝试获取更多的特征。(fixes high bias)
  • 增加多项式(比如 x 1 2 , x 2 2 , x 1 x 2 , e t c x_1^2,x_2^2,x_1x_2,etc x12,x22,x1x2,etc)(fixes high bias)
  • 减小正则化参数 λ \lambda λ的值(fixes high bias)
  • 增大正则化参数 λ \lambda λ的值(fixes high variance)

如何评价你的算法学习得到的假设

如何判断算法出现了过拟合:画出假设函数h(x)然后观察,但如果特征向量很多,则不好画图观察,此时需要另一种评价假设函数的方法。

  • 评价假设函数的方法如下:将数据集分为两部分,第一部分划为训练集,第二部分将会成为我们的测试集。 其中一种典型的分割方法是按照7:3的比例,将70%的数据划为训练集,将30%的数据划为测试集,用m表示训练样本的总数,而m_test表示测试集样本的总数。

    数据集的排序最好是随机的。
    典型方法来训练和测试你的训练算法,比如线性回归算法。
    首先需要对训练集进行学习得到参数 θ \theta θ,具体来讲就是最小化训练误差J( θ \theta θ),这里的代价函数是由那70%的数据集组成的训练集来定义得到的。
    然后用在训练集得到的 θ \theta θ放到测试集来计算你的测试误差:
    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_{i =1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2 Jtest(θ)=2mtest1i=1mtest(hθ(xtest(i))ytest(i))2

    使用的是逻辑回归的话,误差计算式如下:
    J t e s t ( θ ) = − 1 m t e s t ∑ i = 1 m t e s t y t e s t ( i ) log ⁡ h θ ( x t e s t ( i ) ) + ( 1 − y t e s t ( i ) ) log ⁡ h θ ( x t e s t ( i ) ) J_{test}(\theta)=-\frac{1}{m_{test}}\sum_{i=1}^{m_test}y_{test}^{(i)}\log h_\theta(x_{test}^{(i)})+(1-y_{test}^{(i)})\log h_\theta(x_{test}^{(i)}) Jtest(θ)=mtest1i=1mtestytest(i)loghθ(xtest(i))+(1ytest(i))loghθ(xtest(i))

  • 还有另一种形式的测试度量,可能更易于理解,叫做错误分类,也被称为0/1分类错误,0/1表示了你预测的分类是正确或错误的情况。
    e r r ( h θ ( x ) , y ) = { 0        o t h e r w i s e 1        i f    h θ ( x ) ≥ 0.5        y = 0        o r    i f    h θ ( x ) < 0.5      y = 1 err(h_\theta(x),y) = \{_{0 \;\;\; {otherwise}}^{1\;\;\; if\; h_\theta(x)\geq0.5 \;\;\;y=0\;\;\;or\;if\;h_\theta(x)<0.5\;\;y=1} err(hθ(x),y)={0otherwise1ifhθ(x)0.5y=0orifhθ(x)<0.5y=1
    T e s t    e r r o r = 1 m t e s t ∑ i = 1 m t e s t e r r ( h θ ( x t e s t ( i ) ) , y t e s t ( i ) ) Test\;error = \frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_\theta(x_{test}^{(i)}),y_{test}^{(i)}) Testerror=mtest1i=1mtesterr(hθ(xtest(i)),ytest(i))

机器学习诊断法

你通过执行这种测试,能够了解算法到底哪里出了问题。这通常也能告诉你,想要改进一种算法的效果,知道什么样的改进才是有意义的。
诊断法能让你提前发现一些方式是无效的。

模型选择问题

确定对于一个数据集合最合适的多项式次数怎样选用正确的特征来构造学习算法。
或者确定学习算法中的正则化参数 λ \lambda λ
对于这类问题不是讨论如何把数据分为训练集和测试集,而是如何将数据分为三个数据组,也就是训练集,验证集和测试集。

  • 用训练集选出 θ \theta θ ,用交叉验证集选出最合适的多项式模型,用测试集来衡量或估计算法选出的模型的泛化误差。
    将数据分为三部分,训练集,交叉验证集和测试集。同样地我们可以将误差定义为交叉验证误差和测试误差。
    • 训练误差: J t r a i n ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J_{train}(\theta) = \frac {1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 Jtrain(θ)=2m1i=1m(hθ(x(i))y(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_{i=1}^{m_{cv}}(h_\theta(x_{cv}^{(i)})-y_{cv}^{(i)})^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_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2 Jtest(θ)=2mtest1i=1mtest(hθ(xtest(i))ytest(i))2

诊断偏差与方差

Bias(underfit)
Variance(overfit)

在这里插入图片描述

  • 图片中,左边的一端对应的是高偏差的问题,也就是你使用了一个过于小的多项式次数,而事实上你需要一个较高的多项式次数来拟合数据。
    • 如果你的算法有偏差问题的话,训练集误差将会比较大。同时你会发现你的交叉验证集误差也会很大,很接近训练误差,也许会比训练误差稍微大一些,
  • 右边的一端对应的是高方差问题,也就是多项式次数d对我们的数据来讲太大了。
    • 如果你的算法有方差问题的话,我们会发现训练误差很小,而交叉验证集误差会远大于训练集误差。
      2
  • 正则化是如何影响偏差和方差的
    如图所示,如果选择的 λ \lambda λ过大,则容易造成高偏差方差,即欠拟合;如果选择的 λ \lambda λ过小,则容易造成高偏差,即过拟合。
    1
  • 诊断一个学习算法是存在偏差问题还是方差问题,还是两者都有?
    验证集误差和测试集合误差都会随着训练集样本容量m的增加而减小。
    交叉验证集误差将会很快变为水平不再变化,只要达到或超过一定数量的训练样本, 这样你会得到最能拟合数据的那条线。训练误差一开始很小,而在高偏差的情形中,你会发现训练集误差会逐渐增大,最后接近交叉验证误差,这是因为你的参数很少,又有很多数据。当m很大的时候,训练集和交叉验证集的误差将会非常接近。
    • 如果一个学习算法具有高偏差,随着我们增加训练样本,我们发现交叉验证误差不会明显的下降了,基本变成平的了。所以如果学习算法正处于高偏差的情形,那么选用更多的训练集对于改善算法表现无益。
    • 知道算法是否处于高偏差的情形是一件很有用的事情,可以避免把时间浪费在收集更多的训练数据上,因为再多的数据也没有意义。
      在这里插入图片描述
  • 在高方差情形中,当训练样本越多的时候,就越难把训练集数据拟合得很好,但总的来说,训练集的误差还是很小,在高方差情形中,假设函数对数据过拟合,因此交叉验证误差将会一直都很大,即便我们选择一个中等大小的训练集数量。
    • 在高方差中,最明显的一个特征就是在训练误差和交叉验证误差之间有一段很大的差距。而且,在高方差情形中增大训练集数量是有用的。
    • 知道算法是否处于高方差的情形是一件很有用的事情,可以让你知道有必要花时间增加更多的训练集数据。在这里插入图片描述

应该优先处理哪些事情

误差分析能够帮你更系统地在众多方法中作出选择。可以手动地去检查算法所出现的失误。

  • 如果你准备从事研发机器学习产品,或者开发机器学习应用,通常来说最好的办法不是建立一个很复杂的,有许多复杂特征的系统,而是通过一个简单的算法,来快速地实现它。然后通过交叉验证来测试它,做完之后就能画出相应的学习曲线,通过画出学习曲线以及检验误差来找出你的算法是否存在高偏差或者高方差问题或者一些其他问题。在做出这些分析之后再来决定是否使用更多的数据或更多特征等问题。我们应当用实际的证据来指导我们的决策,来决定我们应当把时间话到哪里而不是凭直觉。
  • 关于误差分析,当实现比如一个垃圾邮件分类器的时候,我会经常观察交叉验证集的情况,然后看一看那些被算法错误分类的文件,通过查看这些被错误分类的垃圾邮件和非垃圾邮件,有什么共同的特征和规律,或许能从中获得启发,应该设计怎样的新特征,或是告诉你现在的系统有什么优点和缺点,然后指导你想出办法来改进它。

偏斜类

偏斜类是指一个类中的样本数与另一个类的数据相比多很多。
当遇到偏斜类时候,我们希望有不同的误差度量值或者不同的评估度量值。

  • 其中一种评估度量值,叫做查准率和召回率。假设有一个二分问题,我们的学习算法要做的是做出值的预测,并且学习算法会为每一个测试集中的实例做出预测,预测值也是等于0或1,结果分为真阳性(预测真实际真)、假阳性(预测真实际假)、真阴性、假阴性四种。
    • 查准率 = 真阳性/预测为阳性
    • 召回率 = 真阳性/(真阳+假阴)
  • 对于大多数的回归模型,你得权衡查准率和召回率,当你改变临界值的值时,你可以画出曲线来权衡查准率和召回率。
    在这里插入图片描述
    左上角的点意味着高查准率,低召回率;右下角的点意味着低查准率,高召回率。(注意查准率召回率曲线的形状有很多种,这取决于回归模型的具体算法。)
  • 自动选取临界值的算法:
    P代表查准率precision,R代表召回率Recall
    • 有一种结合查准率和召回率方式,被称为F值,公式如下
      F 1    S c o r e : 2 P R P + R F_1\;Score: 2\frac{PR}{P+R} F1Score:2P+RPR(除了这个公式之外还有很多种)

支持向量机

与logistic回归和神经网络相比,支持向量机,或称SVM,在学习复杂的非线性方程时,能够提供一种更为清晰和更加强大的方式。
此算法属于监督学习算法。

  • 当你最小化这个函数,就得到了SVM学习得到的参数,与logistic回归不同的是支持向量机并不会输出概率。相对我们得到的是通过优化这个代价函数,得到一个参数 θ \theta θ,而支持向量机所做的,它进行了一个直接的预测,预测y=1还是y=0。
    • h θ ( x ) { 0        o t h e r w i s e 1        θ T x ≥ 0 h_\theta(x)\{_{0\;\;\;otherwise}^{1\;\;\; \theta^Tx \geq0} hθ(x){0otherwise1θTx0
  • 大间距分类器

支持向量机在分离数据时会尽量用大的间距去分离,因此支持向量机有时被称为大间距分类器。
如图中黑线所示。

在这里插入图片描述

  • 当你只是用大间距分类器的时候,这时你的学习算法对异常点会很敏感。 在实际中,当你使用支持向量机时,当C不是非常大的时候,它可以忽略一些异常点,来得到正确的结果,甚至当数据不是线性可分的时候,支持向量机也能做得很好。
  • 大间距分类器背后的原理:
    设有两个向量u,v,则 u T v u^Tv uTv称为向量u和v的内积。
    ||u||表示向量u的欧几里得长度。
    计算 u T v u^Tv uTv:将向量v投影到向量u上,投影长度为p,则内积的值为p ∗ * ||u||
    • 注意:两个向量之间的内积也可以是负值(当两个向量的夹角大于90°时)。
      后续省略…

核函数

即相似度函数,我们可以有不同的相似度度量的函数。
下面给的例子为高斯核函数。
用来训练非线性边界。

在这里插入图片描述

  • 下图说明,这些特征做的是衡量x到标记l的相似度,如果x非常接近标记,那么特征f非常接近于1;如果x和标记l非常远,那么特征f非常接近于0。在这里插入图片描述
    上式中, σ 2 \sigma^2 σ2越大,等高线图越宽,特征下降的速度越慢。
  • 可以将核函数这个想法用于定义特征向量,将标记点之类的技术用于逻辑回归算法,但是用于支持向量机的计算技巧不能较好的推广到其他算法诸如逻辑回归上,所以将核函数用于逻辑回归时,会变得非常的慢。相比之下,这些计算技巧,比如具体化技术,对这些细节的修改,以及支持向量软件的实现细节,使得支持向量机可以和核函数相得益彰,而逻辑回归和核函数则运行得十分缓慢,更何况它们还不能使用那么高级优化技巧。因为这些技巧是人们专门为使用核函数得支持向量机开发的。
  • 在使用支持向量机时如何选择参数:
    • 其中要选择优化目标中的参数C,回想一下,C的作用与 1 λ \frac{1}{\lambda} λ1相似, λ \lambda λ是逻辑回归算法中的正则化参数,所以大的C对应着我们以前在逻辑回归问题中小的 λ \lambda λ,这意味着不使用正则化,如果这么做可能得到一个低偏差但高方差的模型,倾向过拟合;如果使用了较小的C,这对应着在逻辑回归问题中大的 λ \lambda λ,对应着一个高偏差但是低方差的模型,倾向欠拟合。
    • 另外还要选择高斯核函数中的 σ 2 \sigma^2 σ2,如果它的值偏大的时候,那么对应的相似度函数倾向于变得相对平滑,且变化得比较平缓,倾向于有高偏差,低方差;如果它得值偏小,那么相似度函数会变化得很剧烈,特征的变化会变得不平滑,会有较大的斜率和较大的导数,在这种情况下最终得到的模型会是低偏差和高方差。
    • 有很多好用的软件库,比如liblinear和libsvm。
    • 不带内核参数的SVM叫做线性内核函数;目前为止高斯核函数和线性核函数是两个最常用的核函数。
    • 注意:如果你有大小不一样的特征变量,很重要的一件事就是,在使用高斯函数之前,将这些特征变量的大小按比例归一化。
    • 注意:不是所有你可能提出来的相似函数都是有效的核函数,高斯核函数和线性核函数以及你有时可能会用到的核函数,这些函数都需要满足一个技术条件,它叫做默塞尔定理,需要满足这个条件的原因是,因为支持向量机算法或者SVM的实现函数有许多熟练的 数值优化技巧。为了有效地求解参数 θ \theta θ,在最初的设想里,这些决策都用以将我们的注意力仅仅限制在可以满足默塞尔定理的核函数上。
      这个定理所做的是,确保所有的SVM软件包能够用大类的优化方法从而迅速得到参数 θ \theta θ。 其他核函数中有多项式核函数,字符串核函数,卡方核函数,直方相交核函数等等。
  • 假设有4个类别或者说是更一般的k个类别,输出在多个类别间恰当的判定边界,很多SVM的包已经内置了多分类的函数。因此如果你使用一个类似于这样的一个模式,你只是用了这样的函数,且应该会工作得很好。
  • 除此之外,一个做多分类的方法是使用one-vs-all方法,之前讲逻辑回归的时候讨论过,所以你要做的就是训练KSVM,如果你有K个类别,用以将每个类别从其他的类别中区分开来,这个会给你K参数的向量。
  • 假设n为特征数量,m为样本数量。
    • 如果n相对于m足够大的话通常所做的就是使用逻辑回归或者用不带核函数的svm,使用线性核函数。(因为如果你有许多的特征变量而有相对较小的训练集,线性函数可能会工作得很好,而且你也没有足够的数据来拟合非常复杂的非线性函数)。
    • 如果n较小,m大小适中,那么线性核函数的SVM会工作得很好。
    • 如果n很小,m很大,这种情况下高斯核函数的运算速度会很慢,现在的SVM包,如果你使用带有高斯核函数的,可能还可以使用。如果m非常非常大,用高斯核函数会很慢,这种情况下我经常做的是手动地创建拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。
  • 事实证明,SVM具有的优化问题,是一种凸优化问题。好的SVM优化软件包,总是会找到全局最小值,或者接近它的值,你不需要担心局部最优。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值