写给产品经理的机器学习算法入门,在文章中会忽略一些细节以及算法本身具体的实现方式。我想尽量用直白的语言、较少的数学知识给各位产品经理讲清楚各个算法的原理是什么。
机器学习的过程机器学习的过程从本质上来说就是通过一堆的训练数据找到一个与理想函数(f)相接近的函数。在理想情况下,对于任何适合使用机器学习的问题在理论上是存在一个最优的函数让每个参数都有一个最合适的权重值,但在现实应用中不一定能这么准确得找到这个函数,所以我们要去找与这个理想函数相接近的函数,能够满足我们的使用那么我们就认为是一个好的函数。
这个训练数据的过程通常也被解释为在一堆的假设函数(Hypothesis set)中,它是包含了各种各样的假设,其中包括好的和坏的假设,我们需要做的就是从这一堆假设函数中挑选出它认为最好的假设函数(g),这个假设函数是与理想函数(f)最接近的。
机器学习过程
机器学习这个过程就好比在数学上,我们知道了有一个方程和一些点的坐标,用这些点来求这个方程的未知项从而得到完整的方程是什么。但在机器学习上我们往往很难解出来这个完整的方程是什么,所以我们只能通过各种手段求最接近理想情况下的未知项取值,使得这个结果最接近原本的方程。
什么问题适合用机器学习解决机器学习不是万能的,并不能解决所有的问题。通过以上机器学习的过程可以看出来,实质上机器学习是通过已知经验找到规律进行预测。
银行想知道应该发放多少贷款给某个客户时,可以根据过往成功放贷的数据找出每个贷款区间的人群特点、自身的房车资产状况等,再看看这个客户的特点符合哪个区间去确定应该发放多少贷款,这就是适合用机器学习去解决的问题。
三个要素与功能
对于适合用机器学习解决的问题,台大的林轩田教授为我们总结了三个要素:有规律可以学习、编程很难做到、有能够学习到规律的数据;满足这三个条件的问题,我们都可以挑选合适的算法去解决。
基于以上的条件,通常我们可以用机器学习解决三类问题:
预测(回归):根据已知数据和模型,预测不同客户应该发放的贷款额度是多少;
判别(分类):与预测有点类似,也是根据模型判别这个客户属于过往哪一类客户的概率有多大;
寻找关键因素:客户的属性非常多,通过模型我们可以找出对放贷影响最大的因素是什么;
感知机 Perceptron Learning Algorithm,PLA感知机学习算法是一种二分类的线性分类算法,一般用来解决二分类(只存在两个结果)的问题。例如我们判断一个同学的考试成绩合格还是不合格,银行会不会给某个客户发放贷款等,像这种只存正、负两个结果的问题就称为二分类的问题。
感知机学习算法的原理非常好理解,有点类似考试的概念,把很多个影响因素看成每道题的得分,因为不同题目的权重不同,所以我们每道题的得分由权重(重要程度)和这个因素的得分相乘,最后把所有题目的得分加起来看看有没有超过60分(阈值),如果超过了就是及格了(正结果),即对应的输出值为1,如果没有超过就是不及格(负结果),对应的输出值为-1。
还是以刚才银行贷款的例子来解释,通常银行判断给不给某个客户放贷款都是掌握了客户的各种信息如年薪、负债情况、社保缴费、公积金等等,因为数据的维度不同,描述的单位也不同,我们需要把这些数据按照各自维度的标准统一成可以量化的评分,可以按照年薪在5W以下得1分、5-10W得2分这样的方式进行量化。每个维度的重要程度都不同,所以我们在相加的时候需要考虑为每个值加上一个权重,最后得出来的结果看看有没有高过放款的阈值评分,如果高过这个分数就放款,低过这个分数就不放款。
首先看看关于感知机的数学定义:
感知机的定义
我们可以转换到几何的方式去看这个问题,在二维空间内,训练的数据就变成了平面上的一个点,这些数据里面有正样本以及负样本(成功放贷款的以及没有放贷款的),感知机算法的学习过程就是找到一个平面(在二维中表现为一条线),能够把所有的正样本和负样本区分开来,那么在应用的时候面对新来的客户,通过模型算出是正结果,我们就可以给这个客户发放贷款,算出来是负结果,我们就不发放贷款。
怎么去找到这条线(超平面)呢?
感知机使用的学习策略是梯度下降法,这种方法的思想是先在平面内随便找一条线,然后开始把样本点放到平面内,当一个点被误分类,即位于分类超平面错误的一侧时,调整模型的参数(w和b),使分类超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直到超平面越过该误分类点使其被正确分类为止。
感知机利用梯度下降法的训练过程
这种方式对于模型的训练非常快速,计算量相对较小,但同时这样的计算方式追求最大程度正确划分,最小化训练数据的错误,效果类似下图的直线,会导致比较容易造成过拟合的情况,即模型对于新数据的包容性差,过度得把新输入数据分成错误的类别。
线性回归 Linear regression,LR讲逻辑回归之前,我们先讲讲什么是线性回归。在统计学中,线性回归是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。举个直观的例子,深圳春运时的客流量可能是与过年的时间相关的,越接近过年这天人流量越大,如下图所示:
如果客运站想预测一下明天后天的客流量该这么办呢?
我们可以用一条线去尽量准的拟合这些数据,如果有新的数据输入进来,我们就可以找到对应的预测点:
上述例子就是一个最简单的一元线性回归分析:y=ax+b,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示。收集的数据中,每一个分量,就可以看做一个特征数据。例如上述例子的日期是一个特征,我们还可以找到地区、节假日、其他车站的客流量等等不同的因素,每个特征至少对应一个未知的参数。这样就形成了一个线性模型函数,当特征变多时,上述线性回归的向量可表示为一个矩阵方程。但这个矩阵方程由于计算量太大很难直接去求解,那么我们要怎么样去找到这根线的位置呢?
在这里我们可以退一步,把参数求解的问题,转化为求最小误差的问题,让实际值与预测值之间的误差变得最小,那么我们的预测值就十分接近实际值了。这就是损失函数的来源,在机器学习的算法中实际上存在大量由于计算量巨大从而无法求解的问题,我们都是把这类问题转化成求最小误差,即实际值与预测值之间的误差(损失)问题,想办法求出让误差最小的情况就可以得到问题的最优解。线性回归方程的损失函数通常是通过最小二乘法或梯度下降法求解,在这里我们不展开叙述。
线性回归是目前运用最广泛的模型之一,在金融、经济学、医学等领域常常用来解决预测类问题,通过观测数据集拟合出一个预测模型,告诉我们一组特定数据是否在一段时间内会增长或下降。
逻辑回归 Logistic regression,LR逻辑回归实际上也是一个线性回归模型,但是线性回归常常用来做预测,逻辑回归却常常用来解决二分类问题。为什么会有这么大的差异呢?
如果对于上面的感知机算法来说,目标是为了找到一个能够将正负样本完全分开的超平面,从另外一个层面看感知机算法相当于是一个跃阶函数,我们只需要找到阈值并且拿输入的数据对比是大于还是小于这个阈值,然后就能给出的就是0或1(正/负样本)的反馈。
对应到数学模型上我们只需要把算出来的结果映射到这个跃阶函数上看看大于0还是小于0就能说他是一个正样本还是负样本。
感知器的模型虽然简单直观,但问题在于这个模型不够光滑,如果对于一个新的样本点我们计算出来结果等于0.01,只比0大了一点点就会被分类为正样本,这样在实际应用的时候可能会不够准确,同时这个函数在0处有一个跃阶导致这一点不连续,在数学上也不好处理。
那么有没有什么方法可以让这个函数更光滑一点呢?
在数学上刚好存在一个sigmoid函数有这样的特性。这个函数的输入范围是−∞→+∞,而值域则光滑地分布在0到1之间。对于这个模型的解释和感知机也稍微有些区别,感知机是根据输入的条件,判断是一个正样本还是负样本,而逻辑回归因为值域分布在0到1之间的特性,所以输出的是判断是一个正样本或负样本的概率是多少。我们的学习策略即是求所有训练样本的条件概率之积的最大值,也可以理解为求概率之积尽可能大,这样模型预测的效果就会越准确。
逻辑回归的本质上是一个线性回归模型,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测。我们看到的参数z实际上也是一个线性回归的方程,只不过在这里符号化表示。实际上求解的方式与线性回归是相同的,都是要通过损失函数的方式逼近最优解。
逻辑回归的目的是将样本分成0或1两类,但是我们也关心样本分类的准确性,例如一个肿瘤被预测出来是恶性的,我们也会关心它是恶性的可能性有多大。对逻辑回归的理解也可以是:我们通过概率将样本分成了0和1两类。
因为逻辑回归不像感知机是通过一个固定的阀值去判断样本数据的正负性,所以在二维平面上也不再是通过一条直线去判断数据,而是变得更加有包容性,可以把一些不能线性区分的数据集区分开来,其根本原因就是sigmoid函数把因变量自变量变成了曲线的关系,使得在函数在二维平面上的表现更为柔和,这里面损失函数发挥了很大的作用,这里不再展开说明。
逻辑回归与感知机相比,有三方面的优势:
1.直接对分类可能性建模,不需要事先假设数据的分布情况。感知机算法中如果不先假设一下数据的分布再去确定线的位置很可能会算错,但是逻辑回归算法就避免了这个问题;
2.不仅可以预测出类别,还可以给出具体的概率预测值。对预测结果有更好的解释性;
3.有很好的数学性质,方便计算,工程量较小;
逻辑回归算法因其优点是现在最广泛使用的算法之一,常常用来做寻找某一疾病的危险因素、个人信用评估、贷款/金融意图预测等等领域,同时也可以用来对数据做自动判别分析,比如一条评论是正面还是负面,一个用户的购买路径是男性还是女性,预测用户会不会购买某种商品等等,逻辑回归应用广泛还是因为许多现实问题跟它的模型吻合,能够帮助我们快速解决很多实际的问题。
K近邻分类算法 K-Nearest Neighbor,KNN上面我们说到感知机以及逻辑回归实际上都是一种二分类算法,非黑即白,如果遇到多分类问题该如何解决呢?有一种非常简单的算法可以帮助我们快速解决这个问题——K近邻分类算法。
K近邻分类算法是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。
用官方的解释来说,所谓K近邻算法,即存在一个样本数据(训练样本)集,并且样本中每个数据都存在标签(类别),也就是说样本集中每一个数据都被分到一个类别中。输入新的数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据的分类标签,即可以为新输入的数据进行分类。
在训练数据集中找到与该实例最邻近的K个实例, 这K个实例的大多数都属于同一个分类,就把该输入实例分类到这个类中。一般情况下,我们只选择样本集中前K个最相似的数据,这就是K近邻算法中k的出处,比较3个最近的数据,那么K=3。通常K是不大于20的整数,最后,选择K个最相似的数据中出现次数最多的分类,作为新数据的分类。
这种思想实际上也非常好理解,有点像“人以类聚,物以群分”的说法,如果你身边的邻居都来自同一个公司,那么你极有可能也属于某个公司。如果你身边的朋友绝大多数都属于某个学校毕业,那么你极有可能也曾经在这个学校读过书。这种方式也很类似投票机制,新来的数据与旧数据相比对,多数都属于某个类别时,采用少数服从多数的原则,给新数据归类。
同样我们转化到几何的方式去看这个算法,KNN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟已知数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,就把这个新的点归到这个同属大多数的类别里。
K近邻分类算法的优缺点都非常明显。优点主要有两个方面:
1.精度很高,对异常数据也不敏感(所属类别是由大多数点决定了,一两个异常点不会有太大的影响)
2.与上面的PLA、LR算法相比,不需要训练模型,易于实现,来一个新数据就可以马上进行比对。
缺点则是计算复杂度比较高,因为要算新数据与每一个临近点的距离,当维度超过二维时这就是一个空间复杂度很大的矩阵。
基于KNN算法的特点,目前主要应用在文本分类与商品推荐等场景,在文本分类中像信息检索、手写字识别、机器翻译这样的场景都可以使用KNN算法以保证在有限的硬件资源下,提供给用户一个高效的检索系统。
朴素贝叶斯分类器 Naive Bayes Classifier,NBC贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理和特征条件独立假设为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。
朴素贝叶斯的简单之处在于:对于给出的待分类项,求解在此待分类项出现的条件下各个类别出现的概率,哪个概率最大,就认为此待分类项属于哪个类别,这就有点像我们走在街上,迎面走过来一个黑色皮肤的人,那我们就猜他是非洲人,因为黑人中非洲人最多。
通过上述例子我们可以看到,我们判断一个人是非洲人基于一个很关键的信息,因为他是黑色皮肤的人。所以我们的判断实际上是发生在“拥有黑色皮肤”这件事的情况下我们的推断,这种在其他已知事件发生的基础上计算某件事发生的概率叫做条件概率,一般我们使用贝叶斯定理求解条件概率。
要搞懂贝叶斯定理之前,我们首先要搞懂什么是正向概率什么是反向(条件)概率。在贝叶斯研究之前, 人们已经能够计算正向概率,比如“假设袋子里有N个白球M个黑球,你伸手进去摸一把,摸出黑球的概率有多大”。然而在我们实际生活中,日常能观察到的只是事物表面的结果,往往我们只知道从袋子里取出来的球是什么颜色,并不能看到袋子里的实际情况。这时候我们就希望有一些方法可以通过观察这些取出来的球的颜色,可以推测出袋子里面黑白球的比例是什么样的。
我们通过下图简单讲一下贝叶斯定理的组成:
朴素贝叶斯分类器的核心在于训练模型阶段,需要计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
让我们通过一个贝叶斯分类器解决拼写检查/纠正的例子加深理解,当一个用户输入了一个不在字典中的单词时,我们需要去猜测这个人到底想要输出的单词是什么呢?如果用户输出了一个theu,那么他到底是想输入they还是then?到底哪个猜测的可能性更大?
这个问题实际上是在求“已知输入theu的情况下,我们猜测他想输出they\then的概率谁更大”用上述符号表示即P(B|A),我们可以很容易计算出they\then单词的词频P(B)、那么要怎么得到P(A|B)呢?在这里可以用输入单词与正确单词在键盘上的距离来表示P(A|B),即通过字母在键盘上的距离判断下输入哪个字母的可能性更高,比如在键盘上Y和U离得更近所以我们会认为输入Y但是不小心按成了U的概率更大一些。通过上述的信息就可以计算出输出哪个单词的概率更大。
朴素贝叶斯分类器的以下优点:
1.生成式模型,通过计算概率来进行分类,可以用来处理多分类问题而且分类的结果很容易被解释;
2.所需估计的参数不大,对缺失数据不太敏感;
3.无需复杂的迭代求解框架,适用于规模巨大的数据集。
除了上述说到的拼写纠正以外,贝叶斯分类器还经常用在垃圾邮件分类、文字广告过滤、识别恶性评论等等领域。在许多场景下,朴素贝叶斯分类算法可以与后续讲到的决策树、神经网络算法相媲美,而且方法简单、分类准确率高、速度快。但这个算法也有一些像对输入数据的形式比较敏感、计算先验概率时分类决策可能存在错误这样的缺点,在使用的时候还是要根据具体的场景选择。
下一篇我们讲讲:
决策树;
随机森林;
神经网络;
聚类;
集成算法;