[Python嗯~机器学习]---如何调试一个简单的机器学习算法?

调试一个机器学习算法

在机器学习中,我们学习了最简单的模型以及构建方式,那么怎么调试来使得我们的算法更有效呢?

从房价预测讲起~~~


上图中我们可以看出代价函数可以分成两部分

我们暂时这么想,前一部分表示模型拟合能力(取决于高阶项次数),后一项表示摩西复杂度(通过 λ 来表
示对模型参数的惩罚能力)。

如何来调整这些参数呢?这时候要引出过拟合和欠拟合的问题。

上图中,如果只有房价和面积,那么我们就可以画出假设函数图形来人为观察过拟合或者欠拟合。但是,
如果有多个特征,比如100个特征,那么我们就很难画出来人眼可以判断的图像。

这时候,我们需要引入一个评判假设函数的方法。

把样本随机分成两部分,训练集和测试集,按照一定的比例。
思路:通过训练集代价函数最小化得到的参数 θ 能不能使训练集的代价函数值接近训练集。
步骤:
1、通过训练集损失函数最小化得出我们的假设函数的参数 θ 。
2、把训练得到的 θ 代入测试集中得出对应的损失函数的的结果。
3、比较两个数据集中的损失函数。

同样的逻辑回归我们用错分率:

这是我们判断一个机器学习模型是不是有效的最基本的思路。
把数据集分成两部分,一部分用来得到 θ,另一部分用来验证 θ 是不是有效。

在这个思路的基础上,我们就要想,我们的假设函数有很多的特征,也可以构建复杂的多项式项。那么,我
们怎么选择合适的特征和多项式?

比如上图中,多项式只有低次项的假设函数会欠拟合,太多的高阶项会造成过拟合。

具体来讲,如上图中,我们对于一个模型的假设函数给出了十个式子,不同的十阶多项式,那么我们用
度来衡量假设函数的阶次。通过不同阶次的假设函数我们有不同的代价函数,得出十组不同的 θ。

这时候使用不同的 θ 代入到测试集中的对应的假设函数计算出不同各自的代价函数值。代价函数最小的
高阶参数模型就是最好的假设函数模型。

这时候,又有一个问题出现了,我们用不同训练集来通过代价函数得到各自的 θ,通过测试集来得到假设
函数的阶次。这就很可能是对泛化误差的乐观估计。就是说这么做实际上就是不认为有新的样本,那么我
们要怎么衡量泛化能力呢?

这时候我们要把数据集分成三部分,训练集,测试集和交叉验证集

用训练集来得出不同高阶项次的假设函数的 θ 集合,用交叉验证集来得到代价函数最小的高阶项假设函数。
用测试集来衡量模型泛化能力。

bias和variance问题:

高bias会欠拟合,高variance会过拟合。


上图中,我们的 d 表示多项式的阶次,d 越小的时候只有低阶项,我们训练集和交叉验证集的误差都很大,就说明
欠拟合,高bias。随着高阶项增多,我们的训练集误差就会不断下降,就说明拟合的越来越好,但是交叉验证集在
某一点开始逐渐的误差增大,就说明从某一点开始模型对新的未知点的拟合能力开始下降,就是说没有很好的泛化
能力,就是高variance的过拟合问题。


通俗来讲,如果训练误差跟验证误差基本一致但是都很高,就是高bias问题,欠拟合。如果训练误差很小,验证
误差很大,就是高variance过拟合

正则化:


通俗来说,正则化项就是控制参数对模型影响程度的参数。偏置项不考虑到其中,因为 x0 永远等于 1 。
λ 越大,通过梯度下降就会使得其对应的 θ 越小,该参数影响越弱。

那么,我们怎么选择合适的 λ 呢?

不同的 λ 会产生不同损失函数结果,λ 越小的时候拟合参数影响越大,拟合程度越高,可能会过拟合,随着 λ 的增大
拟合程度就会逐渐降低,当很大的时候就会欠拟合。这时候如图中交叉验证集中代价函数最小的点就是我们需要的 λ
对应的点。

学习曲线:

学习曲线是一个很好的用于判断一个学习算法是否处于bias或者variance问题的工具。

前提:

一般我们可以线绘制训练集误差,也就是J train。使用的自变量或者横轴是训练集的样本数m。比如我们的训练集
有 100个样本,我们这里要做的是限制自己使用的样本数,比如 10个,20个,30个,40个,然后绘制出训练集误
差,以及交叉验证集误差J cv。

假设我们只有一个训练样本,比如第一幅图中的这种情况,假如我们使用二次函数作为模型来拟合。那么由于我们
只有一个训练样本,拟合出的效果会非常好,我们的训练误差一定会是0 。而如果有两个训练样本的话,二次函数
也可以拟合得很好,即使使用了正则化,我们大概率也会拟合出很好的结果。而如果我们有三个训练样本的话,看
起来依然能够很好地用二次函数来拟合。也就是说m=1, m=2, m=3,在训练集上得到的误差都将是0或者接近于0 。

所以,我们到现在已经看到,当样本量很少时,训练误差也会很小。那么现在,如果m=4,二次方程似乎也可以很
好地对数据进行拟合,那么继续看 m=5的情况,这时候再使用二次函数来拟合,好像效果有所下降了,不过仍然不
算坏。而当我们的训练集合变得越来越大,我们的训练误差也会变得越来越大,上图左下角。

总之,当样本量很少的时候,模型可以很容易地拟合到很好,所以训练误差也会很小,而反过来如果训练样本很多的
话,那么相对每一个训练样本都拟合到很好,就显得很困难了,所以训练误差就会变得越来越大。

那么,交叉验证集误差 Jcv又是怎样的情况呢?
实际上,交叉验证误差,是对完全陌生的交叉验证集的样本进行预测得到的误差,当训练集很小的时候,泛化能力不
会很好,也就是不太能很好地对新的样本进行预测,比如我们右侧的前几幅图。只有当训练集更大的时候,我们才可
能得到一个更好拟合数据的可能的假设。因此,交叉验证集误差一开始会很大,很可能会随着训练集不断增大而变得
越来越小,这是因为拥有了更多数据,就拥有了更强的泛化能力,也就是对新样本数据的预测能力。

所以,如果我们绘制Jtrain和Jcv,大概就是上图左的样子。

接下来,我们来看看如果学习算法陷入高bias或者高variance问题时,学习曲线又会是怎样。

高bias:

如果我们的假设是高bias的问题,比如我们右上角的这个数据集,如果使用一个线性函数来拟合它,我们的假设函数
将无法很好的拟合这些数据,出现了所谓的欠拟合情况,表现为在训练集上的误差都很大。
那么如果我们增加训练样本会出现什么情况呢?
我们不难想象,[右下角蓝直线]线性假设仍然不能很好地拟合我们地样本。因为我们假设函数的性质没有变,无论如何
它都是线性的。
所以,如果我们绘制出交叉验证集的误差,只有一个样本,表现很不好,而随着我们增大训练样本集,当达到某个值的
时候,我们就会找到那条最能拟合这组数据的直线,那么此后再怎么增加训练样本也不会有什么改观了,因为我们基本
上还是会得到一条差不多的直线。因此,交叉验证集误差将会很快变得水平而不再变化。
训练集误差又是怎样呢?
训练误差一开始会很小,而在高bias的情况下,我们会发现训练集误差会逐渐增大,一直接近于交叉验证集误差。因为
只有这么点参数,而当m很大时,也就是训练数据很多时,这时假设函数或者模型,在训练集和交叉验证集上的预测效
果几乎就没什么差异。

结论:如果学习算法出现了高bias的问题,那么增加训练样本是无济于事的。

高variance:

如果我们的训练样本很少的话,[右上图]只有五个训练样本,而如果我们使用一百次方的多项式特征来拟合这组数据,
而且我们把 λ 设置的很小,那么显然,我们将会对这些数据完美拟合,所以这个假设函数对这个问题出现了过拟合的
问题。所以,训练样本很少时,我们的训练误差J train将会很小,而随着训练集样本增多,可能这个假设函数对数据
或多或少有一点过拟合,所以随着样本量的增加,我们会发现J train会随之增大,因为当训练样本越多的时候,我们
就越难对训练集数据更好地拟合,但总的来说训练集误差还是比较小的。

交叉验证集误差呢?其实,在高variance的情况下,假设函数对数据过拟合,因此交叉验证误差将会一直都很大。

结论:算法如果处于高variance的情况下,最明显的特征就是,训练误差和交叉验证误差之间存在很大的差距。

所以通过观察这个学习曲线的图,如果我们增加训练样本的话,我们可以预期,这两条学习曲线会逐渐的相互靠近。那
么如果我们不断地向右延伸,那么训练误差将会继续增大,而交叉验证集误差将会持续下降。当然,我们最关心的还是
交叉验证集误差。

结论:对于高variance情况,增加训练样本将对学习算法的改进具有积极的意义。

对操作进行总结


1、使用更多的训练集数据。这种方法对于高variance的情况,是有帮助的。这也就是说,如果我们的模型不是处于高
variance的情况,那么增加更多的训练样本不会有什么显著的帮助。判断高variance的情况就是训练误差较小,但交叉
验证误差比较大。

2、使用更少的特征,同样是对高variance有效。更过的特征意味更复杂的模型,减少特征就是降低模型复杂度。

3、增加更多额外的特。增加特征一般都是解决高bias问题。特征越多,模拟更复杂,拟合能力就越强。

4、调节正则化因子λ,这种方法尝试起来相较前几种更加方便,不至于花费太久的时间。不过减小λ,我们已经知道是
对高bias问题是一种解决办法;而增加λ则是可以解决高variance。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值