关于机器学习你必须要了解的事情

原文:Pedro Domingos, A Few Useful Things to Know about Machine Learning

 

 1. 泛化效果是机器学习的唯一目标

训练集上的效果无关紧要,泛化效果是机器学习的唯一目标。稍极端的例子,如果训练集准确率为0%,但随机取的新数据集上准确率为60%。也好过训练集80%,新数据40%的结果。这点不仅对机器学习重要,即使是人工规则,也要审视选定的规则有没有泛化意义,仅仅让标准集效果更好或更差一样没有意义。

 

2. 机器学习算法的三维

算法除参数可设外,还有其它维度可改。任何一个机器学习算法都由三维组成:模型假设、误差评估方法(cost function)、求解方法。除第一维不可变动外(那就换模型了),后两维都是可变的。

1)模型假设(Representation)。KNN,SVM中假设特征距离近的instance是一类的;NaiveBayse假设特征条件独立;Logistic Regression假设feature对结果贡献都是线性的;等等。假设如果不对就不该选此模型,或选这些feature。

2)误差评估方法(cost function,Evaluation),即使一个模型也可以用多种cost function,决策树用熵(信息增益),或用均方差,其实也可以用准确率和错误率。哪种效果好呢?也许我们并没有考虑过,只知道C4.5是用信息增益就以为它就是唯一答案。不同的应用场景可能有不同答案。

3)求解方法(Optimization)。最优化的问题都有多种求解方法:贪心、动态规划、梯度下降、Quadratic计算。一个模型可以有多个求解方法,例如C4.5用的是贪心,贪心一定是最好的方法吗?也许出于性能考虑我们最终仍倾向于它,但每到此时不妨问问。

 

3. No free lunch

模型是一个杠杆,人的经验+data产出任一前者无法达到的能量。如果一个模型不引入任何假设就退化为记忆+统计,全赖data。但哪怕是最简单的bool型feature,有N个feature就有2^N个要学的feature种类,对应至少这么多的data,20个feature就要1024*1024个data,100个feature呢?实际中uniq的data根本没有那么多。对于那些没被data覆盖的坑,任何模型算法的效果都不会比抛硬币随机猜的效果更好(无论在训练集上拟合好坏,其泛化效果都和抛硬币一样)。这就是"no free lunch"。


即使一个模型隐含了某个假设,若输入feature无法和这些假设契合,对模型来说同样什么都学不到。因此我们必须加入人的经验,这就体现在我们利用人类知识选取哪些已知有用的feature(而不是罗列所有原始feature让模型自己挑、自己组合),同时我们知道这些feature能够直接地满足我们所选模型的假设。或者反过来,我们选择模型的一个标准是,我们是否知道该选哪些feature来很好地支持这个模型假设。 

 

4. 过拟合的帮凶

既然泛化能力为唯一目标,过拟合就是最大的罪人。当training和testing的个体(尤指features)很不一样,或者使用了一些非常灵活的模型(决策树),或者即便是不太灵活的线性模型但feature个数很大(导致train--test的features的差异更大,泛化能力变弱)时,过拟合非常容易发生,training set 和 testing set 必须严格隔开。

1)不具代表性的训练集

不过拟合才怪。训练集要尽量随机抽取。

2)模型灵活。

在数据有限的前提下,学习能力强的模型不一定比能力差的模型结果好。决策树是最强学习能力的模型(它能穷举所有feature取值组合),朴素贝叶斯则受诸多假设限制。所以只要想学到底,前者训练可以做到100%准确率0 bais,而后者则只能做到一定准确率,bais始终存在;但在数据不充分的基础上,强学习模型学得很充分,只能是依靠了很多“随机巧合”的经验,没被数据覆盖的坑的数量就是过拟合的程度。所以这个时候决策树反而不如feature符合贝叶斯假设的学习效果好,因为假设的正确性提供了额外的杠杆信息。

3)feature过多

Curse Of Dimensionality. 泛化能力会随着feature的增加而降低(确切的说是降低的可能性在增大)。增加feature能带来好处,但同时也会带来坏处。增加无关或过多feature可能让模型变得更差。因为数据集不足以cover所有feature,罕见的feature导致过拟合更容易产生,过多常见的feature会淹没真正有用的feature。而人类的直觉也只能理解到3维空间,高维空间的直觉往往是错误的。

 

5. cross-validation的正确用法

cross-validation不是用来train N个模型然后取平均做最终模型的。(大部分模型也没法取平均融合)cross-validation是用来调整模型的外部参数的。即CV是一种利用Training Set tune外部参数的方法。10-fold cross-validation实际上使用同一组外部参数train了10个模型实例,得到10个泛化准确率(分别在1/10的切片上test的准确率,而不是9/10上的training准确率),反应了当前参数setting的效果。当然也可以不用cross-validation,直接用一个独立的test set来tune参数,但是相对较小的test set更容易导致tuning的过拟合。

 

原创博文,转发请注明出处。

苏冉旭的博客,http://hi.baidu.com/hehehehello/item/99de18188408a8f8dceecaad


下面转载一篇读后总结

http://www.cnblogs.com/SnakeHunt2012/archive/2013/02/18/2916232.html


  • Learning = Representation + Evaluation + Optimization
学习 = 表示 + 评价 + 优化,这没什么可说的了。
  • 表示方法确定了你能表示的空间是哪些,取决于你的问题是什么。
  • 而评价函数为你的优化过程提供方向,其实就是一种衡量,衡量你现在的状况:好,有多好;坏,有多坏,而且通常都用你的失真程度来衡量(J(theta) = 预测值 - 实际值)。
  • 优化算法进行优化,目前我还只知道梯度下降还有求导这两种手段,当然优化方法的好坏直接决定了你训练模型的效率,如果你的损失函数J(theta)不是凸的,那么他也将决定你能不能取到最值或者取哪个极值,例如梯度下降就取不到最值,只能取极值。
作者最后还列了张表格,举了常见的表示方法,评价方法,优化方法。
  • It is Generalization that Counts
泛 化才是目标,作者这么说其实就是想地提醒我们别用训练样例做测试,除非特殊情况。因为我们要做的是泛化,也就是想从训练样例中学习到普遍规律,然后使模型 可以用于所有非测试样例。可你要是用训练样例做测试那还能叫测试了吗?这就要求我们在做训练的时候别一下子把语料都用来训练,一定要保留一部分语料用来测 试,而且这部分用来测试的语料不要以任何方式参与到训练过程当中,严格隔离。如果你的数据实在有困难,那你可以交叉测试,就是说把你的数据分成10份并且 标号,首先用第一份留做测试其余用来训练,然后用第二份留做测试用其余用来训练,然后第三份留着做测试其余用来训练,以此类推,等十次测试结束之后在将十 次的测试结果取平均作为最终的测试结果。除此之外他还说,我们训练模型无非就是自动或半自动地调节好那几个参数,就好象调节收音机上那几个旋钮一样,想要 听到清楚的节目就需要尽量调到超平面的那个最优点,我觉得这话说得很有道理。
  • Data Alone is Not Enough
作 者说光有数据还不足已。因为机器学习类似于杠杆效应,输入少量的知识,然后获得大量的知识,如果你杠杆选得好,也就是支点越靠前,就可以用更少的知识,翘 得更多的知识。所以,针对不同的领域,不同种类的知识,就需要选取合适的模型,原则是易于表示这个领域的知识。比如你的知识是依赖于概率的,那么图模型也 许是最好的选择。比如你的知识是基于前提的,也就是说每个分类都是有一个前提的,那么你就可以用"if...then..."这种方式。
  • Overfitting Has Many Faces
如果你对你数据量不足,就容易出现过拟合,过拟合往往是因为你的数据量太少或者说你的模型太复杂了。
      跟光电效应一个道理,模型建立需要基本的溢出功。我是这样理解过拟合的:我们把训练数据看作是能量。那对于一个10次多项式的模型来说,在训练的过程中可 以看做其中有10个数据的能量是用来搭建模型的,然后剩余的数据能量是用来调整这个模型使之优良,也就是使之对训练样例全体的误差合最小。然而如果你所拥 有的能量小于十个独立点的能量,也就是没有达到建立模型的那个临界。那么你训练出来的根本就不是一个模型,用这个东西进行预测得出的结果也许就效果是随机 的。
如果你的数据针对训练样例100%准确,而对于测试样例只有50%准确,那么你的学习器很有可能过拟合了。正常情况至少应该是对于训练样例和测试样例准确率都75%才对。如果把过拟合的结果画出来,看上去就好像分界面鼓起了好多气泡一样。
      总的来说模型太复杂,容易过拟合,即使可以达到过拟合临界,那么数据不足也会使得偏执比较高,但是如果数据足够的话,足够把偏执降下来的话,大模型精度是 很高的,他的方差小。如果你数据不足,你就不敢使用复杂模型,不得不使用简单模型,而简单的模型确实不容易过拟合,但他的准确度(精度)就是硬伤,偏执再 底,方差是硬伤。
      解决过拟合的办法很多,其中最长用的就是在J函数后面再加一项专门用来控制参数的“正则项”。
我的理解就是避免你的某个参数或某些参数太大,因为过拟合常常最后的形状是弯折特别多,如果遏制住参数的大小就可以避免他拐太多弯折,把你的多维曲面铺平,就好象把气泡挤了出去一样。把过拟合的程度压制在一个我们可以接受的范围内。
      但我也担心一个问题,就是添加正则项也就降低了模型本身的灵活性,所以我自己的建议是如果你很确定不会发生过拟合,或者你对你的数据非常有信心,那么去掉正则项的话你的模型会拟合的更好,当然这只是个建议。
  • Intuition Fails in High Dimensions
理论上说,特征是越多越好的,但是你没增加一个特征,其表示的空间可是以指数方式递增的,这时候你所拥有的数据量就会以指数速度变得越来越不够用。因为你所掌握的数据是恒定的,而在需求以指数递增的同时,你说掌握的那点数据,在与需求的比值以指数方式变小。
      当然,计算也是个问题。不过最严重的还是高维度下的分布问题,在高维度下,物体的的多元高斯分布的质心离物体的均值通常很远。看来我还需要补一补代数方面的知识。所以即便你的数据足够,结果也不一定对。
  • More Data Beats a Cleverer Algorithm
算法和数据哪个更重要,研究人员当然会说算法更重要,但事实上,在实际问题面前,通常找数据比选算法更快解决问题。更令你不可接受的是,一个很差的算法如果有很多的数据,优势要比高级的算法好。
      时代不同了,80年代的时候缺的是数据,现在缺的是时间,如今我们更在乎算法的速度如何,这本来对复杂模型来讲是好事,因为数据足够就意味着可以选用高级的模型,这是原则上讲,但事实上你用低级模型效果却比高级模型要好。
      我自己的理解很浅显,就是高级模型使用了更多的数据来用于“溢出功”。这就是个追击问题,跑得快的后跑,跑得慢的先跑,即使你拥有的时间足够让跑得快的开始跑,但也不一定能保证结束的时候跑得快的比跑得慢的更远。
      而文章中给出的解释更有道理一些,他给出了一副图,他说复杂的模型和简单的模型,本质上都在做相同的事,就是把类似的数据分为一类,只不过他们对类似的定 义不同,但对于不是很苛刻的测试数据,无论哪种定义都能表现得正常。因为如果测试数据并不苛刻的情况下,分界面本身的形状并不重要,重要的是他能不能位于 恰当的地方。而如果想让高级模型体现出高级性,需要的不是大量的数据而是苛刻的数据,需要的是那些贴近分界的数据,这样才能塑造好分界本身的形状,使模型 本身的形状成为优势。我记得唐都钰师兄有一次说一个比赛,他们给的标注数据特别苛刻,人都不能标注成那个样子。为什么数据给的那么苛刻,不就是为了考你用 什么模型么。如果数据不苛刻,什么样的模型都很不错。
      总的来说,如果你的数据仅仅是多,那么明智的选择还是低级模型。如果你的数据非常丰富,那么选择高级模型还是有一定的道理。文章的建议是先用小模型,然后慢慢尝试大的模型。
  • Learn Many Models, Not Just One
以前,人们普遍认为这些学习算法,还有模型都是可以比较的,相信总有一个最好的。所以当时就进行了许多尝试,想找到最好的那个。但是后来很快发现,不同应用都有不同的最合适的模型。
      所以再后来,人们就开是选择自己喜欢的算法,然后标榜自己的那个算法是最好的。这有点像今天你用Vim还是Emacs一样。
      但再再后来,人们开始发现,与其选更好的那个,不如把不同的学习器组合起来,因为这样的效果会比独立的几个学习器效果更好。
      他们发现学习器之间是可以进行集成的,集成的方法最简单的有装带法[fn:5]其他的还有堆叠法(stacking)等等。话说在一次比赛[fn:6] 中,最终获胜的两个团队的学习器都是组合出来的,他们都合并了100多个学习器,而且如果他们两个再进行合并的话,效果会更好。
  • Simplicity Dose Not Imply Accuracy
本 来,按照奥坎姆剃刀原理,两个分类器如果训练误差相同的话,那么往往简单的那个分类器测试误差更小,而且还有好多文献证明这个说法。但事实上这种说法误解 了奥坎姆剃刀原理,奥坎姆剃刀原理说简单好,只是处于“道德和伦理”。如果你想看反例,刚才那个学习器集成就是个反例。
  • Representable Dose Not Imply Learnable
一个函数可以进行表示,并不意味着他就可以进行学习。比如标准决策树就不能学习出比样例多的节点。即使最简单的函数也许要无数的项来表示它。而且我们的数据不是无穷的,我们的时间不是无穷的,我们的内存也不是无穷的,大多数可表示的函数都不能进行学习。
      所以对于一个函数,你应该考虑的不只是他能不能表示出来,还有他能不能进行学习。多尝试一些学习器总是好的。
  • Correlation Does Not Imply Causation
相关性不是因果关系,确实如此,我们的机器学习学到的往往是相关性,而非因果关系。但是有时候我们自己却很难分辨哪些现象是因果,哪些现象是相关。我们需要在相关中分析因果。
      也许相关和因果两者并没有本质的区别,因为在物理世界对他们都没有良好的定义,这是哲学的领域了。但我们要做的是预测什么样的行为会导致什么样的后果,这就是我们所在乎的“因果”。



猜你喜欢

转载自blog.csdn.net/jiandanjinxin/article/details/24713815