[机器学习] Coursera笔记 - 机器学习应用的建议-Part1

来源:互联网 发布:知乎怎样匿名回答 编辑:程序博客网 时间:2024/05/17 08:27

序言

  机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,包括在线课程或Tutorial的学习笔记,论文资料的阅读笔记,算法代码的调试心得,前沿理论的思考等等,针对不同的内容会开设不同的专栏系列。
  机器学习是一个令人激动令人着迷的研究领域,既有美妙的理论公式,又有实用的工程技术,在不断学习和应用机器学习算法的过程中,我愈发的被这个领域所吸引,只恨自己没有早点接触到这个神奇伟大的领域!不过我也觉得自己非常幸运,生活在这个机器学习技术发展如火如荼的时代,并且做着与之相关的工作。
  写博客的目的是为了促使自己不断总结经验教训,思考算法原理,加深技术理解,并锻炼自己的表述和写作能力。同时,希望可以通过分享经验帮助新入门的朋友,结识从事相关工作的朋友,也希望得到高人大神的批评指正!
  
  
  

前言

  [机器学习] Coursera笔记系列是以我在Coursera上学习Machine Learning(Andrew Ng老师主讲)课程时的笔记资料加以整理推出的。内容涵盖线性回归、逻辑回归、Softmax回归、SVM、神经网络和CNN等等,主要学习资料来自Andrew Ng老师在Coursera的机器学习教程以及UFLDL Tutorial,Stanford CS231n等在线课程和Tutorial,同时也参考了大量网上的相关资料。
  
  本篇博客主要整理自“Advice for Applying Machine Learning”课程的笔记资料,包括假设函数的评估、数据集划分、模型选择问题、偏差和方差,以及机器学习诊断法等方面,涵盖了大量的器学习应用的建议和技巧。
  同时,我也会将自己在机器学习算法应用中的经验分享出来,供大家参考。
  文章小节安排如下::
  1)如何评价一个模型(Evaluating a Hypothesis)
  2)欠拟合与过拟合(Underfit and Overfit)
  3)模型选择与数据集划分(Model Selection and Train/Validation/Test Sets)

  4)如何诊断一个机器学习算法(How to diagnose a algorithm)
  5)如何调试一个机器学习算法(How to debug a algorithm)
  6)误差分析(Error Analysis)
  7)偏斜类问题(Skewed Classes)
  8)查全和查准的权衡(Trading Off Precision and Recall)
  9)数据的重要性(Importance of Data)
  10)最后的总结
  
  这是第一篇,前两篇请参考:
  机器学习应用的建议与方法2
  机器学习应用的建议与方法3

  
  机器学习算法的应用其实是个经验活儿,靠的是日积月累的不断试错和积累。课程里给出了机器学习算法应用中常用的准则、技巧和建议,不过想要全面理解和掌握这些建议,需要反复练习。
  -
    

一、如何评价一个模型(Evaluating a Hypothesis)

  当我们针对某个任务训练回归/分类模型时,如何判断模型的性能好坏是极其重要的。以课程中的例子来说明,我们利用线性回归算法来训练房价预测模型,定义了假设函数 H(x) 和 J(θ),那么我们该如何判断训练出的模型到底性能如何呢?
  

1.1 常用评价指标

  Accuracy/Precision/Recall/misclassification rate/missing alarm/false alarm/F1 Score
  
  这里列出几项在二分类模型中常用的性能评价指标及其计算方式。先明确true positives(真正类)、true negatives(真负类)、false positive(假正类)、false negative(假负类)的概念,如下所示。
  

TP/FP/FN/TN

  
  更详细一些如下:
  
TP/FP/FN/TN

  
  指标计算方式:
  1)Accuracy(准确率)= (true positives + true negatives) / (total examples)
  Accuracy反映了分类器对整个数据集的判断能力,即能够将正样本判定为正,将负样本的判定为负;
  
  2)Precision(精确度)= (true positives) / (true positives + false positives)
  Precision的数值表示被分类器判断为正的所有样本中,真正正样本(true positives)的比重。反映了分类器对负样本的识别能力。注意,虽然Precision计算的是正样本所占比重,但我认为该指标反映的其实是分类器对负样本的识别能力,Precision值越小则分类器对负样本的判断能力越弱(误判严重),Precision值越大则分类器对负样本的判断能力越强(误判很少);
  
  3)Recall(召回率) = (true positives) / (true positives + false negatives)
  Recall的数值表示所有正样本中被分类器判断为正的比例。反映了分类器对正样本的识别能力,即模型是否可以识别出大多数正样本;
  注意,Recall与True Positive Rate(真正率 , TPR)或灵敏度(sensitivity)的计算方式一致。
  
  4)misclassification rate(误分率) = (false positives + false negative) / (total examples)
  misclassification rate,也称0/1错分率,反映了分类器对整个数据集预测错误的情况,与Accuracy互斥,相加为1;
    
  5)missing alarm(漏报率/漏警率) = (false negative) / (true positives + false negatives)
  missing alarm的数值表示正样本被漏判的比例,与Recall互斥,相加为1。
  
  6)false alarm(虚警率/误报率) = (false positives) / (true positives + false positives)
  false alarm的数值表示被分类器判断为正(正例)的所有样本中,负样本(false positives)的比重(也就是将负样本误检成正样本的比重),false alarm与Precision互斥,相加为1。
  
  7)F1 Score(F1分数) = (2 * precision * recall) / (precision + recall)
  F1 Score是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。F1分数可以看作是模型准确率和召回率的一种加权平均,可以反映模型的整体情况,它的最大值是1,最小值是0。
  

1.2 应用中性能指标的选择

  机器学习中的算法性能评价指标有很多,上面也只是常用的一些。在实际任务中并不是每个指标都被关注,不同的任务侧重不一样,关注的指标也就不同。例如,有的任务可能对虚警容忍度较高(可以多误报一些),但是对召回率或者漏报率要求很严格(绝对不能漏报),那么我们在训练模型和设置判定阈值的时候,就要侧重Recall指标。
  而在有些任务中更侧重虚警率和计算速度,比如在我负责的有害图像审核系统中,业务部门就更关注虚警率和速度,为什么呢?因此互联网的数据量实在太大,一天动辄就上千万,那么速度很重要就不必说,同时虚警率是绝对要压低的,因为1%的虚警率就意味着误报10w+的样本(复审小组就要累死了……)。所以我们在有害信息识别系统中,模型的虚警率一般都得至少控制在0.3%以下(这其实也比较高了,但是海量数据环境下,误报真的是很棘手的问题)。
  从评价指标的计算方式就可以看出,各个指标之间是很难兼顾的,通过努力调参,可能某一项指标好了,另一项指标就会变差。因此,在训练分类器模型的时候,一定要搞清楚任务侧重点什么,只有充分考虑业务的实际需求,才能训练出一个实用的算法模型。
  
  

二、欠拟合与过拟合(Underfit and Overfit)

  评价指标罗列了一大堆,也许还是搞不清楚怎么评价一个机器学习模型。其实无论在实验还是应用中,我们评价一个模型时,大多数时候都是在讨论这个模型是否过拟合或者欠拟合,也就是方差和偏差问题,然后据此再更换算法或者调整参数。
  其实Underfit和Overfit贯穿机器学习,是机器学习的核心问题:偏差-方差权衡。机器学习算法应用的整个过程,每个处理技巧和应用环节也都是围绕着此问题进行。同时,Underfit和Overfit问题也是Ng在这节课里的主要线索。
  下面对Underfit和Overfie先做一个简单直观的介绍。关于欠拟合和过拟合更深层次的讨论放在后面阐述。
  
  机器学习算法表现很差的原因,要么是模型发生了过拟合,要么是发生了欠拟合。下面一张图涵盖所有情况(包括回归和分类)。
  

Underfit and Overfit

  
  

2.1 什么是欠拟合?

  如果一个机器学习模型在训练和预测时表现的都不好,那么认为该模型是欠拟合的。通常来说,如果我们在训练时发现模型在训练集上的误差很大,那基本就可以判断该模型是欠拟合的,也就是模型未考虑足够的信息,从而无法对训练数据精确建模(所以产生欠拟合)。
  举个回归的例子如下:
  

Underfit in regression

  训练出的模型基本就是一条直线,无法对数据进行充分的建模(拟合),也可以说模型没有充分学习数据的分布情况。
  
  举个分类的例子如下:
  
Underfit in classification

  同样,训练出的决策边界也基本是一条直线,完全无视了数据分布……
  
  欠拟合通常是不被讨论的,因为欠拟合太容易被发现了,大多数评估指标都可以将欠拟合问题暴露出来。
  
  

2.2 什么是过拟合?

  如果一个机器学习模型在训练集上表现的非常好,而在测试集上表现的不好,那么认为该模型是过拟合的。这意味着训练数据中的噪音或者随机波动也被当做概念被模型学习了,从而降低了模型的泛化能力(generalization)。
  还是举两个例子来说,回归的例子如下:
  

Overfit in regression

  可以看出,为了精确建模训练集的每个样本,最后拟合出的曲线太扭曲了。
  
  分类的例子如下:
  
Overfit in classification

  同样,为了精确分类训练集中的正负样本,决策边界扭曲的不要不要的……这个模型虽然可以百分百正确分类所有训练集样本,但也会造成模型推广时的泛化能力较差,即无法适应新的样本。
  
  综上,过拟合的特点就是良好的训练表现和糟糕的测试表现
  
  具体来说,在训练机器学习算法时(定义一个假设并利用训练集进行训练),如果把参数集调整到非常拟合训练集,那么该假设会在训练集上表现地非常好,但这并不能确定该假设在训练集之外的新样本上预测结果如何。因为,只要你的参数非常拟合某个数据集,那么该假设对于该数据集的预测误差是不能够推广到一般情况的,或者说,是不能作为实际的泛化误差(generalization error)的,即该误差不能评估该假设对于新样本的效果
  在机器学习中,避免过拟合是模型设计中的一个核心任务。我们收集整理训练数据,玩命儿调参数,各种正则化技巧,都是为了增加模型的泛化能力。
  
  来吧,让我们欣赏一些过拟合的例子!
  
Overfit example

  
Overfit example

  其实,想象力就是人类强大的过拟合能力。  
  
  在接下来的章节中,我们会重点讨论过拟合问题产生的原因和避免方法。为啥不说欠拟合?因为很容易发现和矫正。
  
  

2.3 欠拟合发生的原因?

  如上所述,欠拟合问题是非常容易发现的。一旦你发现训练的模型在训练集上表现就很差,那基本可以断定是算法处于欠拟合,你可以从以下几个角度找原因。
  1)是否是训练时迭代的次数太少?
  例如使用神经网络算法做分类任务,如果你只迭代很少的次数,那模型通常就处于欠拟合状态,因为你根本没有给算法充分的学习机会。
  
  2)是否是模型(假设函数)过于简单?
  如果算法经过了充分的迭代,但是在训练集表现依然很差,那很可能是因为模型(假设函数)过于简单了,如下图所示的分类问题。
  

Example

  
  数据的分布情况意味着你没办法用一条直线取得很好的分类效果。所以说,如果你定义只含一次项假设函数(左图的直线):
  hθ(x)=g(θ01X12X2)
  那肯定不行,再怎么训练,最后误差也会很大。
  此时,你就得增加模型的复杂度,也就是增加假设函数的特征项,例如可以从更多角度获取更多特征,或者可以扩展一些已有特征的二次项,乘积项等等。下面是扩展特征项后的假设函数(右图的曲线):
  hθ(x)=g(θ01X12X23X124X225X1X2)  
  
  这样得到的曲线就可以很好的拟合训练集。
  上面这种情况只有两个变量,所以可以通过绘图观察趋势。但对于具有很多特征变量的问题,想要通过画出假设函数来进行观察就会变得很难甚至是不可能实现。所以后面会讲一些实用的分析/诊断方法。
  
  3)是否设置了过大的lambda?
  λ 是正则化技术的核心参数,简单来说,正则化技术用于修正算法的过拟合问题(后面会展开来讲)。所以,如果你即增加了模型复杂度,又经过充分的学习,但是模型在训练集上表现还是很差,那很可能是你设置了过大的 λ 。减小 λ 试试吧!
  
  对于欠拟合问题,上述是最常见的原因,如果你判定自己训练的模型处于欠拟合状态,从上面三个角度找原因,通常是可以解决问题的。  
  
  
  

2.4 过拟合发生的原因?

  首先要明确一点认知:任何一组训练数据,都是存在噪音和随机性的。
  展开来说,

  第一点,在一定时间及空间条件下,任何观察都不可避免的存在误差,因此任何训练集都一定存在噪音数据。我们的目标就是从一堆有噪音的数据中把目标函数学习出来,并且要极力避免噪音的干扰。

  第二点,我们不可能获得任务相关的样本全集,只能获得子集,而子集可能有着自身专有的特点。任何一组子集(作为训练集)都一定存在着随机性,也就是说子集可能自身存在一些特点/专有特征,而这些特点根本就不是全集的特点(可以看作是假规律)。例如我收集了一批猫的样本给算法学习,如果恰好我收集的都是黑猫样本,那算法很可能就把黑色作为猫的主要特征之一了,以后遇到白猫就认为不是猫,这就很尴尬了。

  如果理解了上述关于样本的问题,那么就可以理解过拟合的本质:算法过度拟合了训练样本中的噪音和随机特征(或称专有细节、假特征)。
  
  判断模型是否处于过拟合状态也是比较容易的,如果一个模型在训练集上表现的非常好,而在实际测试时表现的很差,那通常就认为该模型是过拟合了。
  如果算法发生过拟合,那么可以从下面几个角度找原因。  
  
  1)是否是训练数据过少?
  如果训练集过少,那算法很容易拟合全部训练数据,但过小的训练集所含信息太少了(无法充分反映出数据真实分布情况),所以在这种情况下训练出的模型,测试效果自然就很差。
  解决这个问题的办法是扩充训练集,注意不仅仅是扩充样本数量,还需要增加样本的多样性(就是让算法模型认识更多的样本)。
  
  2)是否是模型过于复杂?
  还是用图来说明。如果你定义了非常复杂的假设函数(右图所示),那么就会学到如图中非常复杂的决策边界,这样的模型泛化能力就比较差。
  

most complex

  此时,应该尝试减少特征项。
  但之前提到的问题还是存在,就是图中的任务只有两个变量,通过绘图很容易观察拟合状况。可实际应用中,几百几千几万的特征是很常见的,这就需要某些诊断方法。
  
  3)是否设置了过小的lambda?
  后面会了解到,λ 的大小反映了在训练过程中,对假设函数中参数的惩罚力度。λ 越大,对参数惩罚力度越大,参数对应的特征项能起到的作用就越小,越有可能造成欠拟合;反之,λ 越小,则越有可能造成过拟合。
  所以说,如果算法发生过拟合,可以考虑将 λ 设置的稍大一点。
  
  

三、模型选择与数据集划分(Model Selection and Train/Validation/Test Sets)

  欠拟合问题很容易发现也相对比较好解决,而过拟合问题就困难一些,至少只从训练集上的效果,我们是没办法判断模型是否过拟合了。
  之前例子中分析过两个变量情况下的调试问题,但对于多特征变量的问题,想要通过画出假设函数的拟合曲线来进行观察就会变得很困难甚至不可能实现。
  标准的模型评估方法是:数据集划分。
  

3.1 将数据集划分成训练集和测试集

  将收集整理的数据分成两部分,第一部分作为训练集,第二部分作为测试集。一种典型的分割方法是按照7:3的比例,即70%的数据作为训练集,30%的数据作为测试集。如果这组数据有某种规律或顺序的话,那么最好是随机选择70%作为训练集,剩下的30%作为测试集。
  
  此时我们可以通过训练集得到模型参数,通过测试集得到预测误差(也就是在测试集上计算J(θ)),此时这个预测误差就可以较好的反映出我们训练得到的模型是否可以较好的拟合新样本。
  
  这种数据集划分方式似乎解决了一些问题,但也存在着不足。例如,我们在设计假设函数时候如何确定最合适的多项式次数?正则化时候如何选择最合适的正则化参数 λ ?显然在训练集上选择多项式次数和 λ 是不合适的,那么在测试集上是否合适呢?
  
  想想看,我们在训练集上拟合出参数,然后可以在测试集上验证它们是否有良好的泛化能力;那么如果我们在测试集上拟合出多项式次数和 λ ,应该在哪里验证它们是否有良好的泛化能力呢???也许读者已经注意到我这里的用词,我说“拟合出多项式次数和 λ ”,没错,任何通过数据确定参数的过程都可以看作是一个拟合问题,只要是拟合问题,都存在着过拟合的风险。因此,我们是不能用测试集来拟合多项式次数和正则化参数 λ 的,因为存在着过拟合风险。
  
 

3.2 将数据集划分成训练集、验证集和测试集  

  确定假设函数的参数、确定假设函数的多项式次数(例如用变量 d 来表示)、确定合适的正则化参数 λ 等在模型训练中都很关键,这些问题我们统称之为模型选择问题。因此,在训练过程中,除了要确定的假设函数的参数 θ 之外,还要考虑确定参数 d 和 λ ,这同样需要利用数据来确定,换句话说,这同样是一个拟合问题。
  于是,我们将数据集划分为三个部分:训练集(train set)、验证集(validation set)、测试集(test set)。
  备注:验证集有时候也可以称为交叉验证集(cross validation set)
  一种典型的分割比例是将60%的数据分给训练集,大约20%的数据给验证集,最后20%给测试集,这个比例可以稍微调整,但这种分法是最典型的。
  
  在这种数据集划分情况下,我们就可以将学习算法的训练分为两个方面:
  第一,模型选择(训练集 + 验证集)
  利用训练集来拟合参数 θ,利用验证集来拟合多项式次数 d 和正则化参数 λ ,进而构建出算法模型;
  第二,模型评价(测试集)
  利用测试集对模型进行评价,预测该假设能否能够良好地推广到新的样本上(泛化能力)。
  
  注意!在划分数据集时,一定要随机选择!
  综上,我们可以发现,数据集划分其实主要是为了解决过拟合问题。
  
  
  

参考资料

Coursera - Machine learning( Andrew Ng)
https://www.coursera.org/learn/machine-learning
Overfitting and Underfitting With Machine Learning Algorithms
http://machinelearningmastery.com/overfitting-and-underfitting-with-machine-learning-algorithms/
用简单易懂的语言描述「过拟合 overfitting」?
https://www.zhihu.com/question/32246256
推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)
http://bookshadow.com/weblog/2014/06/10/precision-recall-f-measure/
《随机性》(作者: [美] 黛博拉·J. 本内特,出版社: 吉林人民出版社)
  
  
  


  End 机器学习应用的建议-Part1

0 0
原创粉丝点击