前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十一章 应用机器学习的建议

第十一章 应用机器学习的建议

作者头像
tomas家的小拨浪鼓
发布2019-03-15 16:41:31
4070
发布2019-03-15 16:41:31
举报
文章被收录于专栏:木木玲木木玲

该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。

本章含盖

  • 11.1 决定下一步做什么
  • 11.2 评估假设
  • 11.3 模型选择和训练、验证、测试集
  • 11.4 诊断偏差与方差
  • 11.5 正则化和偏差、方差
  • 11.6 学习曲线
  • 11.7 决定接下来做什么

决定下一步做什么

当你发现,你的假设函数在新的数据集上有很大的偏差时,你可以尝试做些什么了?

  1. 获取更多的训练样本
  2. 尝试使用更少的特征集(?,防止过拟合)
  3. 尝试使用更多的特征
  4. 尝试增加多项式特征
  1. 尝试减小 λ(正则化参数)
  2. 尝试增大 λ(正则化参数)

?的方法,一般都是需要花费比较长的时间(如,6个月)才能看到改正后的效果到底是好的,还是坏的。也就是,你选择的方法是对,的还是错的。

通过“机器学习性能评估”和“机器学习诊断”能快速过滤掉至少一半(上面)的无用选项

机器学习诊断

诊断:这是一种测试法。你通过执行这种测试,能够了解算法在哪里出了问题。这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试才是有意义的。 这些诊断的执行和实现是需要花些时间的。确实需要花很多时间来理解和实现。但这样做的确是把时间用在了刀刃上。因为诊断法能让你节省几个月的时间,提早发现某些方式是无效的。

11.2 评估假设

过拟合:

怎么样判断一个“假设函数”是否过拟合了? 1,如果特性参数很少的话,可以通过将假设函数画出来,来判断是否过拟合。 2,当特征参数很多时,就无法通过画图(因为很难或者根本无法画出这样的图)来判断假设函数是否过拟合。那么,我们就需要使用其他方法了。

评估“假设函数”的标准方法:

为了确保我们可以评估我们的假设函数,我们要做的是,将我们的训练样本分成两份。第一部分成为我们的训练集;第二部分成为我们的测试集。 将所有的数据分成:训练集和测试集。其中一种典型的分割方法是,按照 7 :3 的比例。70% 为训练集;30% 为测试集。

注意,因为?我们选择了前70%的数据为训练集,后30%的数据为测试集。因此如果这组数据有某种规则或顺序的话,那么最好是随机选择70%和30%的数据。(即,保证“训练集”和“测试集”的随机性和一致性)

  • ?展示了一种典型的方法,来训练和测试你的学习算法。比如,线性回归算法

首先,你需要对训练集进行学习得到参数 θ 。具体来讲,就是最小化训练误差J(θ)。 接下来,计算测试误差。我们将从训练集中学习得到的参数 θ,放在J_test(θ),来计算你的测试误差。 当然,?这个是我们使用线性回归和平方误差标准时,测试误差的定义。

那么如果考虑分类问题,比如,使用逻辑回归的时候

训练和测试逻辑回归的步骤与前面(线性回归)所说的非常类似。 首先,我们要从训练数据,也就是70%的数据中,学习得到参数 θ。

然后用?的方式计算测试误差

除了 J_test(θ),还有另一种形式的测试度量,可能更易于理解,叫做“错误分类”,也被称为“0/1分类错误(0:分类正确;1:分类错误)” err(h_(θ), y) ?关于假设函数(即,h_(θ))和标签y的误差。 然后我们就能应用“错误分类”误差来定义“测试误差”,即:

对于每一个测试集(m_test)实例,计算:

然后对计算结果求平均。即,

?,这实际上就是我的假设函数误标记的部分在测试集中的比率(误分类的比率)。

?,这也就是使用“0/1错误分类度量”来定义的测试误差。

11.3 模型选择和训练、验证、测试集

如果你想要确定对于一个数据集,最合适的多项式次数,怎样选用正确的特征,来构造学习算法。或者你需要选择学习算法中的正则化参数 λ ,我们应该怎么做。 ?这类问题被叫做“模型选择问题”。

我们不再是将数据分为“训练集”和“测试集”。而是将数据分为三个数据组:训练集、测试集、验证集。 该视频会介绍如何将数据分为这三个数据组,以及这三个数据组的含义,同时告诉我们如何使用这些数据组进行模型选择。

?过拟合。一个假设函数在训练集的误差很小,并不能说明在新数据上的泛化能力好。

下面我们来考虑模型选择问题。 假如,你现在要选择能最好拟合数据的多项式次数。

你应该选择一次函数、二次函数、三次函数等等中的哪一个了?

d:表示你该选择的多项式次数。 所以,除了参数 θ,还有参数 d 需要你要数据集来确定。

第一步:使用“训练集”拟合参数 θ 首先,选择第一个模型,然后最小化训练误差。这样你会得到一个参数向量 θ^(1)。 然后,你再选择第二个模型,用它拟合你的训练集,这样就得到另一个参数向量 θ^(2)。 以此类推。。。

第二步:使用“测试集”/“验证集”拟合参数 d 然后,对所有这些模型求出“测试集误差”。即,J^ (θ^(i))_test

接下来,为了从这些模型中选出最好的一个。我们应该看哪个模型有最小的“测试误差”。选择那个有最小误差的模型。 比如,此处选择了’第五个模型’,即,5次多项式函数拟合的模型。

第三步: 验证所选出模型的泛化能力。即,使用“验证集误差”来进行泛化能力评估。J^ (θ^(i))_cv

第二步和第三步的集合可互换使用,因为,典型分配模式下,它们的样本个数是一样的。

参数向量 θ^(i) :表示,用 i 次多项式函数拟合数据得到的参数向量。

交叉验证(验证集),简称“cv”(cross validation set)。

“训练集” :“交叉验证” :“测试集” 典型的分配比例为:60% :20% :20%。这个比例值可以稍微调整,但这种分法是最典型的比例。

?“训练误差”、“交叉验证误差”、“测试误差”

串起来:

注意:对于你有一个很大很大的训练集时,你使用相同的训练集进行参数的拟合,以及泛化能力的评估,可能没有多大的问题。但如果你没有很大很大的数据集,就应该使用?说的方法,将数据集分为“训练集”、“交叉验证”、“测试集”来分别进行参数的拟合,和泛化能力的评估。

11.4 诊断偏差与方差

当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况: ① 要么是偏差比较大 ② 要么就是方差比较大 换句话说,要么就是欠拟合问题,要么是过拟合问题。 这种情况下,搞清楚是‘偏差问题’还是’方差问题’,或者两者都有关,这一点很重要。

“偏差”和“方差”的概念 假设你正在构建一个猫咪识别器。目前,你的训练集错误率为15%,并且你的开发集错误率为16%。 那么,算法在训练集上的错误率。在本例中,它是15%。我们非正式的认为这是算法的偏差(bias)。 其次,算法在开发(或测试)集上比训练集差多少。在本例中,开发集比训练集差1%。我们非正式的认为这是算法的方差(Variance)。即,方差 = 开发集/训练集的错误率 - 测试集的错误率

因为搞清楚是哪一点的问题,就能很快找到有效的方法和途径来改进算法。

横坐标:多项式次数,即,参数 d

随着多项式次数的增大,训练误差越来越小。 交叉验证误差 和 测试集误差 类似

具体来说,假设你得到了一个学习算法。而这个并没有表现的像你期望的那样好。如果你的 交叉验证误差 或者 测试集误差 都很大,我们怎么判断,此时的学习算法出现了高偏差的问题,还是高方差的问题?

交叉验证误差很大的情况出现在’凹行曲线’的两端。左边一端对应的是“高偏差问题(即,欠拟合问题)”,表示使用了一个过于小的多项式次数,而实际上,我们需要一个较高的多项式次数来拟合数据。 相反地,右边一端对应的是“高方差问题(即,过拟合问题)”。

具体来说, 相对于’高偏差(欠拟合)的情况’:我们发现,“交叉验证误差”和“训练集误差”都会很大 反过来,如果你的算法有“高方差(过拟合)问题”:你会发现,“训练集误差”很小,但是“交叉验证误差”远远大与“训练集误差”。

11.5 正则化和偏差、方差

当我们对高阶多项式进行拟合的时候,为了防止过拟合,我们会在代价函数中加入正则化项,来让参数的值尽可能小

那么如何自动的选择一个最合适的正则化参数 λ 的值呢?(类似于“多项式”的选择)

?这就是我们自动选择正则化参数 λ 的方法。

通常我的做法是,选取一系列我想要尝试的 λ 值。因此,首先我可能考虑不是用正则化,以及一些列我可能会试的值。 通常,我一般将 步长 设置为 2倍速度增长,直到一个比较大的值。

?我们用交叉验证集来拟合参数,使用测试集来评估 h(θ) 的泛化能力。

11.6 学习曲线

使用学习曲线来判断一个学习算法是否处于偏差、方差问题,或者二者都有

为了绘制学习曲线,我们通常先绘制 J_train 或 J_vc

训练集的样本是个常数,一般很大。我们使用小部分训练样本来绘制图即可。如,如果有100个训练样本,我们使用30、40个样本来绘制图即可。

当 m 很小时,训练误差很小。反过来,当 m 值逐渐增大,训练误差就会越来越大。

当我们的假设函数 h(θ) 出现高偏差问题时的学习曲线:

当 m 足够大时,你就会找到条最有可能拟合数据的那条直线。并且,此时,即便你继续增大训练集的样本容量,还是会得到一条差不多的直线。因此交叉验证集误差将会变为水平而不再变化,只要达到或超过一定数量的训练样本。

而训练集误差的情况是,一开始样本极少的时候,可以很好的拟合数据,但是随着样本的增加,你会发现训练集误差会逐渐增大,最后接近交叉验证误差。

最后补充一点,高偏差的学习曲线,可能有很高的交叉验证误差和训练集误差(即,纵轴值很大),也就是说,最终你会得到一个值比较大的 J_cv 和 J_train。

如果一个学习算法有高偏差,选用更多的训练样集数据对于改善算法表现并无帮助。 ?这个特征,对于我们判断我们的学习算法是否处于‘高偏差’情况,很重要。

当算法处于’高方差’时的学习曲线:

算法处于’高方差’的一个很明显的特征:训练集误差和交叉验证误差之间有一段很大的距离。 如果我们增大训练集的样本数,‘训练集误差’ 和 ‘交叉验证误差’ 这两条学习曲线则会互相靠近。也就是,随着训练集样本数的增大,’训练集误差’会不断增大,而‘交叉验证误差’会不断减小(这同‘高偏差’的情况是不一样的,‘高偏差’情况,随着训练样本数的增加,’训练集误差’和‘交叉验证误差’会变为水平而不再变化)。 因此,在’高方差’情况下,使用更多的训练样本对改进算法表现是有帮助的。

11.7 决定接下来做什么

  1. 获取更多的训练样本 解决“高方差”问题
  2. 尝试使用更少的特征集(?,防止过拟合) 解决“高方差”问题
  3. 尝试使用更多的特征 并非一定,通常使用来解决“高偏差”问题的一个方法
  4. 尝试增加多项式特征

这是另一种修正“高偏差”问题的方式

  1. 尝试减小 λ(正则化参数) 可以修正“高偏差”问题
  2. 尝试增大 λ(正则化参数) 修改“高方差”问题。

如何为神经网络选择结构,或连接形式

当你在进行神经网络拟合的时候,你可以选择一种相对比较简单的神经网络模型:隐藏层单元较少,甚至只有一个隐藏层,并且只有少量的隐藏单元。像这样的一个简单神经网络,参数就不会很多,容易出现欠拟合。 这种比较小型的神经网络的最大优势,在于计算量较小。

与之相对的另一种情况是,拟合较大型的神经网络结构。比如,每一层中有很多的隐藏单元,或者有很多隐藏层。这种比较复杂的神经网络,参数一般较多,更容易出现过拟合。这种结构的一大劣势,也许不是主要的劣势,但还是需要考虑的,那就是当网络有大量神经元时,这种结构会有很大的计算量。 虽然有这个情况,但通常来讲这不是问题。这种大型的网络结构,最主要的潜在问题,还是它更容易出现过拟合现象。

事实上,如果你经常应用神经网络,特别是大型神经网络的话,你就会发现越大型的网络性能越好,但如果发生了过拟合,你可以使用正则化的方法来修正。 一般来说,使用一个大型的网络神经,并使用正则化来修正过拟合问题,通常比使用一个小型的网络效果更好,但主要可能出现的一个问题,就是计算量相对较大。

最后,你还需要选择,所需的隐藏层的层数。通常来说,使用一个隐藏层是比较合理的默认选项。但如果你想要选择一个最合适的隐藏层层数,你也可以试试,把数据分割成训练集、验证集和测试集。然后训练一个隐藏层的神经网络,然后试试两个、三个隐藏层,然后看看哪个神经网络在交叉验证集上表现得最理想。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本章含盖
  • 决定下一步做什么
    • 机器学习诊断
    • 11.2 评估假设
      • 过拟合:
        • 评估“假设函数”的标准方法:
        • 11.3 模型选择和训练、验证、测试集
        • 11.4 诊断偏差与方差
        • 11.5 正则化和偏差、方差
        • 11.6 学习曲线
        • 11.7 决定接下来做什么
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档