机器学习算法基础(带Python和R代码)(上)

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

介绍

1quot.jpg


我们可能正生活在人类历史上最有代表性的时代。这是一个计算从大型主机变迁到个人电脑,再到云的时代。但是使这个时具有代表性的不是已经发生了的事,而是未来几年将要发生的事。


令一个像我这样的人对这个时代感到兴奋的是,随着计算力的增强而来的工具与技术的民主化。今天,作为一个数据科学家,我可以仅以几美元每小时的代价搭建起一台运行着复杂算法的大规模数据处理机。但是,要达到这个水平不容易,我经历了我自己的黑暗时期。


谁可以从本指南中获益最大?


我今天给出的或许是我至今为止创作的最有价值的指南。

创作本指南背后的想法是简化有志向的数据科学家和机器学习爱好者探索世界的旅程。通过本指南,我会让你能够着手解决机器学习问题,并从经验中学习。我会给出几个机器学习算法的高层次的解释,还有实现它们的R和Python代码。这已经足够让你上手了。

2.jpg


我刻意忽略的这些技术背后的统计学知识,因为刚开始时你不必理解这些知识。所以,如果你要理解这些技术背后的统计学思想,你就要到其他地方去找了。但是,如果你只想尽快开始构建一个机器学习项目,那就来对地方了。


广义上说,存在3种类型的机器学习算法...


1、监督学习

工作原理:这类算法由一集给定的预示变量(独立变量)中预测得到的一个目标变量(依赖变量)组成。使用这些变量集,我们得到一个从输入映射到输出的函数。训练过程持续到模型能在训练集上达到指定的精度。监督学习的例子有:回归、决策树随机森林、KNN算法、逻辑回归等。


2、非监督学习


工作原理:在这类算法里,我们没有要预测的目标变量。这类算法被用于族群的分类,特别是划分客户群用于进一步研究。非监督学习的例子: Apriori算法、K平均数算法。


3、强化学习


工作原理:使用这类算法,机器被训练用来做某种特定的决定。它是这样工作的:机器被放在一个允许他不断试错的环境下,机器从过去的经验中学习,并尝试获得作出准确决定所需的最好的知识。强化学习的例子有:Markov决策过程。


常用机器学习算法列表


下面是经常使用的机器学习算法的一个列表。这些算法几乎可以用于任何数据问题。

1、线性回归

2、逻辑回归

3、决策树

4、SVM算法

5、朴素贝叶斯算法

6、KNN算法

7、K平均数算法

8、随机森林算法

9、降维算法

10、Gradient Boost 和 Adaboost 算法


1、 线性回归


这种算法常用于在连续变量的基础上估计实际值(房价、呼叫量、总销售额等)。通过在独立变量和依赖变量间拟合一条直线来建立独立变量和依赖变量间的关系。最佳拟合线叫做回归线,可由线性方程Y=a*X+b来表示。


理解线性回归最好的方法是回想一下童年经历。假如,你要一个5年级小孩依据体重对他班上的同学升序排列,但又不让他问同学的体重。你认为这个小孩会怎么做?他可能会观察(视觉分析)同学的身高和体型,然后组合这些可以看得到的参数对他们排序。这就是线性回归的实际应用。这个小孩实际上想到了身高和体型会和体重有关联,而这就如同上面介绍的方程。


在这个方程里:


  • Y——依赖变量

  • a——斜率

  • X——独立变量

  • b——截距


参数是由最小化数据点到回归线的距离的平方差之和推导而来的。


看下面的例子。我们得到了最佳拟合线的方程为:y=0.2811x+13.9。现在使用这个方程,我们就能由一个人的身高推得他的体重。

3.jpg


线性回归主要有两种类型:一元线性回归和多元线性回归。一元线性回归的特点是只有一个独立变量。而多元线性回归(就像名字暗示的那样)的特点是有多个(大于1)独立变量。为了找到最佳回归线,你可以拟合成多项式或者曲线,而这就叫做多项式回归和曲线回归。


Python Code

4.jpg


R Code

5.jpg


2、逻辑回归


别被算法名字弄糊涂了。本算法是一个分类算法而非回归算法。它用于在给定独立变量的基础上估计离散值(二值,像0与1,是与否,真与假)。简单来说,这就是通过拟合数据到一个逻辑函数来预测一个事件发生的可能性。也因此被称作逻辑回归。因为他预测的是概率,所以输出变量就在0与1之间。


像上面一样,我们试试用一个简单的例子来理解该算法。


假设你朋友给你个谜题要你解。只有两种结果情形:你要么解出来了,要么没解出来。现在设想,给你出了范围广泛的各种谜题,用来看看你擅长哪些领域。结果最后会是这样:如果你面临的是10年级的三角几何踢,你有70%的概率解出来,如果是5年级的历史题,你答对的概率只有30%。这就是逻辑回归给你提供的回答。


回到数学上,输出几率的对数被建模成一个预示变量的线性组合。

6.jpg


上面,p是我们感兴趣的特征出现的概率。选参数要选最大化观测样本值出现的概率的参数,而不是最小化方差和(如传统回归里那样)的参数。


现在你可能要问,为什么要取对数?为了简化起见。现在我只能说这是重现阶梯函数的最佳方法之一。更深入的细节已经超出了本文的目的了。

7.jpg


Python Code

8.jpg


R code

9.jpg


下一步...


可以尝试有很大不同的方法来改进本模型:


3、决策树


这是我最喜欢的算法之一,而且我也经常使用这个算法。这是一类主要用于问题分类的监督学习算法。神奇的是,该算法即适合确定性依赖变量,也适用于连续性依赖变量。在这个算法里,我们将总体分成几个同类集,分法是基于最显著的属性或独立变量的,为的是使各个类之间尽可能有明显区别。更多细节,你可以阅读简化决策树一文。

10.jpg


在上图,你可以看到,为了确定“他们是否会出去玩”,总体在基于多个属性的情况下,被分成了4个不同的类别。为了将全体分类成各种不同的类别,会使用多种不同的技术,如Gini、Information Gain、Chi-square、entropy。


理解决策树工作原理最好的方法是看一看玩Jezzball游戏——一个来自微软的经典游戏(见下图)。基本上,你有一个可以移动墙的房间,你需要造墙,使没有球的空间最大化。

11.jpg


所以,每次你用一个墙分割房间,你都相当于在一个房间里创造了两个不同的类别。决策树的做法很像这种将总体分成尽可能不同的类别的风格。


更多的查看:简化版决策树算法


Python code

12.jpg


R code

13.jpg


4、SVM(支持向量机)


这也是一个分类算法。在本算法里,我们将每个数据项画在一个N维空间里(N是数据项的特性数),数据项的每个特性对应一个坐标。


例如,假设我们只有两个特性,比如个体的身高和头发长度。我们先将这两个变量画成一个二维空间,空间里的每个点都有一个二维坐标(这些坐标就是支持向量)。

14.jpg


现在,我们要找一条将数据分割成两个不同类别的线。这条线将使得两个类别中离该线最近的的点到该线的距离最大化。

15.jpg


在上面显示的例子里。分割数据成两个不同类别的线是那条黑线。因为这时离线最近的两点(分别来自两个不同类别)到线的距离最大。这条线就是我们的分类器。然后,测试数据落到该线的哪一边,它就被分到哪一类。


更多的请查看:简化版支持向量机算法


想象这个算法是在N维空间里网JezzBall游戏。游戏规则稍稍改成:

  • 你可以以任意角度画线或者面(而不是像原游戏中那样,只允许水平的或竖直的)

  • 游戏目标变为将不同颜色的球分隔在不同的房间

  • 球不允许动


Python Code

16.jpg


R Code

17.jpg


5、朴素贝叶斯算法


本算法是一个基于假设各个预示变量相互独立时的贝叶斯理论的分类算法。简单来说,朴素贝叶斯分类器假设一个类别中的某特定特性和其他特性不相关。举例来说,一个水果可能被认为是一个苹果,如果它是红色的,圆的,而且直径大概3英寸。即使这些特性彼此相关,或者依赖于其他特性,朴素贝叶斯分类器也会认为所有这些特性在对那水果是苹果的概率的贡献上是相互独立的,


朴素贝叶斯模型对大型数据来说很容易构建,而且非常有用。除了它的简明性,朴素贝叶斯模型还因为它甚至比一些成熟的分类方法还有效而出名。


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

18.jpg


这里:

  • P(c|x)是已知预示变量(属性)的情况下,类(目标)的后验概率

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

  • P(x|c)是给定类的前提下,预示变量的概率

  • P(x)是预示变量的先验概率


例:让我们用一个实例来理解。下面是一个由天气变量和与之相对的目标变量“出去玩”构成的训练数据集。现在我们需要基于天气来确定玩家是否“出去玩”。让我们做以下操作:


步骤1:将数据集转换为频率表

步骤2:通过找到像阴天(Overcast)概率为0.29、“出去玩”的概率是0.64这样的值来构造概率表

19.jpg


步骤3:现在,通过朴素贝叶斯等式技术每类的后验概率。每类中具有最高后验概率值的就是输出。


问题:这个陈述:玩家在天气晴朗时会出去玩,是正确的吗?


使用我们已经讨论过的方法, 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 Code

20.jpg


R Code

21.jpg


6、KNN算法(K-最近邻算法)


这个算法既可以用于分类问题,也可以用于回归问题。然而,在业界常更广泛用于分类问题。KNN算法是一个简单的算法,它存储所有案例,并依据新案例边的K个邻居的主要情况将新案例分类。一个案例将会被分到一个类中,这个类会是这个案例在某个距离函数视角下它的K个最近邻居们最常出现于的类。


这个距离函数可以是欧几里得距离,曼哈顿距离,明氏距离或汉明距离。前三个可以用于连续函数,第四个可以用于确定性变量。如果K=1,那么情况就简化到只考虑最近邻。有时候,选择合适的K值会是进行KNN建模的一大挑战。


更多的请查看:K-最近邻算法介绍——简化版

22.jpg


KNN算法可以很容易联系到我们的现实生活中来。如果你想了解一个你从来都没有接触过的人,你也许会从他最亲密的朋友,他生活的圈子来获得有关他的信息。


选择KNN算法之前应该考虑的事:

  • KNN是计算密集型的算法

  • 变量应该要标准化,否则范围大的变量会对结果产生影响

  • 进行KNN算法之前,要多注意数据的预处理阶段,比如偏差数据剔除,噪声过滤等。


Python Code

23.jpg


R Code

24.jpg








英文原文:https://www.analyticsvidhya.com/blog/2015/08/common-machine-learning-algorithms/
译者:yuezy3
 

2月15日11:00到13:00网站停机维护,13:00前恢复