第一节课
阅读文献《A Few Useful Things to Know About Machine Learning
》
转自这篇
【原题】A Few Useful Things to Know About Machine Learning
【译题】机器学习的那些事
【作者】Pedro Domingos
【译者】刘知远
【说明】译文载于《中国计算机学会通讯》 第 8 卷 第 11 期 2012 年 11 月 ,本文译自Communications of the ACM 2012年第10期的“A Few Useful Things to Know About Machine Learning”一文。
机器学习系统自动地从数据中学习程序。与手工编程相比,这非常吸引人。在过去的20年中,机器学习已经迅速地在计算机科学等领域普及。机器学习被用于网络搜索、垃圾邮件过滤、推荐系统、广告投放、信用评价、欺诈检测、股票交易和药物设计等应用。
麦肯锡全球研究院(the McKinsey Global Institute)最近一份报告指出,机器学习(又称数据挖掘或者预测分析)将驱动下一轮创新【15】。现在已经有几本优秀的机器学习教材书可以供感兴趣的研究者和实践者使用(例如米切尔(Mitchell)和维滕(Witten)等人的教材【16,24】)。但是,成功使用机器学习所应掌握的大量“民间知识”并没有出现在这些教材中。因此,很多机器学习项目浪费了大量时间,甚深入了解所需的“民间知识”可推进机器学习的应用。至最终也没有得到理想的结果。其实这些“民间知识”非常容易理解。本文的目的就是介绍这些知识。
机器学习有许多不同的类型,但为了展示方便,本文将主要介绍其中最常用的类型:分类。但是,本文所探讨的问题适用于所有的机器学习类型。一个分类器(classifier)是一个系统,系统输入是一个包括若干离散或连续的特征值(feature values)的向量,系统输出是一个离散值,代表分类的类别(class)。例如,一个垃圾邮件过滤器会将邮件信息分类到“是垃圾邮件”和“不是垃圾邮件”两个类别中。它的输入可以是一个布尔向量 x=(x1,…,xj,…,xd) ,其中如果词典中的第 j 个词出现在该邮件中,则 xj=1,否则 xj=0 。一个学习器将一个训练集(trainingset)样例 (xi,yi) 作为输入,其中xi=(xi,1,…,xi,d) 是观察到的输入,yi 是相应的输出,学习器的输出是一个分类器。对学习器的检验就是判断它输出的分类器是否能够对将来的输入样例 xt 输出正确的 yt(例如,垃圾邮件过滤器是否能够将训练时没有见过的邮件信息正确分类)。
学习=表示 + 评价+ 优化
假设有一个应用,你认为机器学习有可能在其中发挥作用。那么,你面临的第一个问题是各种机器学习算法令人眼花缭乱。应挑选使用哪一个?现在有成千上万的机器学习算法,每年还有成百上千的新算法发表出来。免迷失在这么多算法中的关键是,要认识到这些算法都是由三个部分组成的,分别是:
表示(Representation)
一个分类器必须用计算机可以处理的某种形式语言来表示。反过来讲,为学习器选择一种表示,就意味选择一个特定的分类器集合。学习器可能学出的分类器只能在这个集合中。这个集合被称为学习器的假设空间(hypothesis space)。如果某个分类器不在该空间中,它就不可能被该学习器学到。与此相关的一个问题是如何表示输入,即使用哪些特征,本文稍后介绍。
评价(Evaluation)
我们需要一个评价函数(亦称为目标函数或打分函数)来判断分类器的优劣。机器学习算法内部使用的评价函数和我们希望分类器进行优化的外部评价函数有所不同。这是为了便于优化,接下来会讨论。
优化(Optimization)
最后,我们需要一个搜索方法,能够在假设空间中找到评价函数得分最高的那个分类器。优化技术的选择对学习器效率至关重要;而当评价函数有多个最优结果时,优化技术也有助于从中选择。初学者通常会采用现成的优化方法,之后再用定制专门的优化方法来替代。表 1 展示了三个组成部分常见的例子。例如,对一个测试样例, k-近邻方法会寻找它的 k 个最相似的训练样例,并将这些样例中出现最多的类别作为该测试样例的类别。超平面方法会为每一个类别构造一个特征的线性组合,并将得分最高的组合所对应的类别作为预测结果。决策树方法会在树上的每个内部节点测试一个特征,每个特征值会对应一个分支,而不同的叶子节点会对应不同的类别。算法 1 展示了一个极简单的二分类决策树学习器,其中使用了信息增益(informationgain)和贪心搜索(greedysearch)【20】。InfoGain(xj,y ) 表示特征 xj 与类别 y 之间的互信息(mutualinformation)。 MakeNode(x,c0,c1 ) 会返回一个测试特征 x 的节点,该节点以 c0 作为 x
= 0 时的孩子节点,以 c1 作为 x
= 1 时的孩子节点。
机器学习
机器学习
当然,并不是表 1 中从各列选出元素的相互组合都同样有意义。例如,离散表示很自然地与组合优化相结合;而连续表示则与连续优化相结合。然而,很多学习器同时包含离散和连续的部分。实际上,所有可能的组合也都快被实现过了。
大部分教科书是以表示为视角组织内容的。这通常会让人忽略掉一个事实,即其他部分也同样重要。虽然对如何在每个部分做出选择并没有简单的秘诀,但本文将涉及其中几个重要的问题。正如我们以后会看到的那样,机器学习项目中的某些选择甚至比学习器的选择更加重要。
泛化(Generalization)很重要
机器学习的基本目标是对训练集合中样例的泛化。这是因为,不管我们有多少训练数据,在测试阶段这些数据都不太可能会重复出现。(注意,如果在词典中有 100000个词,前述垃圾邮件过滤器将会有种 2100000 种可能的不同输入)。
在训练集上表现出色其实很简单(只要记住这些训练样例即可)。机器学习初学者最常犯的错误是在训练数据上做测试,从而产生胜利的错觉。如果这时将选中的分类器在新数据上测试,它往往还不如随机猜测准确。因此,如果你雇人来训练分类器,一定要自己保存一些数据,来测试他们给你的分类器的性能。相反,如果你被人雇来训练分类器,一开始就应该将一部分数据取出来,只用它们来测试你选择的分类器性能,接下来再在整个数据上学习你最终的分类器。
你的分类器可能会在不知不觉中受到测试数据的影响,例如你可能会使用测试数据来调节参数并做了很多调节(机器学习算法有很多参数,算法成功往往源自对这些参数的精细调节,因此这是非常值得关注的问题)。当然,保留一部分数据用于测试会减少训练数据的数量。这个问题可以通过交叉验证(cross – validation)来解决:将训练数据随机地等分为若干份(如 10份),其中的每一份均可用作测试,而剩下的数据用作训练,然后将每个学习的分类器在它没见过的样例上进行测试,将测试结果取平均后,就可用来评价不同参数设置的性能。
仅有数据还不够
将泛化作为目标带来的另外一个重要结果是,仅有数据还不够,无论你有多少。考虑要从100万样例中学习一个包含 100个变量的布尔函数。此时将有2100 – 106 个样例的类别是不知道的(注:这里2100 表示 100个布尔变量的所有可能情况的个数,而106表示已经看到的100万样例,因此有 2100 -106 个可能情况是没有看到过的,因此也不知道它们的类别)。你如何确定那些样例的类别呢?在没有更进一步信息的情况下,除了抛硬币随机猜之外将束手无策。哲学家大卫 ·休谟(David Hume)在 200多年前首次指出这一问题(以某种不同的形式),但直到今天机器学习中的很多错误仍是由于没有意识到这一问题造成的。每个学习器都必须包含一些数据之外的知识或假设(assumption),才能够将数据泛化。这一概念被沃尔伯特(Wolpert)形式化为