Sweety

Practice makes perfect

导航

评价一个学习算法(斯坦福machine learning week 6)

Posted on 2017-11-15 19:14  蓝空  阅读(189)  评论(0编辑  收藏  举报

1. 评价一个学习算法

1.1 如何少走弯路?

这里写图片描述

1.2 机器学习诊断法引入

1.2.1 背景

当我们确定学习算法的参数的时候,我们考虑的是选择参量来使训练误差最小化。有人认为,得到一个非常小的训练误差一定是一件好事,但我们已经知道,仅仅是因为这个假设具有很小的训练误差并不能说明它就一定是一个好的假设函数,而且我们也学习了过拟合假设函数的例子。所以这推广到新的训练集上是不适用的。

那么,你该如何判断一个假设函数是过拟合的呢?对于这个简单的例子,我们可以对假设函数h(x)h(x)进行画图,但对于特征变量不止一个的这种一般情况,想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现的。
因此我们需要另一种方法来评估我们的假设函数。

1.2.2 评估假设函数方法

如果我们有这样一组数据组
这里写图片描述

为了确保我们可以评估我们的假设函数,我们要做的是将这些数据进行三七分
第一部分(70%)将成为我们的训练集(Training Set)
第二部分(30%)将成为我们的测试集(Test Set)

这里要注意的是:
如果说我们的数据是有某种规律的话,那么我们按照7:3的比例取数据时,应该是随机选取的。

这里写图片描述

1.2.3 具体模型评估方法

  1. 线性回归
    这里写图片描述

  2. 逻辑回归
    这里写图片描述

具体如下:
这里写图片描述

1.3 多项式模型的选择以及训练集/验证集/测试集的划分

1.3.1 本小节主要内容

  • 假如你想要确定对于某组数据最合适的多项式次数是几次,怎样选用正确的特征来构造学习算法,这些问题我们称之为”模型选择问题“。

  • 在我们对于这一问题的讨论中,我们还将提到如何将数据分为三组:也就是训练集验证集测试集,而不仅仅是前面提到的两组数据。

1.3.2 求解思路

多项式模型的选择思路:

  1. 用相同的方式得到第10个模型的向量θ。用测试集来分别求一次模型训练后得到的参数向量为θ(1),二次模型训练后得到的参数向量为θ(2),依次类推,十次模型训练后得到的参数向量为θ(10)
  2. 接下来,我们要做的是对所有这些模型求出测试集误差。因此,我们可以算出每一个模型的Jtest(θ(1))Jtest(θ(2))Jtest(θ(3))Jtest(θ(10))
  3. 接下来为了确定哪一个模型最好,我们可以找出测试集误差最小的模型。

下面说下为什么引入验证集?
由于我们使用的是测试结果集来衡量的代价函数,从而得到多项式次数dd这个参数的值为5,所以这样任然不能公平地说明这个假设可以推广到一般情况。
也就是说我们选择了一个能最好地拟合测试集的参数dd的值,因此我们的参数向量θ(5)在拟合测试集时的结果很可能导致一个比实际泛化误差更完美的预测结果。(因为我们找到的是一个最能拟合测试集的参数d)。因此我们再用测试集来评价我们的假设就显得不公平了。
而我们其实更关心的是对新样本的拟合效果,所以我们之前说到的如果我们用训练集来拟合参数θ0,θ1等参数时,拟合后的模型在作用于训练集上的效果是不能预测出我们将这个假设推广到新样板上时效果如何的。这是因为这些参数能够很好地拟合训练集,因此它们很有可能在对训练集的预测中表现的很好,但对其他的新样本来说就不一定那么好了。

1.3.3 求解正统方法

引入验证集的概念后:
给定某个数据集,这里我们要将其分为三段:训练集、交叉验证集(cross validation set)、测试集。
这里写图片描述
一种典型的分割比例是:训练集60%,交叉验证集20%,测试集20%。(这个比例可稍作调整),这里m是训练集个数,mcv是交叉验证集个数,mtest是测试集个数。

我们可以得到 训练集/交叉验证集/测试集 的误差:
这里写图片描述
这里我们的第三步就可以选择模型并评测模型了,我们现在要使用交叉验证集来选择合适的模型

1.3.4 模型选择及泛化误差评估

总结模型选择和误差评测步骤:

  • 通过使用训练集对每一个假设函数依次去求最小化的代价函数minJ(θ),并求得对应的参数向量θ(d)

  • 然后我们要做的是在交叉验证集中测试这些假设的表现,测出Jcv来看看这些假设在交叉验证集中表现如何。

  • 然后我们要选择交叉验证集误差最小的那个假设模型,假如这个模型是Jcv(θ(4))对应的那个模型,因此我们就选择这个四次多项式模型:

    θ0+θ1x1++θ4x4

    我们得到了拟合出最好的系数d=4。

这个过程中,我们没有使用测试集进行拟合,这样我们就回避了测试集的嫌疑。这样我们就可以光明正大的使用测试集来估计所选模型的泛化误差了。

1.3.5 小总结

总结下三个数据集的作用分别为:
训练集:计算待选择模型参数向量;
验证集:作为数据集,选择误差最小的模型,作为最终的模型;
测试机:对模型进行误差评估。

2. 偏差VS方差(bias VS. variance)

2.1 偏差 VS 方差

首先解释偏差和方差:
偏差:是相对于训练集来说的,也就是训练集误差(如下Training error)
方差:相对于测试集来说的,也就是测试集误差(如下Cross Validation error)
这里写图片描述

这里写图片描述

这里写图片描述

高偏差:underfitting(欠拟合),对应的是高方差和高偏差
高方差:overfitting(过拟合) ,对应的是低偏差和高方差
这里写图片描述

2.2 正则化和偏差/方差

2.2.1介绍

这里写图片描述

首先明白正则化参数λ对假设函数的影响,这个在第一章中的线性回归的正则化里面已经说过了,这里虽然可以在J(θ)里面添加正则项,但是在其他的几个误差中不将他添加进来(如上图片所示)(这里是为什么呢?

2.2.2 选择一个正确的λ

通常做法是选取一系列我想要尝试的λ值。因此首先我可能考虑不使用正则化的情形,以及一系列我可能会试的值,比如说我可能从0.01,0.02,0.04开始,一直试下去,通常我会将步长设为2倍的速度增长,直到一个比较大的值。
这里写图片描述

我可以从第一个模型开始,然后是第二个模型,对每一个不同的正这化参数λλ进行拟合,然后用交叉验证集来评价每一个模型:
这里写图片描述

然后测出每一个参数θ在交叉验证集上的评价误差平方和,然后我就选取这12个模型中交叉验证集误差最小的那个模型作为最终选择。

对于本例而言,假如说最终我选择了θ(5),因为此时的交叉验证集误差最小,做完这些最后,如果我想看看该模型在测试集上的表现,我可以用经过学习得到的模型θ(5)来测出它对测试集的预测效果是如何。(再次重申,这里我们依然使用交叉验证集来拟合模型,这也是为什么我之前预留了一部分数据作为测试集的原因。)
其实本小结内容,就是1.3.4步骤2里说的“通过验证集选择模型”的具体衡量指标,也就是通过bias&variance来验证

2.3.3 模型选择步骤

到目前为止,模型的选择步骤为:

  • Create a list of lambdas (i.e. λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24});
  • Create a set of models with different degrees or any other variants.
  • Iterate through the λs and for each λ go through all the models to learn some Θ.
  • Compute the cross validation error using the learned Θ (computed with λ) on the JCV(Θ) without regularization or λ = 0.
  • Select the best combo that produces the lowest error on the cross validation set.
  • Using the best combo Θ and λ, apply it on Jtest(Θ) to see if it has a good generalization of the problem.

2.3.4 小结

NG“说”:

当然由于我在这里画的图显得太卡通,也太理想化了,对于真实的数据,你得到的曲线可能比这个看起来更凌乱,会有很多的噪声,对某个实际的数据集,你或多或少能看出像这样一个趋势。通过绘出这条曲线,通过交叉验证集误差的变化趋势,你可以用自己选择出,或者编写程序自动得出能使交叉验证集误差最小的那个点,然后选出那个与之对应的参数λλ的值。

当我在尝试为学习算法选择正则化参数λ的时候,我通常都会画出像这样一个图,帮助我更好地理解各种情况,同时也帮助我确认我选择的正则化参数值到底好不好

博主“说”(“老子说”):

到现在看来可能上面出现了太多方法,一时间有点混乱,让我们来捋一捋
首先,我们最原来的目标就是为了确定我们的模型,说白了就是如何选择这个θ集合,因为这个参数维数过少(比如只有θ0,也就是一条平行于x轴的直线),就会出现underfitting,θ过多则会overfitting;
如何选择θ集合的值?通过之前说的正则化,也就是在J(θ)后面增加的λ2mmj=1θ2j,这样通过正则化的方式就可以修改θ,避免出现过拟和欠拟合;
但是在最后增加的一项里面有参数 λ,这个 λ的选择直接影响到对θ修改效果,因此问题又转变成了如何选择λ方法是通过分析bias&variance来考量模型选择效果
但是如何通过bias&variance这两个参数来衡量模型呢虽然上面已经说出了其规律,但是究竟怎么选?答案是通过绘制曲线的方式来确定,如下图:
现在整体逻辑是不是很清晰了?
不过,在下一节视频中我要做的是基于我们已经介绍过的所有这些概念,将它们结合起来,建立我们的诊断法。也称为学习曲线这种方法通常被用来诊断一个学习算法到底是处于偏差问题还是方差问题,还是两者都有。(貌似这才是正统的画图方式,这样应该借助的不是正则化项来避免高方差,好像上面图的没有很好的解决高偏差和数据集不足的问题?这里有点乱,之后在捋一捋!!!
这里写图片描述

2.4 学习曲线(Learning Curves)

绘制学习曲线非常有用,也许你想检查你的学习算法运行是否正常,或者你希望改进算法的表现或效果,那么学习曲线就是一种很好的工具。
我经常使用学习曲线来判断某一个学习算法是否处于偏差方差问题,或者二者皆有(会出现这种情况吗?)。

下面再看一下之前说的Jtrain(θ)(也就是训练集数据的平均误差平方和),Jcv(θ)(也就是交叉验证集数据的平均误差平方和)。
这里写图片描述

我要将其绘制成一个关于参数m的函数(也就是一个关于训练集样本总数的函数)。
要自己取一些m的值,比如说我取10,20,30或者40组训练集,然后绘制出训练集误差,以及交叉验证集误差。

假设我使用二次函数来拟合模型:

hθ(x)=θ0+θ1x+θ2x2

2.4.1正常情况下的曲线

验证集误差和测试集误差都会随着训练集样本容量m的增加而减小,因为你是用的数据越多,你能获得的泛化能力就越强,或者说对新样本的适应能力就越强。因此数据越多,越能拟合出合适的假设。
所以如果你把Jtrain(θ)和Jcv(θ)绘制出来,就应该得到这样的曲线:
这里写图片描述

2.4.2 高偏差下的学习曲线

训练误差一开始也是很小的,而在高偏差的情形中,你会发现训练集误差会逐渐增大,一直趋于接近交叉验证集误差,这是因为你的参数很少。但当m很大的时候,数据太多,此时训练集和交叉验证集的预测结果将会非常接近:
这里写图片描述
高偏差的情形反映出的问题是交叉验证集和训练集误差都很大,也就是说,你最终会得到一个值比较大的Jcv(θ)和Jtrain(θ)。
这里写图片描述
如果学习算法正处于高偏差的情形,那么选用更多的训练集数据对于改善算法表现无益。

2.4.3 高方差下的学习曲线

假设函数对数据过拟合,因此交叉验证集误差将会一直都很大,即便我们选择一个比较合适恰当的训练集样本数:
这里写图片描述

这里写图片描述

2.4.4 三种情形小结

以上画出的学习曲线都是相当理想化的形式,针对一个实际的学习算法,如果你画出学习曲线的话,你会看到基本类似的结果。虽然有的时候数据会带有一点噪声或干扰的曲线,但总的来说像这样画出学习曲线确实能帮助你来看清你的学习算法是否处于高偏差、高方差、或者二者皆有的情形。

PS:题目
这里写图片描述

2.5 重新审视决定下一步做什么

2.5.1问题以及解决策略

如果模型没有很好的达到预测的效果,根据之前就提出了一些解决方案:

  • 通过使用更多的训练样本
  • 尝试选用更少的特征集
  • 尝试选用更多的特征集
  • 也可以尝试增加多项式特征的方法(x21,x22,x1x2,etc.)
  • 通过增大正则化参数λ
  • 通过减小正则化参数λ

使用这些方法对应的出现的问题如下:
这里写图片描述

2.5.2 重新回到神经网络

NG“说”

事实上,如果你经常应用神经网络,特别是大型神经网络的话,你就会发现越大型的网络性能越好,但如果发生了过拟合,你可以使用正则化的方法来修正过拟合。

一般来说,使用一个大型的神经网络并使用正则化来修正过拟合问题,通常比使用一个小型的神经网络效果更好。但主要问题可能出现在计算量相对较大。

最后,你还要选择隐藏层的层数,你是该用一个隐藏层呢,还是用三个呢?通常来说,默认的情况是使用一个隐藏层。但是如果你确实想要选择多个隐藏层你也可以试试把数据分割为训练集、验证集和测试集,然后使用交叉验证的方法比较一个隐藏层的神经网络然后试试两个三个隐藏层以此类推,然后看看哪个神经网络在交叉验证集上表现得最理想,然后你对每一个模型都用交叉验证集数据进行测试,算出三种情况下(隐藏层分别为一层、两层、三层)的交叉验证集误差Jcv(θ),然后选出你认为最好的神经网络结构。