摘要:机器学习一直是计算机科学中非常热门的领域。本文对过去几十年中被普遍认可的机器学习算法进行了概括,包括线性模型、决策树、支持向量机、贝叶斯分类器、聚类、集成学习、神经网络、强化学习等(由于是我个人的理解,所以可能有些是错的)。算法和公式是机器学习的核心,但是本文企图使用尽可能少的公式和符号来把各种机器学习算法描述清楚。机器学习算法众多,没有人能够也没有必要真正了解清楚所有的算法。而这些概述能对今后再深入学习某一个方向的算法打下一些基础。
关键词:机器学习 分类 回归 聚类 集成学习 神经网络 强化学习
1 引言
机器学习大致是利用经验来改善系统性能的一种手段。所谓的“经验”对于计算机系统而言自然就是“数据”。“系统”就是所谓的“模型”,或者是包含“模型”的事物,我们改善系统的手段就是通过“数据”来改进模型——不管是发明新模型也好,改进模型的参数也好。
2 预备知识概述
2.1机器学习概述
按训练数据是否有标记信息,机器学习可分为“监督学习”(Supervised Learning)和“无监督学习”(Unsupervised Learning)。前者的代表有分类和回归,后者的代表有聚类。
归纳与演绎是科学推理的两大手段。机器学习如果是从样例中学习,则是属于归纳学习。样例构成数据集,一般情况下一个样例包含属性(一般有多个)和类标两部分。基本上的机器学习都是属于归纳学习,而强化学习(Reinforce Learning)中的免模型学习似乎是个例外。
我们可以把学习过程看作一个在所有关于模型的假设组成的空间里进行搜索的过程,目标是找到与训练集匹配的假设。和我们数据相符的假设会有很多种,每种假设都有自己的偏好,也就是针对我们输入的新数据,其输出可能会有不同的倾向。评判这些假设的好坏是一个非常难的问题。因为假如这个假设对我们的训练数据符合的极好,可能会出现“过拟合”(Over-fitting)的问题,而符合的不好,则又会有“欠拟合”(Under-fitting)的问题。一种看上去比较好的办法是,选择这些假设中最简单的那个,比如有样本,我们应该选择假设:而不该选.但是如何评判假设的简单性也是一个难题,比如上述例子,假设和到底谁更简单?
事实上选择还是要看具体情况。有一个著名的NFL(No Free Lunch Theorem)定理:无论学习算法A多聪明,学习算法B多笨拙(比如是胡乱猜的),他们的期望性能是相同的。但是这个定理的前提是:算法所面临的问题的所有的方面同等重要。但是生活中的实际问题往往不是,因为具体问题中,我们往往会偏向某个方面而忽视其他一些方面。所以机器学习的关键是具体情况具体分析,脱离实际问题什么都没有意义。
实际上,评判一个机器学习模型的好坏程度是通过评判其泛化性能(Generalization Property)来判别的。泛化性能是指学习模型经过训练集的训练以后对训练集以外的数据的预测能力(分类和回归都可以看成是一种预测,其实际结果就是类标)。为了得到好的模型,我们自然需要来评估一下各个模型的泛化能力。
2.2泛化能力评估方法
泛化能力评估方法有留出法、交叉验证法、自助法等。泛化能力评估其实就是讲我们用的数据集划分为训练集和测试集。训练集用来训练,测试集用来看看模型的泛化能力。如果泛化能力比较差,则需要换个模型重新训练。如果泛化能力不错,就将测试集与训练集合并然后重新训练(也可以采用增量式的方法避免重新训练),再将得到的模型给顾客。
留出法(Hold-out)是直接将拥有的数据集D划分为两个互不包含的集合——训练集S、测试集T(S一般占D样本数的2/3~4/5。划分需要注意的是尽量保证2个集合的数据类别比例一致。如果D有1000个样本,其中300个正例,700个反例。则S和T中正反例的比例也应该为3:7。这叫做“分层采样”(Stratified Sampling)。而且一般对D会进行多次随机划分,比如100次,然后进行100次训练和评估,最后返回的泛化性能就是这100次的平均。
交叉验证法(Cross Validation)先将D划分为k个大小相似的互不相互包含的子集(k常取5,10,20等),同时每个子集都尽量分层采样。然后将k-1个子集用作训练,剩下一个用作测试。这样就能进行k次训练和评估,然后返回的泛化性能就是这k次的平均。交叉验证的关键是k的取值,因此,交叉验证常常也被成为“k折交叉验证”(k-fold Cross Validation)。如果k等于D的样本总数,则测试集中只有一个样本,此时称为留一法(LOO,Leave-One-Out)。留一法的评估结果往往被认为比较准确,但其训练开销较大。
自助法(Bootstrapping)以自助采样法(Bootstrap Sampling)为基础,以数据集D为例(设其包含m个样本),一开始另一个数据集。然后每次从D中随机复制一个样本到一个D’数据集中,重复m次。显然,D中一部分样本会在D’中多次出现,而有些样本则不会出现。由概统知识可以知道,在D’中一次都不出现的样本数约为0.368m。最终,我们将D’作为训练集,D-D’作为测试集(因此需要知道到底哪些样本复制进D’了)。
自助法一般用于数据集较小、难以有效划分训练/测试集时,而在初始数据量足够时,留出法和交叉验证法用的多一些。
另外在实际训练中,当我们选定了模型之后,要通过机器学习算法来确定最优参数,但是参数的定义域往往是连续的,所以我们往往将参数选定一个范围,然后确定一个步长,通过训练一步一步找出最优的参数。
2.3泛化能力评估指标
泛化能力评估指标就是性能度量的指标。之前我们介绍了各种来评估模型的手段,最后需要通过一些指标来从数字上比较出哪些模型更好。
要评价性能,就需要将学习器f的预测结果f(x)与真实标记y进行对比。常用的性能度量是均方误差(MSE, Mean Squared error)。具体而言,有错误率和精度、查全率和查准率、代价敏感错误率和代价曲线等方法。
错误率就是分类错误的样本数占样本数的比例,精度则相反。
很多时候我们关心的问题不是我的模型的准确程度,而是“我们遇到的新的数据中有多少比例是属于我想要的类的”、“或者我想要的那个类的数据有多少被我挖掘出来了”。这时就应该使用查准率(precision)和查全率(recall)这样的指标。要使用查全率和查准率指标,可以绘制P-R曲线,或者在一张P-R图上绘制多条P-R曲线。一条P-R曲线如果包围了另一台P-R曲线,则说明对应的学习器较优。但是如果两者相交就比较难判断谁更优。比较一般的比较方法是可以比较曲线与查全率=查准率的那条直线与曲线的交点(即平衡点, BEP, Break-Even Point),交点越高,性能越优。但实际上我们也可以根据自己的需要(偏重查全率还是查准率)来选择不同的模型。
代价可以用来描述分类错误带来的代价,代价其实是错误率的高级形态,有一种权重概念。我们可以定义将A类误归成B类的代价和将C类误归成B类的代价不同。在此种前提下,我们可以用一种代价曲线来描述一个模型,它的AUC(Area Under Curve)就是期望代价。
除了这些评价指标以后,其实还有非常多的指标或者评价方法,比如ROC、比较检验等。