吴恩达MachineLearning-Week6

原笔记网址:https://scruel.gitee.io/ml-andrewng-notes/week5.html

红色字体为自己的标注、绿色字体为自己的感想。

目录

十、应用机器学习的建议(Advice for Applying Machine Learning)

十一、机器学习系统的设计(Machine Learning System Design)

十、应用机器学习的建议(Advice for Applying Machine Learning)

10.1 决定下一步做什么

利用前面的知识,我们可以训练出多个模型。然而对于训练出的模型,我们需要知道如何选择出好的模型(10.3),模型效果不佳(过拟合或欠拟合)的原因是什么(多项式次数的高低,10.4)(正则项lambda的惩罚程度,10.5)(训练数据的规模m,10.6),怎么去解决。这一节将介绍求出模型后,我们还需要做些什么。

当我们运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以做什么?

  1. 获得更多的训练样本——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
  2. 尝试减少特征的数量
  3. 尝试获得更多的特征
  4. 尝试增加多项式特征
  5. 尝试减少正则化程度lambda
  6. 尝试增加正则化程度lambda

        我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的。

       “诊断法”的意思是:这是一种测试法,你通过执行这种测试,能够深入了解某种算法到底是否有用。这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试,才是有意义的。在这一系列的视频中我们将介绍具体的诊断法,但我要提前说明一点的是,这些诊断法的执行和实现,是需要花些时间的,有时候确实需要花很多时间来理解和实现,但这样做的确是把时间用在了刀刃上,因为这些方法让你在开发学习算法时,节省了时间.

10.2 评估一个假设

参考视频: 10 - 2 - Evaluating a Hypothesis (8 min).mkv

       在本节视频中我想介绍一下怎样用你学过的算法来评估假设函数。在之后的课程中,我们将以此为基础来讨论如何避免过拟合和欠拟合的问题。

       该如何判断一个假设函数是过拟合的呢?对于这个简单的例子,我们可以对假设函数进行画图,然后观察图形趋势,但对于特征变量不止一个的这种一般情况,还有像有很多特征变量的问题,想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现。 因此,我们需要另一种方法来评估我们的假设函数过拟合检验。

        为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。

测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:

  1. 对于线性回归模型,我们利用测试集数据计算代价函数:

  1. 对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:

除此之外,还有方法:

10.3 模型选择和交叉验证集

参考视频: 10 - 3 - Model Selection and Train_Validation_Test Sets (12 min).mkv

假设我们要在10个不同次数的二项式模型之间进行选择:

显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。 即:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集

补充:通常来说,交叉验证指将数据集分成n份,每次将一份作为验证集。训练n次过后,每份数据都充当了一次验证集,求这n次的平均误差。但在这里,交叉验证集、验证集、训练集并不重合。

模型选择的方法为:

  1. 使用训练集训练出10个模型
  2. 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
  3. 选取代价函数值最小的模型
  4. 用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)

很多人只是将数据分成训练集与测试集。通过训练集得到theta,用测试集找到最小代价的式子,也用测试集求推广误差。这是不对的。(通过验证集的最小代价求得的d,自然得到的代价是最小的。)

应该用验证集求最小代价得表达式,再用测试集求推广误差。(往往Jcv会小于Jtest。因为式子是由Jcv最小得到的,并不针对Jtest。)

总结:

我们需要对数据训练出n个模型,然后分别对这些模型计算出推广误差,选择误差最小的那个模型,同时输出该模型的推广误差。

一般而言,我们只将数据分成训练集和测试集。通过训练集训练n个模型,通过测试集计算误差,选最小的模型,并用测试集计算出来误差作为推广误差。但是,只用测试集这一个数据集,那么选出来的模型的推广误差肯定是最小的,此时推广误差没法准确反映该模型的性能。

因此,我们引入了交叉验证集的概念。将数据集分成训练集、验证集、测试集。通过训练集训练出n个模型,利用验证集求每个模型的误差,选择误差最小的模型,最后利用测试集测试模型,得到该模型的推广误差,对模型性能有一个客观的评价。

Train/validation/test error

Training error:

Cross Validation error:

Test error:

10.4 诊断偏差和方差

参考视频: 10 - 4 - Diagnosing Bias vs. Variance (8 min).mkv

当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。

我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:

在上图中,可以发现随着模型多项式次数越大,训练集误差越小,越拟合。但对于验证集而言,起初模型次数不高,欠拟合(高偏差),因此误差较高。随着,模型次数增加,误差逐渐减小。当达到一个合适的模型次数时,验证误差达到最小值。此时若再增加模型次数,反而会出现过拟合问题(高方差),验证误差又逐渐上升。

 

对于训练集,当d较小时,模型拟合程度更低,误差较大;随着d的增长,拟合程度提高,误差减小。

对于交叉验证集,当d较小时,模型拟合程度低,误差较大;但是随着d的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。

如果我们的交叉验证集误差较大(即当前算法不理想),我们如何判断是方差还是偏差呢?根据上面的图表,我们知道:

训练集误差和交叉验证集误差近似时:偏差/欠拟合

交叉验证集误差远大于训练集误差时:方差/过拟合

10.5 正则化和偏差/方差

参考视频: 10 - 5 - Regularization and Bias_Variance (11 min).mkv

在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能会正则化的程度太高或太小了,即我们在选择λ的值时也需要思考与刚才选择多项式模型次数类似的问题。

我们选择一系列的想要测试的值,通常是 0-10之间的呈现2倍关系的值(如:共12个)。 我们同样把数据分为训练集、交叉验证集和测试集。

选择的方法为:

  1. 使用训练集训练出12个不同程度正则化的模型
  2. 用12个模型分别对交叉验证集计算的出交叉验证误差
  3. 选择得出交叉验证误差最小的模型
  4. 运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:

• 当较小时,训练集误差较小(过拟合)而交叉验证集误差较大 • 随着的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加

注意:如上图左半部分所示,J含有正则项,Jtrain和Jcv不含。这是因为,J是为了训练数据集,得到模型(theta的具体值)。为了避免过拟合,添加了正则项。我们取不同的lambda,可以得到不同的模型。而训练得到模型后,为了验证lambda选择的优劣,我们新增了Jtrain和Jcv,来计算不同lambada得到的模型的优劣,故此时不需要含正则项。

Jtrain和Jcv虽然不含lambda,但是是由模型求出来的,而模型的训练又与J有关。因此虽然二者不含lambda,但是仍然有关系,可以得到上图右半部分。

(疑惑:我的印象里,正则化是为了减少变量取值范围不同对模型产生的影响。但是看上图,Jtrain与lambda成正比关系。那岂不是说不进行正则化时误差最小???不解……所以要重新理解一下正则化的原因,一定是我哪里搞错了呜呜呜……啊!我想起来了(感恩大西瓜)!lambada是防止过拟合的!所以lambda越小,对于训练集数据来说,拟合的效果越好,但是容易出现过拟合,对于验证集的数据来说就不友好了。)

10.6 学习曲线

参考视频: 10 - 6 - Learning Curves (12 min).mkv

学习曲线就是一种很好的工具,我经常使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集样本数量的函数绘制的图表。 即,如果我们有100行数据,我们从1行数据开始,逐渐学习更多行的数据。

思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。

如何利用学习曲线识别高偏差/欠拟合:

当训练集数据数量m很小的时候,训练集能够很好的拟合。但对于验证集来说,效果会很差。当训练集数目增多,由于欠拟合,训练集误差也会增长很多。对于验证集来说,误差反而会下降。但是由于模型本身欠拟合,当m增长到一定阈值后,不会再对训练误差、验证误差产生太大的影响了。整体处于一个误差较高的状态。

也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。

如何利用学习曲线识别高方差/过拟合:

当训练集数据量很小的时候,训练集的误差也很小,而验证集的误差会很大。当训练集数据量增大,训练集的误差会逐渐增大,但因为过拟合,训练集拟合效果很好,因此整体来说训练集误差还是没有很大的。对于测试集来说,数据量增大,拟合效果得到提高但是并不明显,因此验证误差虽然下降,但和训练集仍然相差很大。

也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。

10.7 决定下一步做什么

参考视频: 10 - 7 - Deciding What to Do Next Revisited (7 min).mkv

我们已经介绍了怎样评价一个学习算法,我们讨论了模型选择问题,偏差和方差的问题。那么这些诊断法则怎样帮助我们判断,哪些方法可能有助于改进学习算法的效果,而哪些可能是徒劳的呢? 让我们再次回到最开始的例子,在那里寻找答案,这就是我们之前的例子。回顾 1.1 中提出的六种可选的下一步,让我们来看一看我们在什么情况下应该怎样选择:

  1. 获得更多的训练样本——解决高方差
  2. 尝试减少特征的数量——解决高方差
  3. 尝试获得更多的特征——解决高偏差
  4. 尝试增加多项式特征——解决高偏差
  5. 尝试减少正则化程度λ——解决高偏差
  6. 尝试增加正则化程度λ——解决高方差

使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。 通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。 对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。

一个例题:

注意题干指明了Jtrain与Jtest相差很大,那么此时是处于高方差(过拟合)的情况。因此增加数据量是没有用的。

十一、机器学习系统的设计(Machine Learning System Design)

11.1 首先要做什么

参考视频: 11 - 1 - Prioritizing What to Work On (10 min).mkv

在接下来的视频中,我将谈到机器学习系统的设计。这些视频将谈及在设计复杂的机器学习系统时,你将遇到的主要问题。同时我们会试着给出一些关于如何巧妙构建一个复杂的机器学习系统的建议。下面的课程的的数学性可能不是那么强,但是我认为我们将要讲到的这些东西是非常有用的,可能在构建大型的机器学习系统时,节省大量的时间。

本周以一个垃圾邮件分类器算法为例进行讨论。 为了解决这样一个问题,我们首先要做的决定是如何选择并表达特征向量。我们可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0),尺寸为100×1。

为了构建这个分类器算法,我们可以做很多事,例如:

  1. 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
  2. 基于邮件的路由信息开发一系列复杂的特征(邮件标题)
  3. 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
  4. 为探测刻意的拼写错误(把watch 写成w4tch)开发复杂的算法

在上面这些选项中,非常难决定应该在哪一项上花费时间和精力,作出明智的选择,比随着感觉走要更好。当我们使用机器学习时,总是可以“头脑风暴”一下,想出一堆方法来试试。实际上,当你需要通过头脑风暴来想出不同方法来尝试去提高精度的时候,你可能已经超越了很多人了。大部分人并不尝试着列出可能的方法,他们做的只是某天早上醒来,因为某些原因有了一个突发奇想:"让我们来试试用Honey Pot项目收集大量的数据吧。"
我们将在随后的课程中讲误差分析,我会告诉你怎样用一个更加系统性的方法,从一堆不同的方法中,选取合适的那一个。因此,你更有可能选择一个真正的好方法,能让你花上几天几周,甚至是几个月去进行深入的研究。

11.2 误差分析

参考视频: 11 - 2 - Error Analysis (13 min).mkv

在本次课程中,我们将会讲到误差分析Error Analysis)的概念。这会帮助你更系统地做出决定。

如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,拥有多么复杂的变量;而是构建一个简单的算法,这样你可以很快地实现它。 每当我研究机器学习的问题时,我最多只会花一天的时间,就是字面意义上的24小时,来试图很快的把结果搞出来,即便效果不好。坦白的说,就是根本没有用复杂的系统,但是只是很快的得到的结果。即便运行得不完美,但是也把它运行一遍,最后通过交叉验证来检验数据。一旦做完,你可以画出学习曲线,通过画出学习曲线,以及检验误差,来找出你的算法是否有高偏差和高方差的问题,或者别的问题。在这样分析之后,再来决定用更多的数据训练,或者加入更多的特征变量是否有用

这么做的原因是:这在你刚接触机器学习问题时是一个很好的方法,你并不能提前知道你是否需要复杂的特征变量,或者你是否需要更多的数据,还是别的什么。提前知道你应该做什么,是非常难的,因为你缺少证据,缺少学习曲线。因此,你很难知道你应该把时间花在什么地方来提高算法的表现。但是当你实践一个非常简单即便不完美的方法时,你可以通过画出学习曲线来做出进一步的选择。你可以用这种方式来避免一种电脑编程里的过早优化问题,这种理念是:我们必须用证据来领导我们的决策,怎样分配自己的时间来优化算法,而不是仅仅凭直觉,凭直觉得出的东西一般总是错误的

除了画出学习曲线之外,一件非常有用的事是误差分析,我的意思是说:当我们在构造垃圾邮件分类器时,我会看一看我的交叉验证数据集,然后亲自看一看哪些邮件被算法错误地分类。因此,通过这些被算法错误分类的垃圾邮件与非垃圾邮件,你可以发现某些系统性的规律:什么类型的邮件总是被错误分类。经常地这样做之后,这个过程能启发你构造新的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它。 构建一个学习算法的推荐方法为:

  1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
  2. 绘制学习曲线,决定是增加更多数据,还是添加更多特征,或是其他选择
  3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势

以我们的垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看:是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。 思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。 例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从出现次数最多的情况开始着手优化。 误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。 在我们的垃圾邮件分类器例子中,对于“我们是否应该将discount/discounts/discounted/discounting处理成同一个词?”如果这样做可以改善我们算法,我们会采用一些截词软件。误差分析不能帮助我们做出这类判断,我们只能尝试采用和不采用截词软件这两种不同方案,然后根据数值检验的结果来判断哪一种更好。 因此,当你在构造学习算法的时候,你总是会去尝试很多新的想法,实现出很多版本的学习算法,如果每一次你实践新想法的时候,你都要手动地检测这些例子,去看看是表现差还是表现好,那么这很难让你做出决定。到底是否使用词干提取,是否区分大小写。但是通过一个量化的数值评估,你可以看看这个数字,误差是变大还是变小了。你可以通过它更快地实践你的新想法,它基本上非常直观地告诉你:你的想法是提高了算法表现,还是让它变得更坏,这会大大提高你实践算法时的速度。所以我强烈推荐在交叉验证集上来实施误差分析,而不是在测试集上。但是,还是有一些人会在测试集上来做误差分析。即使这从数学上讲是不合适的。所以我还是推荐你在交叉验证向量上来做误差分析。 总结一下,当你在研究一个新的机器学习问题时,我总是推荐你实现一个较为简单快速、即便不是那么完美的算法。我几乎从未见过人们这样做。大家经常干的事情是:花费大量的时间在构造算法上,构造他们以为的简单的方法。因此,不要担心你的算法太简单,或者太不完美,而是尽可能快地实现你的算法。当你有了初始的实现之后,它会变成一个非常有力的工具,来帮助你决定下一步的做法。因为我们可以先看看算法造成的错误,通过误差分析,来看看他犯了什么错,然后来决定优化的方式。另一件事是:假设你有了一个快速而不完美的算法实现,又有一个数值的评估数据,这会帮助你尝试新的想法,快速地发现你尝试的这些想法是否能够提高算法的表现,从而你会更快地做出决定,在算法中放弃什么,吸收什么误差分析可以帮助我们系统化地选择该做什么。

11.3 类偏斜的误差度量

参考视频: 11 - 3 - Error Metrics for Skewed Classes (12 min).mkv

在前面的课程中,我提到了误差分析,以及设定误差度量值的重要性。那就是,设定某个实数来评估你的学习算法,并衡量它的表现,有了算法的评估和误差度量值。有一件重要的事情要注意,就是使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。类偏斜情况表现为我们的训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。 例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们通过训练而得到的神经网络算法却有1%的误差。这其实已经是很小的误差了。然而使用非学习算法,让所有值都为零(即无癌症),误差只有0.5%,比机器学习算法效果还好。这时,误差的大小是不能视为评判算法效果的依据的。因此对于偏斜类(skewed classes),我们需要更合适的性能衡量指标:查准率Precision)和查全率/召回率Recall)。

我们将算法预测的结果分成四种情况:

  1. 正确肯定True Positive,TP):预测为真,实际为真
  2. 正确否定True Negative,TN):预测为假,实际为假
  3. 错误肯定False Positive,FP):预测为真,实际为假
  4. 错误否定False Negative,FN):预测为假,实际为真

查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。 分母是我们预测患癌的总人数,因此也有:查准率=1-误报率。

查全率/查全率=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。 分母是实际患癌的总人数,因此也有:查全率=1-漏报率

这样,对于我们刚才那个非机器学习算法(预测所有人未患癌的算法),其查全率是0。

11.4 查准率和查全率之间的权衡

参考视频: 11 - 4 - Trading Off Precision and Recall (14 min).mkv

在之前的课程中,我们谈到查准率和召回率,作为遇到偏斜类问题的评估度量值。在很多应用中,我们希望能够保证查准率和召回率的相对平衡。 在这节课中,我将告诉你应该怎么做,同时也向你展示一些查准率和召回率作为算法评估度量值的更有效的方式。继续沿用刚才预测肿瘤性质的例子。假使,我们的算法输出的结果在0-1 之间,我们使用阀值0.5 来预测真和假。

查准率(Precision)=TP/(TP+FP) 例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。

查全率(Recall)=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。 如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比0.5更大的阀值,如0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。 如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阀值,如0.3。 我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:

我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算F1 值F1 Score),其计算公式为:

我们选择使得F1值最高的阀值。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值