码迷,mamicode.com
首页 > 移动开发 > 详细

Coursera机器学习-第六周-Advice for Applying Machine Learning

时间:2016-06-01 09:16:52      阅读:491      评论:0      收藏:0      [点我收藏+]

标签:

Evaluating a Learning Algorithm


Desciding What to Try Next

先来看一个有正则的线性回归例子:

技术分享

当在预测时,有很大的误差,该如何处理?

技术分享

1.得到更多的训练样本
2.选取少量的特征
3.得到更多的特征项
4.加入特征多项式
5.减少正则项系数λ
6.增加正则项系数λ

很多人,在遇到预测结果并不理想的时候,会凭着感觉在上面的6个方案中选取一个进行,但是往往花费了大量时间却得不到改进。

于是引入了机器学习诊断,在后面会详细阐述,

技术分享


Evaluating a Hypothesis

怎样用你学过的算法来评估假设函数 ,讨论如何避免 过拟合和欠拟合的问题。
对于这个简单的例子,我们可以对假设函数hθ(x) 进行画图 ,然后观察图形趋势, 但对于特征变量不止一个的这种一般情况 ,还有像有很多特征变量的问题 想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现。因此, 我们需要另一种方法来评估我们的假设函数 。

技术分享

如下,给出了一种评估假设函数的标准方法:

技术分享

将这些数据集分为两个部分:Training set 和 Test set, 即是 训练集和测试集,
其中一种典型的分割方法是, 按照7:3的比例 ,将70%的数据作为训练集, 30%的数据作为测试集 。

PS:如果数据集是有顺序的话,那么最好还是随机取样。比如说上图的例子中,如果price或者size是按递增或者递减排列的话,那么就应该随机取样本,而不是将前70%作为训练集,后30%作为测试集了。

接下来 这里展示了一种典型的方法,你可以按照这些步骤训练和测试你的学习算法 比如线性回归算法 。首先 ,你需要对训练集进行学习得到参数θ, 具体来讲就是最小化训练误差J(θ) ,这里的J(θ) 是使用那70%数据 来定义得到的,也就是仅仅是训练数据 。接下来,你要计算出测试误差,用Jtest(θ)来表示测试误差, 那么你要做的就是 取出你之前从训练集(Training set)中学习得到的参数θ放在这里, 来计算你的测试误差 Jtest(θ)

技术分享

Jtest(θ)分为Linear Regreesion与Logistic Regression:

Linear Regreesion error:
技术分享

Logistic Regression error:
技术分享


Model Selection and Train/Validation/Test sets

假如你想要确定对于某组数据, 最合适的多项式次数是几次 ?怎样选用正确的特征来构造学习算法 或者假如你需要正确选择 学习算法中的正则化参数λ ,你应该怎样做呢?

Model Selection:
技术分享

1.首先,建立d个model 假设(图中有10个,d表示其id),分别在training set 上求使其training error最小的θ向量,那么得到d个θ

2.然后,对这d个model假设,带入θ,在cross validation set上计算JCV,即cv set error最小的一个model 作为 hypothesis,如下图中|J(CV)|在第4组中最小,便取d=4的假设。

PS: 其实d表示dimension,也就是维度,表示该hypothesis的最大polynomial项是d维的。
PS’: 一般地,|J(CV)|是大于等于|J(train)|的,| * |表示数量

选择第一个模型(d=1), 然后求训练误差的最小值Jtrain(θ(1)) 这样你就会得到 一个参数向量θ(1) 然后你再选择第二个模型(d=2) 二次函数模型 ,进行同样的过程 这样你会得到另一个参数向量 θ(2),以此类推,直到第十个模型(d=10),十次函数模型,训练误差最小值Jtrain(θ(10))

接下来,我们需要做的是对所有这些模型,求出测试集误差(Test Error),依次求出Jtest(θ(1))~Jtest(θ(10))中选取测试集误差最小的作为多项式模型。

技术分享

这里选择的是五项式。那么问题来了,现在我想知道这个模型能不能很好地推广到新样本,我们还能通过测试集来验证一般性吗?这看起来似乎有点不合理,因为我们刚才是通过测试集跟假设拟合来得到多项式次数d这个参数,也就是说我们选择了一个能够最好地拟合测试集的参数d的值,因此,我们的参数向量θ(5)在拟合测试集时的结果,很可能导致一个比实际泛化误差更完美的预测结果,也就是说泛化能力不足!

所以,为了解决这个问题,在模型选择中,我们将数据集不仅仅是分为训练集,测试集,而是分为训练集,交叉验证集和测试集{60%,20%,20%}的比例

技术分享

一种典型的分割比例是 将60%的数据分给训练集,大约20%的数据给交叉验证集 ,最后20%给测试集。这个比例可以稍微调整,但这种分法是最典型的。

技术分享
按照上面所述的步骤,这里不再赘述! (详情在上面Model Selection下面有解释)


Bias vs. Variance

当你运行一个学习算法时 ,如果这个算法的表现不理想, 那么多半是出现 两种情况 :要么是偏差比较大, 要么是方差比较大, 换句话说, 出现的情况要么是欠拟合, 要么是过拟合问题 。
那么这两种情况, 哪个和偏差有关, 哪个和方差有关, 或者是不是和两个都有关 。搞清楚这一点非常重要 ,因为能判断出现的情况, 是这两种情况中的哪一种, 其实是一个很有效的指示器, 指引着可以改进算法的 ,最有效的方法和途径 。

1. bias指hypothesis与正确的hypothesis(如果有的话)的偏差.
2. varience是指各样本与hypothesis的偏差和


Diagnosing Bias vs. Variance

先来看一个总体概括:
高偏差(欠拟合) —-High bias(underfit)
平衡(正好)—Just right
高方差(过拟合)—-High variance(overfit)
技术分享

从下图,横轴表示多项式的次数d,纵轴表示误差error,我们可以看出,当d很小时,也就是处于underfit状态时,Jtrain(θ)JCV(θ)差不多大小,随着d增大,JCV(θ)远远大于 Jtrain(θ),也即是overfit状态(泛化能力不足)
技术分享

这里就产生了bias和variance的概念:


bias:Jtrain(θ)大,JCV(θ)大,Jtrain(θ)JCV(θ),bias产生于d小,underfit阶段;
variance:Jtrain(θ)小,JCV(θ)大,Jtrain(θ)<< JCV(θ),variance产生于d大,overfit阶段;

假设你的学习算法表现的不尽如人意,没有达到你的期望,如何来判定它是一个偏差(bias)的问题还是方差(variance)的问题?我们可以计算他们的训练集误差和交叉验证集误差,如果它们落入了上图的“头部”区域,可以判断是偏差(欠拟合)问题,如果落入了“尾部”区域,可以判断是方差(过拟合)问题,如下图所示:

技术分享


Regularization and Bias/Variance

算法正则化可以有效地防止过拟合 ,但正则化跟算法的偏差和方差 又有什么关系呢?
如何选择正则项参数λ

对于数据集,我们仍将它划为3份:训练集,验证集,测试集。对于给定的正则化模型,例如上面的例子,我们按 λ 从小到大的顺序依次取数,然后在训练集上学习模型参数,在交叉验证集上计算验证集误差,并选择误差最小的模型, 也就是选择 ,最后再在测试集上评估假设:

技术分享

偏差/方差可以作为正则化参数 λ 的函数,与上一小节相似,我们也可以画出这个函数图,这样我们就能评估 λ合适的选择范围了:

技术分享

曲线的左端对应的是高方差问题 ,此时我们的 λ 值取得很小很小, 因此我们会对数据过度拟合, 所以由于过拟合的原因, 交叉验证集误差也会很大,当我们改变正则化参数 λ 的值时, 交叉验证集误差和训练集误差随之发生的变化, 当然 ,在中间取的某个 λ 的值 ,表现得刚好合适 ,这种情况下表现最好 ,交叉验证集误差或者测试集误差都很小
能使交叉验证集误差最小的那个点, 然后选出那个与之对应的参数 λ 的值。


Learning Curves

这节主要讲的是学习曲线的绘制,通过它来判断学习算法是否处于偏差方差问题或者两者都有。

技术分享

考虑假设函数与样本m的关系:

技术分享

以二次项多项式回归为例,如果仅有一个训练样本,那么模型很容易和样本点拟合,训练集误差近似为0,几乎可以忽略不计,而验证集误差可能会很大;如果有两个样本点,模型也很容易拟合样本点,训练集误差会略大一点,验证集误差可能会小一些;以此类推,当样本点比较多时,模型虽然不能拟合所有的样本点,但是泛化能力会更好一些,因此训练集误差会更大一点,而验证集误差会更小一些。
技术分享
而当我的训练集越来越大的时候, 你不难发现 要保证使用二次函数 的拟合效果依然很好 就显得越来越困难了。因此 ,事实上随着训练集容量的增大, 我们不难发现 我们的平均训练误差 是逐渐增大的。 因此,如果你画出这条曲线 ,你就会发现 训练集误差 ,也就是对假设进行预测的误差平均值随着m的增大而增大。

以下通过学习曲线来考虑高偏差和高方差的问题。对于高偏差欠拟合问题:

技术分享
不难发现,不管样本数量如何增加, 这条直线也基本不会变化太大, 因为这条直线是对这组数据最可能也是最接近的拟合,但一条直线再怎么接近 ,也不可能对这组数据进行很好的拟合。

而对于高方差过拟合问题:
技术分享
增大样本数目后,模型的泛化能力会好一些,一些是高方差过拟合问题的学习曲线:
技术分享

如果我们要考虑增大训练集的样本数,也就是在这幅图中向右延伸曲线,我们大致可以看出这两条学习曲线 ,蓝色和红色的两条曲线 正在相互靠近。 因此 ,如果我们将曲线 向右延伸出去 ,那么似乎训练集误差很可能会逐渐增大,而交叉验证集误差则会持续下降。 当然我们最关心的还是交叉验证集误差 或者测试集误差 。对吧 ,所以从这幅图中 ,我们基本可以预测如果继续增大训练样本的数量 ,将曲线向右延伸 交叉验证集误差将会 逐渐下降 。所以,在高方差的情形中,使用更多的训练集数据对改进算法的表现,事实上是有效果的 。


Deciding What to Do Next Revisited

技术分享

  1. 获取更多的训练样本 - 解决高方差

  2. 尝试使用更少的特征的集合 - 解决高方差

  3. 尝试获得其他特征 - 解决高偏差

  4. 尝试添加多项组合特征 - 解决高偏差

  5. 尝试减小 λ -解决高偏差

  6. 尝试增加 λ-解决高方差

    技术分享

    当你在进行神经网络拟合的时候, 如果你要进行神经网络的拟合 比如说 一个相对比较简单的神经网络模型 。相对来讲 ,它的隐藏单元比较少 ,甚至只有一个隐藏单元 。如果你要进行神经网络的拟合, 其中一个选择是 ,选用一个相对简单的网络结构 ,比如说只有一个 隐藏层 或者可能相对来讲, 比较少的隐藏单元。 因此像这样的一个简单的神经网络 ,参数就不会很多 ,很容易出现欠拟合 。
    这种比较小型的神经网络 ,其最大优势在于计算量较小 。

与之相对的另一种情况 :是相对较大型的神经网络结构, 要么隐藏层单元比较多 比如这一层中的隐藏单元数就很多, 要么隐藏层比较多 。因此这种比较复杂的神经网络 ,参数一般较多, 也更容易出现过拟合 。这种结构的一大劣势, 也许不是主要的 但还是需要考虑: 那就是当网络中的 神经元数量很多的时候, 这种结构会显得 计算量较大 。

最后,你还需要选择 隐藏层的层数,你是应该用一个 隐藏层呢?还是应该用三个呢 ?就像我们这里画的,或者还是用两个隐藏层呢?
默认的情况是,使用一个隐藏层,但是如果你确实想要选择 多个隐藏层,你也可以试试 把数据分割为训练集、验证集 、和测试集。然后使用交叉验证的方法比较一个隐藏层的神经网络 ,然后试试两个 ,三个隐藏层 ,以此类推, 然后看看哪个神经网络在交叉验证集上表现得最理想。

参考:
Coursera机器学习
Coursera公开课笔记
Stanford机器学习—第六讲. 怎样选择机器学习方法、系统

Coursera机器学习-第六周-Advice for Applying Machine Learning

标签:

原文地址:http://blog.csdn.net/dingchenxixi/article/details/51479003

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!