初学机器学习必备10大算法

2,948 阅读15分钟

毫无疑问,过去几年中,作为人工智能的主要领域,越来越多的人投身于机器学习研究。《哈佛商业评论》甚至将机器学习科学家称为“21 世纪最性感的工作”。为了帮助机器学习初学者快速入门,加拿大皇后大学机器学习专家 Reena Shaw 特意写了一篇文章,总结了机器学习初学者需要知道的 10 大算法。

ML 算法是指无需人类介入,就能从数据中学习,从经验中优化的算法。学习任务包括学习将输入映射到输入的函数,学习未标记数据中的隐藏结构;或者“基于实例的学习”,即将新的实例和训练数据中的实例进行比较,为一个新的实例生成一个类标签。

机器学习初学者需要知道的 10 个 ML 算法:

ML 算法的类型

ML 算法大体上分为三类:

1 监督式学习

监督式学习可以这样解释:使用标记的训练数据学习输入变量(X )到输出变量(Y)的映射函数。 Y = f (X)

监督式学习问题会有两种类型:

  • 分类 :预测一个给定样本的结果,其输出变量的形式为类别。样本含有标签,比如男性和女性、生病的和健康的等等。

  • 回归 :预测一个给定样本的结果,其输出变量的形式为真值。样本含有实值标签,比如降雨量、某人的身高等等。

本文介绍的前 5 个算法:线性回归、逻辑回归、分类回归树、朴素贝叶斯、K最近邻算法都是监督式学习中的算法

集成学习是监督式学习的一种特殊类型,它是指将多种不同的弱机器学习模型的预测结果进行组合,以预测出一个新的样本。文章末尾介绍的第 9 和第 10 个算法,即随机森林-套袋法(Bagging)、XGBoos-提升法(Boosting)都是集成学习中的算法

非监督式学习:

非监督式学习问题只有输入变量(X),但没有相应的输出变量。它使用无标记的训练数据为数据的隐含结构建模。

非监督式学习问题可以有以下三种类型:

  • 关联(Association):发现目录中项目共现的概率。其广泛应用于“购物篮分析”。例如,如果一个顾客购买了面包,他会有80% 的概率也购买鸡蛋。

  • 聚类(Clustering):将样本分组,这样,同一聚类中的物体与来自另一聚类的物体相比,相互之间会更加类似。

  • 降维:正如其含义,降维指减少一个数据集的变量数量,同时保证还能传达重要信息。降维可以通过特征抽取方法和特征选择方法完成。特征选择方法会选择初始变量的子集。特征抽取方法执行从高维度空间到低维度空间的数据转换。例如,PCA算法就是一种特征抽取方式。

文中提到的第6-8个算法,即 Apriori 算法、K 均值算法、PCA 算法都是非监督式学习的例子。

增强学习:

增强学习是一种机器学习算法,能让 agent 通过学习会让性能最大化的行为,根据其当前状态决定下一步最优动作。

增强学习算法常常通过试错学习最佳选择。它们最典型的应用时用在机器人上,比如机器人可以通过碰撞障碍物后接收负面反馈来避免碰撞。

监督式学习算法

1 线性回归

在机器学习中,我们有一套输入变量(X)用于决定输出变量(y)。输入变量和输出变量之间存在一种关系,而机器学习的目标就是量化这种关系。

在线性回归中,输入值 (X) 和输出值 (y) 之间的关系可以用方程 y = a + bx 表示。这样以来,线性回归的目标就是找出系数 a 和 b 的值,a 为截距,b 为回归线的斜率。

上图展示了为某个数据集标绘的 x 和 y 的值,目的是匹配出一条最接近大部分点的线。这能够减少数据点的 y 值和斜线之间的距离(即误差)。

2 逻辑回归

线性回归预测结果是连续值,而逻辑回归预测结果在应用转换函数后是离散值。

逻辑回归最适合二元分类(数据集中 y=0 或 1,其中 1 指默认类别。例如,在预测某个事件是否会发生时,事件发生归类为 1;预测某人是否生病时,生病的状况会以1表示)。它以 应用在其中的转换函数而命名,称为逻辑函数 h(x)= 1/ (1 + e^x),是一个 S 型曲线。

在逻辑回归中,输出值的形式为默认类的概率(不像线性回归中,输出值为直接产生)。因为是概率,所以输出值会介乎 0 到 1 之间。通过使用逻辑函数 h(x)= 1/ (1 + e^ -x),对 X 值进行对数转换可得到输出值。然后用阙值将得到的概率,即输出值,应用到二元分类中。

在上图示例中,要确定一个肿瘤是否为恶性,默认值为 y=1(肿瘤=恶性);x 值可以是肿瘤的度量值,比如肿瘤的大小。如图中所示,逻辑函数将数据集中多种例子下的 x 值转换为 0 到 1 之间的概率值。如果概率超过了阙值 0.5(图中中间的水平线),那么肿瘤会被归类为恶性。

逻辑回归方程 P(x) = e ^ (b0 +b1x) / (1 + e^(b0 + b1x)) 可以被转换为 ln(p(x) / 1-p(x)) = b0 + b1*x。

逻辑回归的目标是利用训练数据发现系数 b0 和 b1 的值,这样就能将预测输出值和实际输出值之间的误差最小化。可以用最大似然估计的方法估计这些系数。

3 CART

分类回归树(CART)是决策树的一种应用形式,其它形式还有 ID3 和 C4.5 等。

CART 的非终端节点为根节点和内节点。终端节点为叶节点。每个非终端节点代表一个单个输入变量 (X) 和该变量的分割点;而叶节点代表输出变量 (y)。该模型以如下形式用于预测:沿着决策树的分叉点,到达叶节点,输出在该叶节点上表示的值

上图的决策树分类了某人根据自己的年龄和婚姻状况决定买跑车还是旅行车。如果此人超过 30 岁且未婚,我们这样沿着决策树:“超过 30 岁吗?” -> 是 ->“已婚?” -> 否。因此,模型的输出结果为跑车。

4 朴素贝叶斯

在某个事件已经发生的情况下,为了计算出另一个相同事件发生的概率,我们使用贝叶斯定理。根据某些变量的给定值,要想计算某个结果的概率,也就是根据我们的已知知识(d)计算假设(h)为真的概率,我们这样使用贝叶斯定理:

P(h|d)= (P(d|h) * P(h)) / P(d)

其中:

P(h|d) =后验概率。假设h的概率为真,给定数据为d,那么 P(h|d)= P(d1| h)* P(d2| h)*....P(dn| h) P(d)

P(d|h) =可能性。假设 h 为真时,数据 d 的概率。

P(h) = 类的先验概率。假设 h 的概率为真(不管数据 d 的情况)。

P(d) = Predictor 的先验概率。数据 d 的概率(不管假设 h 的情况)。

这种算法之所以被称为“朴素”,是因为它假定所有的变量之间相互独立,而这种假设在实际应用往往不成立。

用上图作为一个例子,如果 weather=“sunny”,结果是什么?

如果变量 weather=“sunny”,要想确定结果 Play 为“Yes”或“No”,需计算图中P(yes|sunny) 和 P(no|sunny),以较高的概率值选择结果。

->P(yes|sunny)= (P(sunny|yes) * P(yes)) / P(sunny)

= (3/9 * 9/14 ) / (5/14)

= 0.60

-> P(no|sunny)= (P(sunny|no) * P(no)) / P(sunny)

= (2/5 * 5/14 ) / (5/14)

= 0.40

这样,如果weather=“sunny”,结果为play= ‘yes’。

5 K最近邻算法(KNN)

K 最近邻算法使用整个数据集作为训练集,而非将数据集分割为一个数据集和一个测试集。 当一个新的数据实例需要一个结果时,KNN算法会遍历整个数据集找到这个新数据实例的K个最近实例,或者和新记录最相似的实例的K数量,然后输出结果的平均值(针对回归问题)或者分类问题中的模式。K的值为用户指定。 可使用比如欧几里得距离和汉明距离等方式计算实例之间的相似度。

非监督式学习

6 Apriori算法:

Apriori 算法常被用于事务数据库中挖掘频繁集,然后生成关联规则。它常常用在市场分析中,检查在数据中频繁共现的产品的组合。总体上讲,我们将“如果某人购买物品 X,那么他也购买物品 Y”的关联规则写为 X -> Y。

例如,如果某人购买了牛奶和糖,那么他会很可能也会购买咖啡粉。这种情况的关联规则可以被写为 {milk,sugar} -> coffee powder。关联规则的强度可以用它的支持度(support)和置信度(confidence)来度量。

图中,支持度帮助删除生成频繁集时要考虑的候选集的数目。该支持度受到 Apriori 原则的指导。Apriori 原则认为,如果某个集为频繁集,那么该集所有的子集也必须为频繁集。

7 K均值算法

K 均值算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。 它是一种迭代算法,将相似数据分组为聚类。它会计算出 K 个聚类的中心值,将一个数据点赋给一个聚类,该聚类的中心和赋给它的数据点之间的距离最近。

第 1 步:K 均值迭代:

  • 选择一个K 值。这里,我们取 K 值为 3.

  • 随机将每个数据点赋给 3 个聚类中任意一个。

  • 计算出每个聚类的聚类中心。红色、蓝色和绿色星标表示 3 个聚类的聚类中心。

第 2 步:

将每个数据点重新赋给最近的聚类中心。这里,最上面的 5 个点被赋给蓝色聚类中心的那个聚类。按同样的步骤,将数据点赋给有红色和绿色聚类中心的聚类。

第 3 步:

计算新聚类的中心。用灰色星标表示原来的聚类中心,继续用红色、绿色和蓝色星标表示新的聚类中心。

第 4 步: 重复步骤 2-3,直到各个聚类之间的数据点不再变换。在经过这两个连续步骤没有数据点的切换情况后,导出K均值算法。

8 PCA:

主成分分析(PCA)通过减少变量数目用于更容易地探究和可视化数据。主要是通过获取数据中的最大方差,转换入一个坐标称为“主成分”的坐标系中完成这个过程。每个成分都是一个原始变量的线性组合,相互之间是正交关系。成分之间的正交关系表明这些成分之间的相关性为 0. 第一个主成分获取数据中最大方差的方向。第二个主成分获取数据中的剩余方差,但变量和第一个成分没有相关性。同样地,所有接下来的主成分(PC3,PC4 等等)获取剩余方差,且和之前的成分没有相关性。

集成学习

“集成”意思是通过投票或求平均值,将多个分类器的结果组合在一起,以改进结果。投票用在分类问题中,求平均值则用在回归问题中。其理念是,将学习模型集合在一起的效果要好于单个学习模型。 集成学习算法有三种类型:套袋法(bagging)、提升法(Boosting)和堆叠法(stacking),但本文是面向初学者,暂时先只讲套袋法和提升法。

9 随机森林-Bagging算法:

随机森林(多个学习模型)是套袋式决策树(bagged decision tree,即单个学习模型)的改进形式。 套袋法(bagging):该方法的第一步就是用数据集(用抽样法创建而成)创建多个模型。在抽样法中,每个生成的训练集由原始数据集的随机次级样本组成。每个训练集都和原始数据集一样大小,但有些记录会重复几次,有些记录则完全不出现。然后,整个原始数据集会被用作测试集。这样,如果原始数据集的大小为N,那么每个生成的训练集大小也为N,特殊记录的数量大约为(2N/3),测试集的大小也是N。

第二步就是用和生成的不同数据集中一样的算法构建多个模型。在这一步中,我们讨论一下随机森林。不像决策树中,每个节点在将错误最小化的最佳特征处分裂,在随机森林中,我们选择各个特征的一个随机抽样用以构建最佳节点。之所以是随机,是因为:即便是用套袋法,当决策树选择一个最佳特征之处分裂时,最终会是相同的结构和相互关联的预测。但在各个特征的随机子集处分裂后再套袋(bagging)意味着根据子树的预测之间的相关性较低。

在每个分叉点要搜索的特征数量被指定为随机森林算法的一个参数。 这样,在随机森林 bagging 中,用记录中的随机样本构造每个决策树,用预测器的随机样本构造每个分裂。

10 AdaBoost-Boosting算法

A) 套袋法(bagging)是一种平行集成,因为每个模型都是独立搭建。但提升法(Boosting)是一种顺序集成,每个模型都是在矫正之前模型的错误分类基础上搭建。

B)套袋法大多涉及“简单投票”,每个分类器投票获得一个最终结果,它是由平行模型中的大多数决定。提升法涉及“加权投票”,每个分类器投票获得最终结果,它也是由大多数来决定,但它是通过将更大的权重赋给先前模型的错误分类示例来搭建顺序模型。

Adaboost 算法(自适应增强算法)指自适应的提升法。

在上图,第 1,2,3 步涉及到了一种叫做“决策桩”(decision stump)的弱学习模型(一个1层决策树根据仅仅 1 个输入特征做出预测;这是个根部节点和叶节点立刻相连的决策树)。构造弱学习模型的过程会不断持续直到构造完毕用户定义数量的弱学习模型或者直到训练再无改进之处。第 4 步将先前模型的 3 个决策桩进行组合(这样该决策树中就有了 3 个分裂规则)。

第 1 步:以 1 个决策桩开始根据 1 个输入变量做出决策:

数据点的数量显示我们已经应用了相等的权重将它们分类为圆形或三角形。该决策桩已经在上半部分生成了一条水平线将这些数据点进行分类。我们可以看到,有 2 个圆形被错误地预测为三角形。因此,我们会给这 2 个圆形赋给更高的权重,并应用另一个决策桩。

第 2 步:转向另一个决策桩,根据另一个输入变量做出决策:

我们发现上一步中这 2 个被错误分类的圆形要大于剩余的数据点。现在,第 2 个决策桩会试着正确地预测这 2 个圆形。

赋给更高的权重后,这 2 个圆形被左侧的垂直线正确地分类了。但是,现在又将顶部的 3 个圆形错误分类。因此,我们给顶部的这 3 个圆形赋给更高的权重,并应用另一个决策桩。

第 3 步:训练另一个决策桩,根据另一个输入变量做出决策:

上一步中被错误分类的这 3 个圆形要大于其余的数据点。现在,在右侧已生成了一条垂直线,对三角形和圆形进行分类。

第 4 步:将决策桩进行组合: 我们把前 3 个模型中的分离器组合在一起,观察发现和之前每个弱学习模型相比,这个模型的复杂规则正确地分类了数据。

总结

简单回顾一下,我们学习了:

5个监督式学习算法:线性回归、逻辑回归、CART、朴素贝叶斯、KNN

3个非监督式学习算法:Apriori算法、K均值算法、PCA

2个集成学习算法:随机森林 Bagging 算法、Adaboost 提升法

这么干货的东西,不赞一下?