吴恩达机器学习Coursera-week6

week6课程更多地是讲解类似best practice的工程实践。讲述了实际训练模型过程中我们会遇到的两大类问题(high bias 和 high variance), 以及如何分析定位问题和解决这些问题。

Evaluating a learning algorithm

Evaluating a Hypothesis

想象一下我们实际的模型构造过程:

  1. 根据具体的需求来将我们要做的预测分为回归问题还是分类问题;
  2. 选择一个算法(比如使用Linear regression还是logistic regression)
  3. 收集样本数据
  4. 根据选定的算法构造模型
  5. 训练模型
  6. 评估模型
  7. 改进模型
    这里我们会发现这个过程的很多步骤是需要不断迭代改进的,那么这个过程中的第6步评估模型就很重要,它让我们知道我们的模型实际到底是好还是不好,以及不好的原因是什么,从而给我们下一步改进模型提供方向。
    评估模型最基本的方式是将样本数据随机分为两部分(训练数据集70%, 和测试数据集30%),这样我们用训练集的样本训练好之后,就可以使用测试集的样本计算其'error',根据这个error的大小我们就可以评估模型的好与坏。
    计算这个'error'误差,我们需要量化的标准,这就用到了我们之前的cost function(对于logistic分类问题并不同)
  • 针对Linear regression,可以使用如下公式:


    3959253-c9824be18217e3bf.jpg
    1.1-针对训练集的误差计算
  • 针对logistic分类问题,先看一下单个样本的误差如何计算:


    3959253-0e959e299e2393e7.jpg
    1.2-单个样本的误差计算

    单个样本的误差只有0,1两种情况,预测准确为误差为0, 相反预测不准确则为1
    然后我们将所有训练集中的样本的误差求平均值,使用如下公式:


    3959253-32f1390235e36395.jpg
    1.3-样本集总体误差

    这样我们就有了量化评估模型好坏的依据。

Model Selection and Train/Validation/Test Sets

我们在构造模型时,尤其针对Linear Regression和Logistic Regression我们需要确定用什么高次项,即我们需要选择次数d,当d越高,拟合越好,甚至过拟合;相反越低,拟合越不好,可能就under fitting了。但是如果我们单纯的使用测试集来选择d,这会导致在测试集上拟合得很好,但实际预测时存在过拟合的问题,因为我们在测试集选择的d之后再去用测试集评估模型这肯定拟合的好,所以无法评估泛化得好坏。正是基于这个原因,我们需要将样本集分为三个部分:训练集(60%), cross validation set(20%), test set(20%).
cross validation set就可以用于选择这个d值。

Bias vs. Variance

当我们用训练好的模型进行实际预测时,我们可能发现预测的误差很大,而误差通常有两种情况:

  • high bias (under fitting)
  • high variance (over fitting)
high bias问题

high bias说明我们的模型是有问题的,拟合不够好,那么我们可以做如下调整:

  • 增加features,(直觉上说我们获取了更多信息当然可以做更好的预测,以房价预测为例,当我们有了更多跟房屋价格有关的信息,如地理位置,房屋年代,周边设施等信息之后,我们当然可以更好地评估房价)
  • 增加polynomial features,通过增加高次项使得函数能够更好的拟合
  • 调整Regularization rate λ,通过降低λ,也可以使得model更好地拟合我们的数据
  • 针对神经网络,我们还可以通过增加hidden layer的层数,以及unit数量来使得模型更好的拟合,这其实也相当于增加了feature的数量
high variance问题

high variance说明我们的模型存在过拟合,也就是过于精确地匹配了训练数据,但是不够general,而解决过拟合问题,通常可以做如下调整:

  • 减少feature数量
  • 调整polynomial的高次项,通常将高次降为低次,或者说去掉高次(后边Andrew讲了如何选择次数d)
  • 增加λ
  • 针对神经网络,我们还可以减少hidden layer的层数或unit的数量
  • 增加样本的数量也可以让模型更好地泛化

通过图形来评估模型

通过图形我们可以看到不同的d,最终其traning set的误差和cross validation的误差表现,如下图:


3959253-622a0d4fd5ae784a.jpg
2.1-cost J with variable d
  • 从图中可以看到当d比较小时,无论是训练集还是CV集,其误差都很大,说明存在under fitting问题或者说high bias问题,这时两种误差比较接近
  • 当d增大后,训练集的误差逐渐减小,说明拟合越来越好,但是到一定程度后,CV集误差开始增大,说明开始过拟合了,这时两个误差会有较大差距。
    通过图形我们可以找到CV集的极值点,从而可以判断哪个d值是最合适的。

同样道理,我们也可以通过图形来选择Regularization parameter λ,如下图所示


3959253-28ea7af66c77d0bc.jpg
2.2-cost J with variable λ
  • 从图中可以看出当λ很大时,会导致所有的高次项接近于0,极端情况就是类似一条横着的直线,当然无法拟合,所以导致无论是训练集还是CV集的误差都会很大,两者值接近
  • 当λ很小时,训练集会拟合得非常好,但可能导致过拟合,从而使得CV集误差较大,两者差距很大。
    从图形中可以看出Jcv(θ)的极值点就是我们想要选择的λ

另外,还有一种图形是关于样本数量的图形,即学习曲线图形(Learning Curves)
如下图:


3959253-1474b959697c4ce4.png
2.3-high_bias

上图可以看出无论是training set还是CV set,其误差都很大,而且两者随着样本数的增加,并没有大幅改进,且两者误差最后很接近。这种情况就是属于high bias问题,模型拟合的不好

3959253-6e0f0047eea0f791.png
2.4-high_variance

上图可以看出训练集的误差和CV集误差存在较大差距,这种情况就是过拟合。

Building a spam classifier

这个章节Andrew主要用一个email spam classifier的实际例子来阐释实际项目应该如何开展,主要讲了两部分内容,第一部分讲了我们在实际项目中实际在哪些工作上会花费时间;第二部分讲了如何去评估我们的机器学习系统的优劣,并明确改进的方向。
第一部分主要是这个email的分类器有点意思,通过分词,把一封邮件转化为一个向量,从而把一个实际生活中会遇到的问题转化为了一个数学问题。(我认为这种转化是非常有价值和创造性的地方,有了这种转化我们才能真正解决实际问题,并创造价值),具体看下图:


3959253-d46967e511d6187c.jpg
3.1-build a email spam classifier

这里我想是否可以将词频数量作为向量中的值,而不单是0和1,这样后续是否可以更好比较向量之间的关系,而且我认为很大程度跟词频是有关系的。

第二部分,Andrew首先推荐了工程实践的流程,大致上是说要快速搭建一个简单的系统先,然后通过learning curve来判断改进的方向,再实际根据情况(如是high bias问题还是high variance问题?)再判断去如何改进。详细如下:

3959253-f76c21b0142fef4f.jpg
3.1-recommended approach

关于第三点,作者的意思是说通过查看cv set中发生误判的例子,看下大体是什么原因导致的,比如漏掉了很多spam邮件,那就看下这些邮件都是什么类型的邮件,有哪些特点,是否可以通过添加更多识别词或其它特征来改进对这类邮件的识别,如下所示:
3959253-84c5c4263f49d394.jpg
3.2-error analysis

可以看出实际做的过程中,还要从本质上去思考到底spam邮件有哪些特点,那么我们就需要将这些特点加入到机器学习的特征当中,从而改进我们的模型。
最后,作者表达了要有一个数字指标来简单地判断模型的性能,比如J test。只有通过一个数字的量化的指标,我们才好判断我们对模型的改进到底有没有意义,作用有多大。如下:
3959253-3f7aaa6cd6d565f6.jpg
3.3-numerical evaluation

Handling Skewed Data

这一章节主要讲述了什么是Skewed Data,并由此引入了精确率(precision)和召回率(recall)的概念。
什么是Skewed data就是某个预测值(或者说某个分类)本身其比例就非常小,另一个分类的比例很大,这就是说如果我们每次都预测为那个比例较大的分类,我们误差仍然很低,因此单纯的错误率衡量指标就失去效力了。因此,我们需要引入新的衡量指标来针对此类存在Skewed Data的问题。这就是准确率和召回率,如下图所示:


3959253-c5a6d9a90b810450.jpg
4.1-precision and recall

准确率是衡量我们预测的到底有多准确,所以要用我们预测准确的为positive数量除以所有预测为positive的数量
召回率是衡量预测的涵盖率,即我们预测为positive的样本涵盖了多大比例的所有的positive样本。
还以预测癌症为例,如果我们的模型总是返回0(即预测没有癌症),那么其召回率就变成了0,从而可以判断出模型是有问题的。因此当精确率和召回率都比较高的时候,我们会对这个模型更有信心。
第二小节主要讲了如何权衡精确率和召回率,某种程度上它们之间是矛盾的,因此需要根据实际的情况和产品需求来定到底是想要更高的精确率还是要更高的召回率。
而当我们想要通过一个单独的数值来衡量模型的性能时,可以使用F score,如下:


3959253-f1030e36a7d49b2f.jpg
4.2-F Score

Using Large Data Sets

此章节重点讲了在哪些情况下大的数据量是有用的。
Andrew首先讲了一些研究,发现很多算法,都会随着数据量的提升而获得性能的提升。但是这是有前提的,前提就是这些数据中包含的特征是否足够我们做出预测,想象一个人类专家是否可以根据这些特征来正确地预测是我们首先要问的一个问题。当这个条件满足的情况下,通常数据量越大,模型可能的性能就越好。

猜你喜欢

转载自blog.csdn.net/weixin_33690367/article/details/87229783