机器学习栏目记录我在学习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
机器学习算法的应用其实是个经验活儿,靠的是日积月累的不断试错和积累。课程里给出了机器学习算法应用中常用的准则、技巧和建议,不过想要全面理解和掌握这些建议,需要反复练习。
-
当我们针对某个任务训练回归/分类模型时,如何判断模型的性能好坏是极其重要的。以课程中的例子来说明,我们利用线性回归算法来训练房价预测模型,定义了假设函数 H(x) 和 J(θ),那么我们该如何判断训练出的模型到底性能如何呢?
Accuracy/Precision/Recall/misclassification rate/missing alarm/false alarm/F1 Score
这里列出几项在二分类模型中常用的性能评价指标及其计算方式。先明确true positives(真正类)、true negatives(真负类)、false positive(假正类)、false negative(假负类)的概念,如下所示。
机器学习中的算法性能评价指标有很多,上面也只是常用的一些。在实际任务中并不是每个指标都被关注,不同的任务侧重不一样,关注的指标也就不同。例如,有的任务可能对虚警容忍度较高(可以多误报一些),但是对召回率或者漏报率要求很严格(绝对不能漏报),那么我们在训练模型和设置判定阈值的时候,就要侧重Recall指标。
而在有些任务中更侧重虚警率和计算速度,比如在我负责的有害图像审核系统中,业务部门就更关注虚警率和速度,为什么呢?因此互联网的数据量实在太大,一天动辄就上千万,那么速度很重要就不必说,同时虚警率是绝对要压低的,因为1%的虚警率就意味着误报10w+的样本(复审小组就要累死了……)。所以我们在有害信息识别系统中,模型的虚警率一般都得至少控制在0.3%以下(这其实也比较高了,但是海量数据环境下,误报真的是很棘手的问题)。
从评价指标的计算方式就可以看出,各个指标之间是很难兼顾的,通过努力调参,可能某一项指标好了,另一项指标就会变差。因此,在训练分类器模型的时候,一定要搞清楚任务侧重点什么,只有充分考虑业务的实际需求,才能训练出一个实用的算法模型。
评价指标罗列了一大堆,也许还是搞不清楚怎么评价一个机器学习模型。其实无论在实验还是应用中,我们评价一个模型时,大多数时候都是在讨论这个模型是否过拟合或者欠拟合,也就是方差和偏差问题,然后据此再更换算法或者调整参数。
其实Underfit和Overfit贯穿机器学习,是机器学习的核心问题:偏差-方差权衡。机器学习算法应用的整个过程,每个处理技巧和应用环节也都是围绕着此问题进行。同时,Underfit和Overfit问题也是Ng在这节课里的主要线索。
下面对Underfit和Overfie先做一个简单直观的介绍。关于欠拟合和过拟合更深层次的讨论放在后面阐述。
机器学习算法表现很差的原因,要么是模型发生了过拟合,要么是发生了欠拟合。下面一张图涵盖所有情况(包括回归和分类)。
如果一个机器学习模型在训练和预测时表现的都不好,那么认为该模型是欠拟合的。通常来说,如果我们在训练时发现模型在训练集上的误差很大,那基本就可以判断该模型是欠拟合的,也就是模型未考虑足够的信息,从而无法对训练数据精确建模(所以产生欠拟合)。
举个回归的例子如下:
如果一个机器学习模型在训练集上表现的非常好,而在测试集上表现的不好,那么认为该模型是过拟合的。这意味着训练数据中的噪音或者随机波动也被当做概念被模型学习了,从而降低了模型的泛化能力(generalization)。
还是举两个例子来说,回归的例子如下:
如上所述,欠拟合问题是非常容易发现的。一旦你发现训练的模型在训练集上表现就很差,那基本可以断定是算法处于欠拟合,你可以从以下几个角度找原因。
1)是否是训练时迭代的次数太少?
例如使用神经网络算法做分类任务,如果你只迭代很少的次数,那模型通常就处于欠拟合状态,因为你根本没有给算法充分的学习机会。
2)是否是模型(假设函数)过于简单?
如果算法经过了充分的迭代,但是在训练集表现依然很差,那很可能是因为模型(假设函数)过于简单了,如下图所示的分类问题。
首先要明确一点认知:任何一组训练数据,都是存在噪音和随机性的。
展开来说,
第一点,在一定时间及空间条件下,任何观察都不可避免的存在误差,因此任何训练集都一定存在噪音数据。我们的目标就是从一堆有噪音的数据中把目标函数学习出来,并且要极力避免噪音的干扰。
第二点,我们不可能获得任务相关的样本全集,只能获得子集,而子集可能有着自身专有的特点。任何一组子集(作为训练集)都一定存在着随机性,也就是说子集可能自身存在一些特点/专有特征,而这些特点根本就不是全集的特点(可以看作是假规律)。例如我收集了一批猫的样本给算法学习,如果恰好我收集的都是黑猫样本,那算法很可能就把黑色作为猫的主要特征之一了,以后遇到白猫就认为不是猫,这就很尴尬了。
如果理解了上述关于样本的问题,那么就可以理解过拟合的本质:算法过度拟合了训练样本中的噪音和随机特征(或称专有细节、假特征)。
判断模型是否处于过拟合状态也是比较容易的,如果一个模型在训练集上表现的非常好,而在实际测试时表现的很差,那通常就认为该模型是过拟合了。
如果算法发生过拟合,那么可以从下面几个角度找原因。
1)是否是训练数据过少?
如果训练集过少,那算法很容易拟合全部训练数据,但过小的训练集所含信息太少了(无法充分反映出数据真实分布情况),所以在这种情况下训练出的模型,测试效果自然就很差。
解决这个问题的办法是扩充训练集,注意不仅仅是扩充样本数量,还需要增加样本的多样性(就是让算法模型认识更多的样本)。
2)是否是模型过于复杂?
还是用图来说明。如果你定义了非常复杂的假设函数(右图所示),那么就会学到如图中非常复杂的决策边界,这样的模型泛化能力就比较差。
欠拟合问题很容易发现也相对比较好解决,而过拟合问题就困难一些,至少只从训练集上的效果,我们是没办法判断模型是否过拟合了。
之前例子中分析过两个变量情况下的调试问题,但对于多特征变量的问题,想要通过画出假设函数的拟合曲线来进行观察就会变得很困难甚至不可能实现。
标准的模型评估方法是:数据集划分。
将收集整理的数据分成两部分,第一部分作为训练集,第二部分作为测试集。一种典型的分割方法是按照7:3的比例,即70%的数据作为训练集,30%的数据作为测试集。如果这组数据有某种规律或顺序的话,那么最好是随机选择70%作为训练集,剩下的30%作为测试集。
此时我们可以通过训练集得到模型参数,通过测试集得到预测误差(也就是在测试集上计算J(θ)),此时这个预测误差就可以较好的反映出我们训练得到的模型是否可以较好的拟合新样本。
这种数据集划分方式似乎解决了一些问题,但也存在着不足。例如,我们在设计假设函数时候如何确定最合适的多项式次数?正则化时候如何选择最合适的正则化参数 λ ?显然在训练集上选择多项式次数和 λ 是不合适的,那么在测试集上是否合适呢?
想想看,我们在训练集上拟合出参数,然后可以在测试集上验证它们是否有良好的泛化能力;那么如果我们在测试集上拟合出多项式次数和 λ ,应该在哪里验证它们是否有良好的泛化能力呢???也许读者已经注意到我这里的用词,我说“拟合出多项式次数和 λ ”,没错,任何通过数据确定参数的过程都可以看作是一个拟合问题,只要是拟合问题,都存在着过拟合的风险。因此,我们是不能用测试集来拟合多项式次数和正则化参数 λ 的,因为存在着过拟合风险。
确定假设函数的参数、确定假设函数的多项式次数(例如用变量 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