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

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机器学习—第六讲. 怎样选择机器学习方法、系统

时间: 2024-10-21 05:17:48

Coursera机器学习-第六周-Advice for Applying Machine Learning的相关文章

Advice for Applying Machine Learning &amp; Machine Learning System Design----- Stanford Machine Learning(by Andrew NG)Course Notes

Adviceforapplyingmachinelearning Deciding what to try next 现在我们已学习了线性回归.逻辑回归.神经网络等机器学习算法,接下来我们要做的是高效地利用这些算法去解决实际问题,尽量不要把时间浪费在没有多大意义的尝试上,Advice for applying machine learning & Machinelearning system design 这两课介绍的就是在设计机器学习系统的时候,我们该怎么做? 假设我们实现了一个正则化的线性回

Machine Learning - X. Advice for Applying Machine Learning (Week 6)

http://blog.csdn.net/pipisorry/article/details/44119187 机器学习Machine Learning - Andrew NG courses学习笔记 Advice for Applying Machine Learning对应用机器学习的建议 Deciding What to Try Next决定接下来尝试什么 Evaluating a Hypothesis假设评估 Model Selection and Train_Validation_Te

斯坦福第十课:应用机器学习的建议(Advice for Applying Machine Learning)

10.1  决定下一步做什么 10.2  评估一个假设 10.3  模型选择和交叉验证集 10.4  诊断偏差和方差 10.5  归一化和偏差/方差 10.6  学习曲线 10.7  决定下一步做什么 10.1  决定下一步做什么 到目前为止,我们已经介绍了许多不同的学习算法,如果你一直跟着这些视频的进度学习,你会发现自己已经不知不觉地成为一个了解许多先进机器学习技术的专家了. 然而,在懂机器学习的人当中依然存在着很大的差距,一部分人确实掌握了怎样高效有力地运用这些学习算法.而另一些人他们可能对

斯坦福大学公开课机器学习:advice for applying machine learning - deciding what to try next(设计机器学习系统时,怎样确定最适合、最正确的方法)

假如我们在开发一个机器学习系统,想试着改进一个机器学习系统的性能,我们应该如何决定接下来应该选择哪条道路? 为了解释这一问题,以预测房价的学习例子.假如我们已经得到学习参数以后,要将我们的假设函数放到一组新的房屋样本上进行测试,这个时候我们会发现在预测房价时,产生了巨大的误差,现在我们的问题是要想改进这个算法接下来应该怎么办? 实际上我们可以想出很多种方法来改进算法的性能,其中一种办法是使用更多的训练样本.具体来讲,通过电话调查.上门调查,获取更多的不同的房屋出售数据.遗憾的是,好多人花费了大量

斯坦福机器学习视频笔记 Week6 关于机器学习的建议 Advice for Applying Machine Learning

我们将学习如何系统地提升机器学习算法,告诉你学习算法何时做得不好,并描述如何'调试'你的学习算法和提高其性能的"最佳实践".要优化机器学习算法,需要先了解可以在哪里做最大的改进. 我们将讨论如何理解具有多个部分的机器学习系统的性能,以及如何处理偏斜数据. Evaluating a Hypothesis 设想当你训练的模型对预测数据有很大偏差的时候,接下来你会选择怎么做? 这个需要花时间去实现,但是对你的帮助也会很大,使你不盲目的做一些决定来提升算法,而是直观地看出哪些是对提升算法是有效

斯坦福大学公开课机器学习: advice for applying machine learning | regularization and bais/variance(机器学习中方差和偏差如何相互影响、以及和算法的正则化之间的相互关系)

算法正则化可以有效地防止过拟合, 但正则化跟算法的偏差和方差又有什么关系呢?下面主要讨论一下方差和偏差两者之间是如何相互影响的.以及和算法的正则化之间的相互关系 假如我们要对高阶的多项式进行拟合,为了防止过拟合现象,我们要使用图下所示的正则化.因此我们试图通过下面的正则化项,来让参数的值尽可能小.正则化项的求和范围,照例取为j等于1到m,而非j等于0到m. 然后我们来分析以下三种情形.第一种情形:正则化参数lambda取一个比较大的值(比如lambda的值取为10000甚至更大).在这种情况下,

斯坦福大学公开课机器学习:advice for applying machine learning | learning curves (改进学习算法:高偏差和高方差与学习曲线的关系)

绘制学习曲线非常有用,比如你想检查你的学习算法,运行是否正常.或者你希望改进算法的表现或效果.那么学习曲线就是一种很好的工具.学习曲线可以判断某一个学习算法,是偏差.方差问题,或是二者皆有. 为了绘制一条学习曲线,通常先绘制出训练集数据的平均误差平方和(Jtrain),或者交叉验证集数据的平均误差平方和(Jcv).将其绘制成一个关于参数m的函数.也就是一个关于训练集.样本总数的函数.m一般是一个常数,比如m等于100,表示100组训练样本.但我们要自己取一些m的值,也就是说对m的取值做一点限制,

机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)

在<机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)>一文中,我们讨论了如何用逻辑回归解决二分类问题以及逻辑回归算法的本质.现在来看一下多分类的情况. 现实中相对于二分类问题,我们更常遇到的是多分类问题.多分类问题如何求解呢?有两种方式.一种是方式是修改原有模型,另一种方式是将多分类问题拆分成一个个二分类问题解决. 先来看一下第一种方式:修改原有模型.即:把二分类逻辑回归模型变为多分类逻辑回归模型. (二分类逻辑回归称为binary

Coursera机器学习-第三周-逻辑回归Logistic Regression

Classification and Representation 1. Classification Linear Regression (线性回归)考虑的是连续值([0,1]之间的数)的问题,而Logistic Regression(逻辑回归)考虑的是离散值(例如只能取0或1而不能取0到1之间的数)的问题.举个例子,你需要根据以往季度的电力数据,预测下一季度的电力数据,这个时候需要使用的是线性回归,因为这个值是连续的,而不是离散的.而当你需要判断这个人抽烟还是不抽烟的问题时,就需要使用逻辑回