Py学习  »  机器学习算法

机器学习系列 | 十种机器学习算法的要点(含代码)

数据分析1480 • 5 年前 • 304 次点击  

上个月瞅了眼之前写的这个系列的两篇文章,感觉自己写的东西有点烂,于是打算重新来过,无奈时间精力有限,因此打算寒假期间再重新开始写这个系列。然后这里想分享一篇机器学习相关的好文,原文链接如下:

https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/

本文内容均翻译自此,仅供学习交流,若存在侵权,请联系我删除。

译文

一. 引言

也许我们正生活在人类历史上最关键的时期:从大型计算机,到个人电脑,再到云计算。其实关键永远不是过去发生过什么,而是将来会有什么发生(后面一段抒情的内容就跳过了)。

二. 广义而言,有三种机器学习算法

1. 监督学习

该算法由一个目标变量/结果变量(或因变量)组成,该变量由一组给定的预测变量(自变量)中预测而来。我们利用这些变量集生成一个将输入值映射到期望输出值的函数。这个训练过程会一直持续到模型在训练数据集上达到期望的精确度。监督学习的例子有:回归、决策树、随机森林、k近邻法、逻辑回归等。

2. 非监督学习

该算法没有任何目标/结果变量要预测/估计。这个算法将种群聚类到不同的分组中,例如被广泛用于将用户分到不同的用户组从而对不同的用户组进行特定的干预。非监督学习的例子有:关联算法和k均值算法。

3. 强化学习

该算法训练机器做出具体的决策。它是这样工作的:机器暴露在一个能让它通过反复试错来训练自己的环境中。该机器利用过去的经验进行学习,并尝试透彻地了解并利用这些知识来做出精确的业务决策。强化学习的例子有:马尔科夫决策过程。

三. 常见的机器学习算法清单

以下是常用的机器学习算法清单,这些算法几乎可以应用于任何数据问题:

① 线性回归

② 逻辑回归

③ 决策树

④ SVM(支持向量机)

⑤ 朴素贝叶斯

⑥ kNN(k-近邻算法)

⑦ K-Means(K均值算法)

⑧ 随机森林

⑨ 降维算法

⑩ Gradient Boosting算法(梯度提升算法)

  • GBM

  • XGBoost

  • LightGBM

  • CatBoost

1.线性回归

线性回归通常用于根据连续变量估计实际值(房价、呼叫次数、总销售额等)。我们通过拟合一条最佳直线来建立自变量与因变量之间的关系。这条最佳直线称为回归线,由线性方程Y=a*X+b来表示。

理解线性回归最好的方式是回顾一下童年。如果你让一个五年级的小孩按体重从轻到重的顺序对班上的同学进行排序,且不能询问他们的体重,你觉得这个小孩会怎么做?他(她)很可能会目测人们的身高和体型来对他们进行排序。这是一个现实生活中使用线性回归的例子!事实上,这个小孩发现了身高和体型与体重有一定的关系,这个关系看起来很像上面的等式。

在这个等式中:

  • Y:因变量

  • a:斜率

  • X:自变量

  • b:截距

系数a和b可以通过最小二乘法获得。

请看下面这个例子,我们已经找到了最佳拟合曲线是y=0.2811x+13.9,因此当我们已知人的身高时可以通过该方程求出该人的体重。

线性回归分为一元线性回归和多元线性回归。一元线性回归的特点是只有一个自变量,多元线性回归的特点是有多个(大于1)自变量。在找最佳拟合直线的时候,你可以拟合多项式或曲线回归,这些被称为多项式或曲线回归。

Python代码:

R代码:

2.逻辑回归

不要被它的名字迷惑了!这是分类而不是回归算法。该算法可根据一组给定的自变量估计离散数值(二进制值0/1,yes/no,true/false)。简单而言,它通过将数据拟合到一个逻辑函数来预测一个事件发生的概率。因此,它也被称为逻辑回归。因为它估计的是概率,所以其输出值在0到1之间(和所预计的一样)。

让我们再次通过一个简单例子来尝试理解这个算法。

假设你的朋友想让你解开一个谜题。这只有两种可能的结果:你解开/没解开这个谜题。现在想象一下,你正在解答/接受各种各样的谜题/测验以了解你所擅长的科目。这项研究的结果将会像是这样的:如果给你的是一道十年级的三角函数题,你有70%的概率可以解开这道题;然而如果给你的是一道五年级的历史题,你只有30%的概率答对这道题。这就是逻辑回归能提供给你的信息。

从数学上看:

其中,p是我们感兴趣的特征出现的概率。它选用使观察样本值的可能性最大化的值作为参数,而不是最小化误差平方和。

现在你也许要问了,为什么要求对数呢?简而言之,这是复制一个阶梯函数的最佳数学方法之一。我本可以进行更详细的解释,但这就违背了本文的宗旨了。

Python代码:

R代码:

更进一步:

你可以尝试更多的方法来改进这个模型:

  • 加入交互项

  • 精简模型

  • 加入正则项

  • 使用非线性模型

3.决策树

这是我最喜欢也最常用的算法之一。该监督学习算法常用于解决分类问题。令人惊奇的是,它同时适用于分类变量和连续因变量。在这个算法中,我们将总体分为两个或更多个同类集,即基于个体最重要的属性/自变量将总体分成不同的组别,不同组别的个体存在尽可能大的差异。

更多细节可参考:

https://www.analyticsvidhya.com/blog/2015/01/decision-tree-simplified/

上图中你可以看到,根据多种属性总体被分成了四个不同的小组,来判断“他们会不会去玩”。为了将总体分成不同的组别,需要用到各种技术,例如基尼(Gini)、信息增益(Information Gain)、卡方(Chi-square)、熵(entropy)。

理解决策树工作机制的最好方式是玩Jezzball(微软出品的一个经典游戏)。游戏中,你需要在一个可以移动墙壁的房间里,通过造墙来分割出没有小球的、尽可能大的空间。

因此,每次你用墙壁来分隔房间时,其实都是在尝试在同一间房间创建两个不同的总体。决策树的工作机制也十分相似,即把总体尽可能地分到不同的组里去。

更多:

https://www.analyticsvidhya.com/blog/2015/01/decision-tree-simplified/

Python代码:

R代码:

4.SVM(支持向量机)

这是一种分类方法。在这个算法中,我们将每个数据在N维空间中用点标出(N是特征数量),每个特征的值对应一个特定的坐标值。

例如,我们只有身高和头发长度这两个特征,我们首先在二维空间中标出这两个变量,其中每个点有两个坐标(这些坐标叫做支持向量)。

然后,我们会找到一条将两组不同分类的数据分开的直线,两个分组之间距离最近的两个点到该直线的距离同时最优化。

在上面的示例中,将数据分成不同类别的两组的线是黑线,因为两组之间距离最近的点到达黑线的距离满足最优条件。黑线就是我们的分类器。于是新数据(测试数据)的类别就取决于其落在黑线的哪一端。

更多:

https://www.analyticsvidhya.com/blog/2014/10/support-vector-machine-simplified/

将这个算法想作是在一个N维空间玩JezzBall。需要对游戏做一些小的调整:

  • 你可以以任意角度画线/平面

  • 游戏的目标改为将不同颜色的球分到不同的空间中

  • 球的位置不会改变

Python代码:

R代码:

5.朴素贝叶斯

它是一种基于贝叶斯理论的分类技术,其基本假设是预测变量之间相互独立。简单来说,朴素贝叶斯分类器假定一个分类中的某特征与该分类的其他特征不相关。例如,如果一个水果又圆又红,并且直径约3英寸,那么这个水果可能会是苹果。即使这些特征相互依赖或依赖于其他特征的存在,朴素贝叶斯分类器仍然会假设这些特性分别独立地暗示了这个水果是个苹果。

朴素贝叶斯模型易于构建,特别适用于非常大的数据集。虽然简单,但是朴素贝叶斯的表现却超越了一些非常复杂的分类方法。

贝叶斯理论提供了一种从P(c),P(x)和P(x|c)计算后验概率P(c|x)的方法,请看下方等式:

其中:

  • P(c|x)是给定预测因子(属性)的前提下,类(目标)的后验概率

  • P(c)是类的先验概率

  • P(x|c)是已知类别的前提下,预测因子的概率

  • P(x)是预测因子的先验概率

例子:

让我们用一个例子来理解这个概念。在下面,我有一个关于天气的训练数据集和对应的目标变量‘Play’。现在,我们需要根据天气情况对玩家们是否玩游戏(即Play)进行分类。让我们执行以下步骤。

Step1:将数据集转换为频率表

Step2:利用类似“Overcast的概率为0.29,玩的概率为0.64”这样的概率来创建似然表。

Step3:现在,利用朴素贝叶斯公式来计算每一类的后验概率。具有最高后验概率的类就是预测结果。

问题:

如果天气晴朗,玩家就会玩耍,这个陈述正确吗?

我们可以使用上面讨论过的方法来解决这个问题,即P(会玩|晴朗)=P(晴朗|会玩)*P(会玩)/P(晴朗)。我们有P(晴朗|会玩)=3/9=0.33,P(晴朗)=5/14=0.36,P(会玩)=9/14=0.64。于是:

P(会玩|晴朗)=0.33*0.64/0.36=0.60

天气晴朗时玩家会玩耍有更大的概率。

朴素贝叶斯使用了一个相似的方法,通过一些不同的属性来预测不同类别的概率。该算法常用于文本分类和多分类问题。

Python代码:

R代码:

6.kNN(k-近邻算法)

该算法可以同时用于解决分类和回归问题。然而,业界常将其用于解决分类问题。k-近邻算法是一个简单的算法,它存储所有可用的案例,并通过新案例k个邻居的多数投票来对这个新案例进行分类。根据一个距离函数,新案例会被分配到离它最近的k个邻居中最普遍的类别中去。

这些距离可以是欧式距离、曼哈顿距离、闵可夫斯基距离和汉明距离。前三个距离函数用于连续函数,第四个(汉明距离)则用于分类变量。如果k等于1,那么新案例就直接被分到离它最近的案例所属的类别中。有时候,使用kNN建模时选择k值是一个挑战。

更多:

https://www.analyticsvidhya.com/blog/2018/03/introduction-k-neighbours-algorithm-clustering/

我们可以很容易地将kNN应用于我们的现实生活中。如果你想要了解一个完全陌生的人,也许你可以通过了解他/她的密友或者他/她的好友圈来获取他/她的信息。

在选择使用kNN之前,你需要考虑:

  • kNN的计算成本很高

  • 特征变量归一化(否则案例之间的距离将主要取决于具有较大值的特征变量)

  • 使用kNN之前对数据进行清洗以去除异常值和噪声值

Python代码:

R代码:

7.K均值算法

K均值算法是一种用于解决聚类问题的非监督学习算法。该算法步骤简单,即将一个给定的数据集归入到一定数量的集群(假设有K个)。一个集群内的数据点是同构的,并异构于其他集群。

还记得从墨水渍中找出形状的活动吗?K均值算法在某方面就类似于这个活动。观察形状,想象一下能找出多少种集群来!

K均值算法流程:

① K均值算法选择K个质心(一般随机选,即不是真正意义上的质心);

② 每个数据点与距离最近的质心同属一个集群,即有K个集群;

③ 根据每个集群现有的成员,找出每个集群的质心替换之前的质心;

④ 当我们有了新的质心后,重复步骤②和③,至到数据收敛,即质心不再改变。

如何决定K值:

在K均值算法中,我们有集群,每个集群有它自己的质心。一个集群内的质心和各数据点之间距离的平方和为这个集群的平方值之和。同时,当每个集群的平方值之和相加,就组成了集群方案的平方值之和。

我们知道,随着集群数量的增加,集群方案的平方值之和会持续下降。但是如果你将结果用图表来表示,你会看到集群方案的平方值之和急剧下降,直到某个K值之后,下降的速度就大大降低了。这里的K值就是集群数量的最优值。

Python代码:

R代码:

8.随机森林

随机森林是表示决策树集合的专有名词。在随机森林算法中,我们有一系列的决策树(因此得名“森林”)。为了根据新对象的属性对其进行分类,每个决策树都对新对象给出一个分类,我们称这一过程为该决策树“投票”给该分类。显然,得票最多的分类为新对象的分类(即随机森林的输出结果)。

每棵树都是像这样种植养成的:

① 如果训练集的案例数量为N,则从N个案例中用重置抽样法随机抽取样本。这个样本将作为“培育”树的训练集;

② 假如有M个输入变量,定义一个数字m<

③ 每棵树都尽可能大地生长,全程不剪枝。

一些参考资料:

① https://www.analyticsvidhya.com/blog/2014/06/introduction-random-forest-simplified/

② https://www.analyticsvidhya.com/blog/2014/06/comparing-cart-random-forest-1/

③ https://www.analyticsvidhya.com/blog/2014/06/comparing-random-forest-simple-cart-model/

④ https://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/

Python代码:

R代码:

9.降维算法

在过去的四五年里,在每一个可能的阶段,捕获的信息数量都在呈指数增长。企业/政府机构/研究机构在应对新资源的同时,也在尽可能地捕获更详细的数据。

举个例子:电子商务公司正在捕获有关客户的更多详细信息,例如个人信息、网页浏览记录、客户的喜恶、购买记录、反馈以及别的许多信息,比你身边的杂货店销售员都更加关注你。

作为一名数据科学家,我们提供的数据也包含了很多特征,虽然这听起来对建立一个鲁棒性的模型很有利,但实际上这是有挑战性的:如何从1000或2000个特征变量中找出最重要的变量呢?在这种情况下,降维算法和别的一些算法(例如决策树、随机森林、PCA、因子分析)一起使用,帮助我们根据相关矩阵、缺失值比例和其他一些要素来找到最重要的变量。

想知道该算法的更多细节,请参考:

https://www.analyticsvidhya.com/blog/2015/07/dimension-reduction-methods/

Python代码:

R代码:

10.Gradient Boosting算法(梯度提升算法)

10.1 GBM

GBM是一种提升算法,主要用于处理大量数据以做出有高预测能力的预测。Boosting算法是一种集成学习算法,它结合了几个基础估计器的预测结果以提高单个估计器的鲁棒性。它将多个弱预测器组合成一个强预测器。这些提升算法在数据科学竞赛(例如Kaggle)中总是很有效。

更多:

https://www.analyticsvidhya.com/blog/2015/05/boosting-algorithms-simplified/

Python代码:

R代码:

GradientBoostingClassifier和随机森林是两种不同的提升树分类器,人们常常问起这两种算法之间的区别:

http://discuss.analyticsvidhya.com/t/what-is-the-fundamental-difference-between-randomforest-and-gradient-boosting-algorithms/2341

10.2 XGBoost

另一种经典的梯度提升算法,在一些Kaggle比赛中被认为是决定胜负的关键。

XGBoost具有极高的预测能力,是事件准确性预测的最佳选择,因为它同时具有线性模型和树学习算法,所以它比现有的梯度提升技术快了近10倍。XGBoost支持各种目标函数,包括回归、分类和排序。

关于XGBoost最有趣的事情之一是它也被称为正则化提升技术。这有助于防止模型过拟合,同时,Scala、Java、R、Python、Julia和C++等一系列编程语言都支持XGBoost。

XGBoost支持在包括GCE、AWS、Azure和Yarn等集群上进行分布式训练。XGBoost还可以集成在Spark、Flink等云数据流系统,并在每次提升过程中进行内置交叉验证。

更多:

https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

Python代码:

R代码:

10.3 LightGBM

LightGBM是一种基于树模型的梯度提升框架。它是分布式并且高效的,具有以下优点:

  • 训练速度快,效率高

  • 占用内存少

  • 更准确

  • 支持并行和在GPU上训练

  • 能够处理大规模数据

LightGBM是一种快速、高性能的梯度提升框架,其基于决策树算法,可应用于排序、分类和许多其他机器学习任务。它是在微软的分布式机器学习工具包项目下开发的。

由于LightGBM基于决策树算法,因此它以最佳拟合分割树叶,而其他提升算法都是横向或纵向分割树。因此,在同一片树叶上生长时,LightGBM可以减少更多的损失,从而提高了模型精度,这是现有的任何一种增强算法都难以实现的。

此外,它得名“Light”是因为它的速度非常快。

更多:

https://www.analyticsvidhya.com/blog/2017/06/which-algorithm-takes-the-crown-light-gbm-vs-xgboost/

Python代码:

R代码:

如果你熟悉R中的Caret包,那么你也可以这样实现LightGBM:

10.4 CatBoost

CatBoost是Yandex最近开源的一个机器学习算法。它可以轻松地集成在深度学习框架中,例如谷歌的TensorFlow和苹果的Core ML。

CatBoost最好的一点是它不像其他机器学习模型那样需要大量的数据训练,并且可以处理各种数据格式而不破坏其鲁棒性。

在应用CatBoost之前请确保你已经妥善地处理了缺失数据。

CatBoost可以自动处理分类变量而不显示类型转换错误,因此你可以更加专注于优化你的模型而不是处理一些琐碎的错误。

更多:

https://www.analyticsvidhya.com/blog/2017/08/catboost-automated-categorical-data/

Python代码:

R代码:

四.结语

现在,我相信你已经对常用的机器学习算法有了大致的了解。写这篇文章并提供Python和R语言代码的唯一目的是让你马上开始学习。如果你想要掌握机器学习,那就立刻开始吧!处理问题,理性地认识处理过程,应用这些代码并享受其中的乐趣吧!



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/6VYpwlCfZL
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/26938
 
304 次点击