阅读须知:本文为 Pedro Domingos论文《A Few Useful Things to Know about Machine Learning》的笔记。论文以分类为例,讲述机器学习的12个实践技巧。要求阅读者有一定机器学习的基础知识和实践经验。
1. Learning = Representation + Evaluation + Optimization(学习=表示(或称建模)+评价+优化)
表示:表示是在假设空间(hypothesis space)里找到能拟合训练数据的学习器(learner);
评价:通过评价函数分数的高低,来区分学习器的好坏;
优化:优化方法用于在假设空间中寻找评价函数分数高的学习器,其很大程度地决定了学习器的效率。
表1为一些常用的表示,评价和优化方法
2. 泛化(Generalization)能力非常重要
机器学习的基本目标是在训练数据中学习规律(拟合函数),然后将学习到的规律应用(泛化)到测试数据中。现在的大部分机器学习项目,特征数较多,样本空间很大,我们很难收集到足以覆盖整个样本空间的训练数据。举例来说,假设我们有100个特征(这在机器学习项目里很常见),即使这些特征都只是二元特征,那么我们也需要搜集2^100(约10^30)个训练数据才能覆盖整个样本空间,这基本不可能做到。我们希望学习器在未知的测试数据中表现好,而不是仅仅在训练数据中表现好。(如果我们需要学习器在训练数据中表现好,我们只需要记下每个训练数据对应的标签(label)即可,然而这没有什么意义。)我们只能在学习器建立彻底完成后,才可以拿测试数据去测试学习器。学习器建立完成之前,不能拿测试数据去污染学习器,比如拿测试数据去调参(tuning)。以前的项目特征数少,样本空间不大,数据可以覆盖相当一部分样本空间,训练数据和测试数据差别不大,此时没有必要将训练数据和测试数据分开。我们在学习过程中,试图去优化训练数据的目标函数,而非测试数据的目标函数(因为我们不知道测试数据),这会造成有些情况下我们尽可能地优化训练数据,其反而在测试数据中表现不好,这就是过拟合现象。
3. 只有数据是不够的
假设我们有100个二元特征,100万个数据样本,那么我们在样本空间里有2^100-10^6(约10^30)个数据样本不知道其标签。如果我们没有任何其它信息,那只能纯粹地随机分类。但是现实世界的数据通常不是均匀分布的。一些简单的通用假设:如光滑(smoothness),相近数据有相近类别(similar examples having similar classes),特征间有限的依赖(limited dependences),有限的复杂性(limited complexity),便足以让机器学习取得成功。一个推论,假如我们知道这些规律(或者知识,knowledge)如何表达,我们就能更好地选择表示算法。如果这些规律概率相关,我们可以选择图模型(graphical models);如果这些规律需要先决条件,我们可以采用“IF… THEN...”规则表示算法。机器学习不是魔术,不能无中生有,其只是做一些简单的基本假设,然后根据训练数据,推导出更多的规律来而已。
4.过拟合现象
我们把泛化错误分成偏差(bias)和方差(variance)。偏差高,表示学习器没有准确地学习到规律,其预测值与真实的值较为稳定地存在一定差距;方差高,表示学习器学习到的规律具有一定随机性,其预测值与真实值随机地存在一定差距。线性分类器容易有较高偏差,因为其类别的边界可能就不是线性的;决策树容易有较高方差,因为随机从数据划分训练数据,验证数据和测试数据时,由于训练数据的随机获得,导致其构建的决策树形状不一致。
图1为偏差和方差在掷飞镖情景下的比喻。
一个较强的错误假设很可能比一个较弱的正确假设要好,因为较弱的假设需要很多数据来防止学习器过拟合。比如由一堆规则生成的少量数据,用朴素贝叶斯方法要比用规则学习器更准确,即使朴素贝叶斯假设的线性边界在这里是错误的。
交叉验证(Cross validation),在评价方程中加入正则项(regularization term)等能有效防止过拟合。在数据量较少的情况下,防止过拟合尤为重要。
5.直觉不适用于高维空间
机器学习中,过拟合现象之后最大的问题便是维度灾难(curse of dimensionality)。随着维度(特征数)的增加,数据样本的数量占样本空间大小的比例急剧减少。比如我们有中等规模的二维特征数(如100个),以及一个很大的训练样本(如1万亿个),但是其只覆盖样本空间(2^100)的一小部分而已。这使得机器学习越来越难,也越来越重要。
更严重的是,相似性假设很可能在高维空间中不成立。比如我们用最近邻方法去学习仅仅是x1^x2的类别,如果还有很多无关变量,这些无关变量中的噪音便会严重影响学习结果。对于最近邻方法而言,更另人烦恼的是,即使这些变量是相关的,仍然还有问题。随着维度数的增加,样本的最近邻数目将增加,导致其只能在大量的最近邻中随机选择。换句话说,高维空间里,所有样本都很相似。
在二维或三维空间建立分类器很简单,只要通过视觉观察样本,在不同类别的样本之间找一条合理的分界线即可。(有种说法,如果人能在高维空间上观察数据,那么机器学习就没有必要了。)我们可能会觉得获得越多特征越好,顶多这些特征没有带来新的信息,但实际上,多特征带来的好处很可能被维度灾难抵消。
幸运的是,“非均匀分布的祝福”(blessing of non-uniformity)现象,将一定程度的抵消维度灾难。大多数应用中,数据样本并非在样本空间中均匀分布,而是集中在低维流形(manifold)附近。如手写数字识别任务中,数字图片的每个像素单独作为一个特征,最近邻方法在该任务上仍然表现良好,因为数字图片所在的空间要比这个样本空间要小很多。学习器可以隐式地利用这个低维空间,或者显式地对高维空间进行降维。
6.小心理论保证
机器学习里有很多理论保证,常见的有如保证得到较好泛化结果所需最少的样本数量,但是不幸的是这类保证十分保守,我们很难在现实中从这类保证中得到有意义的参考价值。另一类常见理论保证是渐进(asymptotic):给定无限多数据,学习器将保证输出正确的结果。但是我们没有无限多数据,而且就前面讨论的偏差-方差权衡,如果对无限多数据,学习器A比学习器B好,那么在有限数据下学习器B通常比学习器A好。
机器学习中的理论保证主要作用不是在实践中作为决策标准,而是在算法设计中作为理解和驱动的来源。一个学习器既有理论证明又有实际应用,但是前者并不能成为后者的依据。
7.特征工程很关键
如果有很多与类别相关的独立特征,那么学习很容易;如果仅有与类别关系很复杂的特征,那么学习就不那么容易了。通常,我们必须在原始数据上构建特征进行学习,这便是特征工程。特征工程通常是领域相关的(domain-specific),而学习器则很大程度是通用的。
机器学习的一个目标是使特征工程过程自动化,其中一个方法是自动生成很多特征,然后通过检查其与类别的信息增益挑选最好的。需要注意的是,很多与类别无关的特征,组合起来便与类别相关了。比如分类类别是取k个特征的异或(XOR),其每个特征跟类别无关。但是在大量特征中,组合选择特征很耗时,并且会导致过拟合,所以人工挑选特征依然不可替代。
8.更多的数据要比更聪明的算法更有效
假设我们已经构建了很好的特征集,要继续提高学习器的准确率,从实用角度来说,应该先收集更多的数据,而不是设计更聪明的算法。一个有大量数据的笨算法要胜过一个只有中等数据的聪明算法,毕竟机器学习就是研究数据中的规律。
这里还有个可扩展性(scalability)的问题。机器学习中有三个主要的资源,时间,内存和训练数据。如今我们有越来越多的数据,然而却没有时间去处理这些数据。这就导致一个悖论,理论上更多的数据意味着我们能学习到更复杂的学习器,但是这需要很多时间,导致我们只能学习简单的学习器。
设计更聪明的算法得到的回报不多的一个原因是,机器学习算法的基本机制是一样的。所有的学习器都是把相近(nearby)样本划分到同一类别中,区别只在于它们对“相近”的理解不同。不同的学习器将得到不同的分类边界,这也解释了强大的学习器不稳定但是仍然能得到较高的准确率的原因。
图2为几个常见算法不同的分类边界,这种效果在高维数据上更明显
作为一条准则,先试最简单的学习器,比如先用朴素贝叶斯再用逻辑回归,先用k近邻再用SVM。复杂的学习器通常更难驾驭,因为其需要调节更多的参数,内部机制也更不透明。
学习器可以分成两类,参数化学习器(parametric learner)的表示大小固定,如线性分类器,而非参数学习器(nonparametric learner)的表示大小随数据增长,如决策树。通常非参数化学习器需要比参数化学习器学习更多的参数。数据超过一定数量后,大小不变的参数学习器就不能学到更多东西了。而对于大小可变的非参数学习器,只要有足够多的数据,理论上其可以学习到任何函数,但是现实中却很难做到,这主要是算法(如贪心搜索陷入局部最优)和计算复杂度的限制。而且,由于维度灾难,再多的数据也不够用。
9.学习多个模型,而不是只学习一个模型
实验表明,不同项目对应的最好学习器并不相同。而只花费少量精力,将多个学习器结合,通常结果会好很多。
如今模型集成(model ensemble)已经标准化了。最简单的装袋(bagging)技术,通过重采样产生不同训练集,在每个训练集训练一个分类器,然后进行投票。该方法在稍微增加偏差的同时,大大降低方差。在提升(boosting)方法中,每个训练样本有权重,并且权重不断变化,每次训练新的分类器都集中在之前容易分错的样本上。在堆叠(stacking)技术中,每个单独分类器的输出作为更高层分类器的输入,更高层分类器判断如何更好地合并这些来自底层分类器的输出。现在的趋势是越来越大型的模型集成。
10.简单并不意味着准确
著名的奥坎姆剃刀(occam’s razor)称:若没有必要,不增加实体。在机器学习中可以表示为,如果两个训练误差相同的分类器,比较简单的分类器可能更加准确,有更低的测试误差。但实际上有很多反例。一个反例是模型集成,集成模型的泛化误差会随着分类器的增加而改进,甚至优于训练误差;另一个反例是SVM,它可以有无限多个参数但不过拟合。因此与直觉相反,模型参数的数量与过拟合没有直接联系。
一个更成熟的看法是将复杂度等同于假设空间大小,这是因为更小的假设泛化更好。复杂性还来自这样一个因素:几乎所有的学习器都无法遍历整个假设空间。一个在较大假设空间里搜索较少假设的学习器,比一个在较小空间中搜索较多假设的学习器更不容易过拟合。
奥坎姆剃刀在机器学习里正确的表示应该为,当选择简单的假设,因为简单本身就是一个优点,而不是因为假设的简单性跟准确有什么关系。
11.可表示并不意味着可学习
所有大小可变的学习器都可以表示,或者无限近似表示任何函数。所以某种表示方法的簇拥往往会忽略其他表示方法。然而给定有限数据,时间和内存,标准学习器只能学习所有函数的有限子集,所以一个函数可以被表示,并不意味着其可以被学习。如标准决策树无法学习到比训练数据更多的叶子节点。因此一个函数是否可以被表示往往无关紧要,关键在于该函数是否可以被学习,这值得我们尝试不同的学习器或者学习器组合去学习该函数。
很多学习器的工作机制是用一些简单的基函数(basis function)进行线性组合来学习某个函数。而对于某些函数来讲,一些方法来学习(该方法的基函数进行线性组合)会比其他方法更加精简。比如,SVM就是某些训练样本(对应的支持向量)上核的组合。如果用该组合方法表示n个比特的奇偶性需要2n个基函数,但是如果采用输入输出之间多层表示,奇偶性只需要一个线性规模的分类器表示。
12.相关性并不意味着有因果关系
很多时候,我们学习预测模型是想把其当成行动指南。比如数据挖掘里一个著名的例子,在超市将啤酒和尿布放在一起,更容易卖出去。另一方面,虽然相关性并不意味着有因果关系,但是其可以帮助我们进一步理解因果关系链。