关于机器学习必需要了解的几个要点(A Few Useful Things to Know about Machine Learning)

关于机器学习必需要了解的几个要点

(A Few Useful Things to Know about Machine Learning)html

本文翻译自华盛顿大学Pedro Domingos的文章《A Few Useful Things to Know about Machine Learning》,非专业翻译,因兴趣而作,若有误解请指正!原文连接:
http://homes.cs.washington.edu/~pedrod/papers/cacm12.pdfpython

如下是正文:git

摘要

机器学习算法能够经过推广示例来完成不少重要的任务。这种灵活、高效的特色是手工编写程序来完成任务所不具有的。数据越多,机器学习就可以解决更加复杂的问题,因此它被普遍应用于计算机科学和众多领域。然而,想要成功开发出实用的机器学习算法,须要不少书本中没有提到的技巧。本文列出了机器学习行家从经验中总结的十二个要点。这些要点包括了一些须要避免的陷阱,须要关注的问题以及一些常规问题的解答。github

简介

机器学习算法自动地从数据中学习,过去的几十年里,它被普遍应用于各个领域。其中就包括了网络信息检索,垃圾邮件分类,推荐系统,广告投放,信用评分,诈骗检测,股票交易,药物设计,等等。最近McKinsey Global Institute声明,机器学习将会带来下一波科技进步的浪潮。现在,已经有很多介绍机器学习算法的优秀书籍,但是这些书中并无介绍那些对于成功实现机器学习应用很是重要的“通俗知识”。结果是,人们在开发机器学习相关项目的时候,花了太多没必要要的时间,却没有获得最理想的效果。这就是本文的出发点。web

机器学习算法能够有不少种分类,可是为了方便介绍个人观点,本文中我主要关注在普遍应用的一类机器学习算法:分类算法(classification)。然而,我在文中讨论的各类观点一样适用于其余类型的机器学习算法。所谓分类算法指的是在一个系统中,系统的输入是一个连续或者离散的向量,而输出是单个的离散值,这个离散值就是分类结果(class)。例如,在垃圾邮件分类系统中,垃圾邮件能够被分为两类:垃圾邮件和非垃圾邮件。该系统的输入是一个布尔类型的向量 x=(x1,...,xj,...,xd) ,其中,若是邮件中出现了字典中第j个词,那么 xj=1 ,不然 xj=0 。给学习器输入训练数据, (xi,yi) ,其中 xi=(xi,1,...,xi,d) 是输入的特征, yi 是对应的输出。学习器能够经过训练,获得一个分类器。要测试学习器好很差,就要把测试数据输入到分类器,而后计算分类偏差(有多少比例的垃圾邮件被正确地分类)。算法

学习=表示+评价+优化

假设你想经过机器学习算法在你的项目中获得比较好的效果,首要的问题是,有太多的机器学习算法,到底应该选择哪个?绝不夸张地讲,现在已经有上千种算法,每一年还会有上百种新的算法出现。防止本身迷失在算法中的关键,是要记住,任何算法都只是如下三个部件的组合:编程

  • 表示
    • 一个分类器必定可以表示成计算机能够看懂的语言。选择学习器的表示方法,就等同于选择了一系列分类器,从中咱们能够经过学习获得最终的分类器。这个分类器的集合就叫学习器的假设空间。若是一个分类器不在假设空间中,那么它就不可能经过学习获得。这与另外一个问题–输入特征的选择有关,咱们将在以后的部分讨论。
  • 评价
    • 评价函数是用来从一堆分类器中挑选出好的分类器。一般为了方便优化,咱们实际使用的评价函数与真实的评价函数有必定的差异,关于这一点,在下一部分会讲到。
  • 优化
    • 最终,咱们须要有一个方法,从众多的分类器中找出那个评分最高的分类器。优化算法是学习器执行效率的关键,并且还能够用来判断分类器是否存在不止一个最优解。初学者能够先使用成熟的优化算法,熟悉流程以后,再根据须要进行定制。

表1展现的是上述三个部件的例子。好比,k近邻经过寻找k个最接近的训练样本,对样本中的主要成分进行分类。 基于超平面的方法对于每一类进行特征线性组合,而后根据这些组合进行分类。决策树在其中的每个节点上测试一种特征,树枝表明了不一样的特征值范围,决策树的决策结果就在树叶上。算法1展现了决策树的训练流程,其中用到了信息增益和贪婪搜索。信息增益 InforGain(xj,y) 也就是特征 xj 和类y的互信息。函数 MakeNode(x,c0,c1) 的返回值是一个用于检测特征x的节点,对于x=0的特征,其子节点对应的训练集是 TS0 ,对于x=1的特征,其子节点对应的训练集是 TS1
固然了,并非说表1中任意三个部件的组合都能构成有价值的算法。例如,用离散变量表示的模型,就要用组合优化算法;而用连续变量表示的模型,则须要用连续优化算法。不过,许多学习器既有连续的也有连续的,也许不远的将来,表1中的任何一种组合方式组合出来的学习方法,都是有意义的。
大部分的教材,都主要是在介绍表示方式,这很容易让人忽略其余两个重要的部件(评价和优化),然而这三个部件是同等重要的。如何选择每一个部件,没有诀窍。不过下一部分咱们将介绍一些选择的原则。而且,从接下来的内容中,咱们能够知道,在完成机器学习任务的过程当中,咱们的某些选择远比算法自己重要。浏览器

泛化

机器学习最基本的价值所在,就是咱们能够将其用于训练样本以外的其余数据,也就是泛化。这是由于,不论咱们拥有多少数据,都很难将全部可能出现的数据用于训练(好比说,在垃圾邮件中,可能出现的单词一共有10000个,那么垃圾邮件中出现单词的组合,就有 210000 种可能)。在训练集上得到好的结果很容易(最直接的方法就是让学习算法记住全部的训练样本)。机器学习初学者常犯的错误就是,觉得在训练集上获得好结果就万事大吉了。但是一旦将这些分类器用于其余数据,你会发现分类结果与随机猜想的结果差异不大。因此若是你请别人帮你设计分类器,请记得将你的数据集中的一部分做为训练集,用来测试他给你的分类器是否好用。反过来说,若是有人请你来设计分类器,请在一开始就从数据集中划分出来一部分留做测试数据,在你利用其他的数据训练而且获得了分类器以后,再把这些数据拿出来使用。
用一些隐蔽的方法,你能够把测试数据混合进你的分类器中,好比说在调参的过程当中使用测试集的数据进行拟合(机器学习中有不少相似的小把戏,这种事情时有发生,因此对于这些细节咱们必须更加注意)。固然了,采用保留一部分数据做为测试集的方法,会致使用于训练的数据减小。咱们能够采用“交叉验证”的方式进行弥补。“交叉验证”的过程以下:首先随机将整个数据集分为十份,每一次训练,将其中的九份用于训练,剩下一份用于测试。这样进行十次,把十次的结果取平均,就能够知道你用的学习算法好很差了。
在早期,机器学习过程当中将训练集和测试集分开并无被普遍接受,这是由于当时的学习器可以拟合出的超平面维度有限,这样很难彻底将样本区分开,这就致使了在训练集和测试集上的结果差很少,当时的人们也就认为没有这么作的必要了。可是随着机器学习研究的深刻,学习器愈来愈复杂、易变(好比决策树),甚至是线性分类器在使用了大量特征以后也有了这样的特性,此时训练集与测试集分离也就成了必须。
若是将泛化做为目标,那么就会致使一个颇有意思的结果。这不像其余的优化问题,由于咱们不知道咱们的优化函数是什么。在训练过程当中,咱们不得不假定训练偏差就是测试偏差,然而这存在潜在的问题。如何解决这个问题,咱们将在接下来的部分中讲到。让咱们积极地考虑这个问题,优化函数仅仅是咱们对于真实状况的假定,实际状况是,咱们并不必定要完全地按照优化函数来。事实上,有时候经过贪婪搜索获得的局部最优解甚至会比全局最优解更好。缓存

数据

将泛化做为目标,带来了另外一个问题:不论用了多少数据,都是不够的。这样想一想吧:咱们想要对100个变量进行拟合,使用了一百万个数据样本,那么咱们至少有 210026 的数据没有包含在样本中。这种状况下,咱们怎么才能知道剩下的这些数据是属于哪一类呢?因为没有多余的信息,咱们也就只能瞎猜了。200年前哲学家David Hume首先观察到了这个问题,然而这么多年后的今天,仍有人在使用机器学习算法时由于忽略了这个问题而犯错。为了可以泛化,任何学习器都会或多或少地包含一些训练数据并无告诉它的信息。Wolpert在他著名的“没有免费的午饭”的理论中,以另外一种方式说出了这个道理:没有任何一个这样的学习器,其针对全部可能的优化函数学出的分类器,均可以瞎猜的方式更好。
译者:在这个问题上表现好的算法,用在另外一个问题上就可能表现不好,任何算法在统计意义上都差很少,因此只有合适某个特定问题的算法,没有所谓的最好算法可以在各类问题上都比其余算法好。关于此理论能够查看资料:
https://en.wikipedia.org/wiki/No_free_lunch_theorem
http://blog.sciencenet.cn/blog-286797-446192.html

这彷佛是个使人沮丧的答案:既然如此,那咱们搞机器学习还有什么意义呢?瞎猜就行了嘛!幸运的是,在现实世界里,咱们遇到的问题所需的优化函数并非均匀分布的。事实上,不少通用的假设,好比平滑性、类似的数据更有可能属于同一个类、数据之间有限的相关性、有限的复杂度等等,都能带来很好的效果。这也就是机器学习被普遍使用的缘由。概括演绎是一种得到知识的手段:它可让你经过少许的信息得到大量的额外信息。概括法比演绎法更增强大,它只须要不多的知识就能够获得有用的结果,不过,为了可以获得正确的结果,仍是须要给它足够的信息的。无论咱们用任何一种手段来得到额外的知识,咱们给它的信息越多,咱们可以从中得到的知识也就越多。
从上面的论述咱们能够获得一个结论:在机器学习中,选择表示方法的标准在于,利用这种表示方法,可以传达出什么样的信息。好比,若是咱们知道在咱们的问题中样本有哪些共同点,此时采用从实例出发的方法就是一个很好的选择。若是咱们知道数据的几率相关性,选择图模型就很合适。若是咱们知道在何种前提下,样本会归为哪一类,就能够选择“If… Then… ”的判别方法。从这个角度上讲,最有用的学习器并非生拉硬拽一些假设进来,而是其用到的各类假设能够准确地表述出其中的道理,各类假设各有特色各不相同,并且能够有机地结合在一块儿。
在机器学习中须要额外的知识,这并不奇怪。由于机器学习不是魔法,它不可能在什么都不知道的状况下就给你想要的结果。它的做用是,从有限的知识中扩充出更多的有用知识。工程老是有这样的特色,就像编程须要大量的努力才能从底层创建起整个系统。而机器学习就好像种地,不少工做都是天然地发生的。种地的时候,咱们要把种子种在地里,而后施肥。机器学习则是利用已有的知识,再结合上数据,获得更多的知识。安全

过拟合

若是咱们手中拥有的知识和数据并不足以让咱们获得理想的分类器怎么办?这种状况下,咱们极可能获得的是一个幻想中的分类器,与真实状况相去甚远,它把数据中的巧合当真了。这就是过拟合,也是困扰机器学习的一件事情。若是你的学习器能够在训练集中获得100%的准确率,可是只能在测试集中获得50%的准确率,而在理想状况下它不论在训练集仍是测试集中都应该得到75%的准确率,此时就发生了过拟合。
在机器学习领域,每一个人都据说过过拟合,可是它会以多种形式出现并且有时候并无那么容易被发现。一种理解过拟合的方式是把泛化偏差分解为偏置(bias)和方差(variance)。偏置是指学习器老是反一样的错误,而方差是指学习器作出的决断与输入信号无关,是随机的。图1就展现了这个问题。
图1. 偏置和方差
若是线性分类器没法彻底制造分割两类的超平面,就会出现偏置。决策树模型就不会有这样的问题,由于它理论上来讲能够产生任意超平面的划分,可是从另外一个角度来看,它一般有较大的方差。由一样的现象引出的问题,在不一样的数据集上训练,决策树模型会获得彻底不一样的结果,而理论上来讲,它们应该是同样的。基于类似的道理,在选择优化算法时,束搜索比贪婪搜索有更低的偏置,但有更高的方差,由于它用到了更多的假设。所以,与咱们的直觉相反,真正优秀的分类器不必定要比差的分类器表现更好。
正如图2展现的,即便真实状况是:分类器是一系列的判决组成的,在训练样本不到1000个的时候,朴素贝叶斯分类器比判决分类器精确度更高。
图2
在机器学习中,这样的状况时有发生,较强的错误假设会比较弱的正确假设表现更好,这是由于后者须要更多的数据来避免过拟合。交叉验证有助于减弱过拟合,好比能够将决策树设定到合适的大小。然而这并非万能的,由于若是咱们人为的设定了过多的参数,模型自己就必定会发生过拟合。
除了交叉验证以外,还有其余各类方式来预防过拟合。其中最经常使用的方法是在评价函数中加入正则项。这样能够对于过于复杂的模型进行处罚,于是系统更容易产生结构简单的模型。另一种方式是在加入新的结构以前经过卡方验证来检验统计显著性,以此来判断加入此结构是否有助于提高效果。当数据不足时,这些方法很是有用。然而,若是有谁生成某种方法能够彻底“解决”过拟合问题,你应当持怀疑态度。由于很容易就从过拟合变成欠拟合。想要同时作到避免过拟合和欠拟合须要设计出完美的分类器,然而根据“天下没有免费的午饭”原理,在没有足够知识的前提下,没有任何一个分类器可以在各类状况下都表现最好。
一个关于过拟合的误解是,认为它是噪声形成的,好比说训练样本的标签标错了。这确实会让过拟合加剧,由于这会让学习器产生出变换反复的决策面,以知足这些样本的标定。可是在没有噪声的状况下, 也可能发生严重的过拟合。例如,假设咱们有一个布尔型分类器须要把训练集中的正样本找出来(换句话说,分类器以析取范式的方式,将训练集中样本的特征结合起来)。这个分类器将训练集中的样本正确分类,而将测试集中的正样本所有错误分类,不管训练集中有没有噪声。
多重假设检验与过拟合十分相关。标准的统计检验一次只能检验一种假设,而学习器能够同时检验百万种。结果是,看上去很重要的假设也许实际上并无多重要。例如,若是有一家信托基金公司连续十年业绩领先于业内,你会以为它很厉害,可是若是仔细一想,若是每一年任何一家公司都会有50%的几率领先,那么它就有可能很幸运地连续十年领先。这个问题能够经过加入一系列的假设,作显著性测试来判断,但一样会带来欠拟合的问题。一种更加有效的方式是控制错误接受的比例,也称为错误发现率。

高维度

除了过拟合,机器学习中最大的问题就要数维度的诅咒了。这种表述在1961年由Bellman提出,主要是想说明以下事实:不少在低维度处理时很是有效的算法,一旦输入换成高维度输入,算法就没法获得理想的结果。不过在机器学习领域,维度的诅咒这个词还有更多的含义。正确地泛化随着维度的升高指数级地越变越难,这是由于固定数目的训练集只包含了整个空间中很小的一部分。甚至一个中等维度的训练集(好比100维),有很大数量的训练样本(好比10亿个样本),其只覆盖了全空间中样本数量的大概 1/1018 。这也是机器学习很重要可是也很可贵缘由。
更为要命的是,机器学习依赖的基于类似度的推理,也随着维度升高而变差。咱们来看一个以Hamming距离做为度量的最近邻聚类模型,而且假设其特征只有 x1,x2 。若是样本中不包含无关的特征,这自己是一个很简单的问题。可是若是样本特征还有 x3,...,x100 ,其噪声足以扰乱 x1,x2 的信息,这就会致使最近邻聚类模型作随机的分类。
更加使人烦恼的是,即便说这100个特征是相关的,最近邻模型依然会遇到问题。这是由于,高纬度下全部的样本看上去都差很少。 好比说样本在规则网格中分布,咱们能够考虑一个测试样本 xt 。若是这个规则网络是d维的,那么 xt 的2-d最近邻离它的距离都是相等的,可是随着维度增长,愈来愈多的样本成为 xt 的最近邻,使得最近邻的选择(也就是这个类)变得随机。

==========================

未完待续。。。

==========================
本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:

  • Markdown和扩展Markdown简洁的语法
  • 代码块高亮
  • 图片连接和图片上传
  • LaTex数学公式
  • UML序列图和流程图
  • 离线写博客
  • 导入导出Markdown文件
  • 丰富的快捷键

快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入连接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提高标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重作 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它容许人们使用易读易写的纯文本格式编写文档,而后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不一样的标题,将某些文字标记为粗体或者斜体,建立一个连接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了不少好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目 价格
Computer $1600
Phone $12
Pipe $1

可使用冒号来定义对齐方式:

项目 价格 数量
Computer 1600 元 5
Phone 12 元 12
Pipe 1 元 234

定义列表

Markdown Extra 定义列表语法:
项目1
项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter ... prompt'''

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为: Γ(n)=(n1)!nN
  • 块级公式:

x=b±b24ac2a

更多LaTex语法请参考 这儿.

UML 图:

能够渲染序列图:

Created with Raphaël 2.1.0 张三 张三 李四 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说: 忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.0 开始 个人操做 确认? 结束 yes no
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即便用户在没有网络的状况下,也能够经过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor便可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程当中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常状况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户能够选择 把正在写的博客保存到服务器草稿箱,即便换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议你们使用较新版本的Chrome。
  2. IE9如下不支持
  3. IE9,10,11存在如下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 这里是 脚注内容.