机器之心编译
参与:蒋思源、晏奇
在本教程中,作者对当代机器学习算法进行一次简要的实战梳理。虽然类似的总结有很多,但是它们都没有真正阐明清楚每个算法在实践中的好坏,而这正是本篇梳理希望完成的。因此本文力争基于实践中的履历,谈论每个算法的优缺陷。而机器之心也在文末给出了这些算法的详细实现细节。

对机器学习算法进行分类不是一件随意马虎的事情,总的来看,有如下几种办法:天生与判别、参数与非参数、监督与非监督等等。
然而,就实践履历来看,这些都不是实战过程中最有效的分类算法的办法。由于对付运用机器学习而言,开拓者一样平常会在脑海中有一个终极目标,比如预测一个结果或是对你的不雅观察进行分类。
因此,我们想先容另一种对算法进行分类的路数,其基于机器学习任务来分类。
没有免费午餐定理
在机器学习中,有个定理被称为「没有免费的午餐」。简而言之,便是说没有一个算法可以完美办理所有问题,而且这对付监督学习(即对预测的建模)而言尤其如此。
举个例子,你不能说神经网络就一定任何时候都比决策树精良,反过来也是。这个中存在很多影响成分,比如你数据集的规模和构造。
以是,当你利用一个固定的数据测试集来评估性能,挑选最适宜算法时,你该当针对你的问题考试测验多种不同的算法。
当然,你所利用的算法必须要适宜于你试图办理的问题,这也就有了如何选择精确的机器学习任务这一问题。做个类比,如果你须要打扫你的屋子,你可能会用吸尘器、扫帚或者是拖把,但是你绝不会取出一把铲子然后开始挖地。
机器学习任务
在本次梳理中,我们将涵盖目前「三大」最知识趣器学习任务:
回归方法
分类方法
聚类方法
解释:
本文的梳理不会涵盖详细领域的问题,比如自然措辞处理。
本文也不会对每个算法都进行梳理。由于现有太多算法,而且新的算法也层出不穷。然而,这份清单将向读者展现对每个任务而言目前具有代表性的算法概览。
1、回归方法
回归方法是一种对数值型连续随机变量进行预测和建模的监督学习算法。利用案例一样平常包括房价预测、股票走势或测试成绩等连续变革的案例。
回归任务的特点是标注的数据集具有数值型的目标变量。也便是说,每一个不雅观察样本都有一个数值型的标注真值以监督算法。
1.1 线性回归(正则化)
线性回归是处理回归任务最常用的算法之一。该算法的形式十分大略,它期望利用一个超平面拟合数据集(只有两个变量的时候便是一条直线)。如果数据集中的变量存在线性关系,那么其就能拟合地非常好。
在实践中,大略的线性回归常日被利用正则化的回归方法(LASSO、Ridge 和 Elastic-Net)所代替。正则化实在便是一种对过多回归系数采纳惩罚以减少过拟合风险的技能。当然,我们还得确定惩罚强度以让模型在欠拟合和过拟合之间达到平衡。
优点:线性回归的理解与阐明都十分直不雅观,并且还能通过正则化来降落过拟合的风险。其余,线性模型很随意马虎利用随机梯度低落和新数据更新模型权重。
缺陷:线性回归在变量是非线性关系的时候表现很差。并且其也不足灵巧以捕捉更繁芜的模式,添加精确的交互项或利用多项式很困难并须要大量韶光。
Python 实现:http://scikit-learn.org/stable/modules/linear_model.html
R 实现:https://cran.r-project.org/web/packages/glmnet/index.html
1.2 回归树(集成方法)
回归树(决策树的一种)通过将数据集重复分割为不同的分支而实现分层学习,分割的标准是最大化每一次分离的信息增益。这种分支构造让回归树很自然地学习到非线性关系。
集成方法,如随机森林(RF)或梯度提升树(GBM)则组合了许多独立演习的树。这种算法的紧张思想便是组合多个弱学习算法而成为一种强学习算法,不过这里并不会详细地展开。在实践中 RF 常日很随意马虎有出色的表现,而 GBM 则更难调参,不过常日梯度提升树具有更高的性能上限。
优点:决策树能学习非线性关系,对非常值也具有很强的鲁棒性。集成学习在实践中表现非常好,其常常赢得许多经典的(非深度学习)机器学习竞赛。
缺陷:无约束的,单棵树很随意马虎过拟合,由于单棵树可以保留分支(不剪枝),并直到其记住了演习数据。集成方法可以削弱这一缺陷的影响。
随机森林 Python 实现:http://scikit-learn.org/stable/modules/ensemble.html#random-forests
随机森林 R 实现:https://cran.r-project.org/web/packages/randomForest/index.html
梯度提升树 Python 实现:http://scikit-learn.org/stable/modules/ensemble.html#classification
梯度提升树 R 实现:https://cran.r-project.org/web/packages/gbm/index.html
1.3 深度学习
深度学习是指能学习极其繁芜模式的多层神经网络。该算法利用在输入层和输出层之间的隐蔽层对数据的中间表征建模,这也是其他算法很难学到的部分。
深度学习还有其他几个主要的机制,如卷积和 drop-out 等,这些机制令该算法能有效地学习到高维数据。然而深度学习相对付其他算法须要更多的数据,由于其有更大数量级的参数须要估计。
优点:深度学习是目前某些领域最前辈的技能,如打算机视觉和语音识别等。深度神经网络在图像、音频和文本等数据上表现精良,并且该算法也很随意马虎对新数据利用反向传播算法更新模型参数。它们的架构(即层级的数量和构造)能够适应于多种问题,并且隐蔽层也减少了算法对特色工程的依赖。
缺陷:深度学习算法常日不适宜作为通用目的的算法,由于其须要大量的数据。实际上,深度学习常日在经典机器学习问题上并没有集成方法表现得好。其余,其在演习上是打算密集型的,以是这就须要更富履历的人进行调参(即设置架构和超参数)以减少演习韶光。
Python 资源:https://keras.io/
R 资源:http://mxnet.io/
1.4 最近邻算法
最近邻算法是「基于实例的」,这就意味着其须要保留每一个演习样本不雅观察值。最近邻算法通过征采最相似的演习样本来预测新不雅观察样本的值。
而这种算法是内存密集型,对高维数据的处理效果并不是很好,并且还须要高效的间隔函数来度量和打算相似度。在实践中,基本上利用正则化的回归或树型集成方法是最好的选择。
2、分类方法
分类方法是一种对离散型随机变量建模或预测的监督学习算法。利用案例包括邮件过滤、金融敲诈和预测雇员异动等输出为类别的任务。
许多回归算法都有与其相对应的分类算法,分类算法常日适用于预测一个种别(或类别的概率)而不是连续的数值。
2.1 Logistic 回归(正则化)
Logistic 回归是与线性回归相对应的一种分类方法,且该算法的基本观点由线性回归推导而出。Logistic 回归通过 Logistic 函数(即 Sigmoid 函数)将预测映射到 0 到 1 中间,因此预测值就可以算作某个类别的概率。
该模型仍旧还是「线性」的,以是只有在数据是线性可分(即数据可被一个超平面完备分离)时,算法才能有精良的表现。同样 Logistic 模型能惩罚模型系数而进行正则化。
优点:输出有很好的概率阐明,并且算法也能正则化而避免过拟合。Logistic 模型很随意马虎利用随机梯度低落和新数据更新模型权重。
缺陷:Logistic 回归在多条或非线性决策边界时性能比较差。
Python 实现:http://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
R 实现:https://cran.r-project.org/web/packages/glmnet/index.html
2.2 分类树(集成方法)
与回归树相对应的分类算法是分类树。它们常日都是指决策树,或更严谨一点地称之为「分类回归树(CART)」,这也就是非常著名的 CART 的算法。
大略的随机森林
优点:同回归方法一样,分类树的集成方法在实践中同样表现十分优秀。它们常日对非常数据具有相称的鲁棒性和可扩展性。由于它的层级构造,分类树的集成方法能很自然地对非线性决策边界建模。
缺陷:不可约束,单棵树趋向于过拟合,利用集成方法可以削弱这一方面的影响。
随机森林 Python 实现:http://scikit-learn.org/stable/modules/ensemble.html#regression
随机森林 R 实现:https://cran.r-project.org/web/packages/randomForest/index.html
梯度提升树 Python 实现:http://scikit-learn.org/stable/modules/ensemble.html#classification
梯度提升树 R 实现:https://cran.r-project.org/web/packages/gbm/index.html
2.3 深度学习
深度学习同样很随意马虎适应于分类问题。实际上,深度学习运用地更多的是分类任务,如图像分类等。
优点:深度学习非常适用于分类音频、文本和图像数据。
缺陷:和回归问题一样,深度神经网络须要大量的数据进行演习,以是其也不是一个通用目的的算法。
Python 资源:https://keras.io/
R 资源:http://mxnet.io/
2.4 支持向量机
支持向量机(SVM)可以利用一个称之为核函数的技巧扩展到非线性分类问题,而该算法实质上便是打算两个称之为支持向量的不雅观测数据之间的间隔。SVM 算法探求的决策边界即最大化其与样本间隔的边界,因此支持向量机又称为大间距分类器。
支持向量机中的核函数采取非线性变换,将非线性问题变换为线性问题
例如,SVM 利用线性核函数就能得到类似于 logistic 回归的结果,只不过支持向量机由于最大化了间隔而更具鲁棒性。因此,在实践中,SVM 最大的优点便是可以利用非线性核函数对非线性决策边界建模。
优点:SVM 能对非线性决策边界建模,并且有许多可选的核函数形式。SVM 同样面对过拟合有相称大的鲁棒性,这一点在高维空间中尤其突出。
缺陷:然而,SVM 是内存密集型算法,由于选择精确的核函数是很主要的,以是其很难调参,也不能扩展到较大的数据集中。目前在工业界中,随机森林常日优于支持向量机算法。
Python 实现:http://scikit-learn.org/stable/modules/svm.html#classification
R 实现:https://cran.r-project.org/web/packages/kernlab/index.html
2.5 朴素贝叶斯
朴素贝叶斯(NB)是一种基于贝叶斯定理和特色条件独立假设的分类方法。实质上朴素贝叶斯模型便是一个概率表,其通过演习数据更新这张表中的概率。为了预测一个新的不雅观察值,朴素贝叶斯算法便是根据样本的特色值在概率表中探求最大概率的那个种别。
之以是称之为「朴素」,是由于该算法的核心便是特色条件独立性假设(每一个特色之间相互独立),而这一假设在现实天下中基本是不现实的。
优点:纵然条件独立性假设很难成立,但朴素贝叶斯算法在实践中表现出乎猜想地好。该算法很随意马虎实现并能随数据集的更新而扩展。
缺陷:由于朴素贝叶斯算法太大略了,以是其也常常被以上列出的分类算法所替代。
Python 实现:http://scikit-learn.org/stable/modules/naive_bayes.html
R 实现:https://cran.r-project.org/web/packages/naivebayes/index.html
3、聚类
聚类是一种无监督学习任务,该算法基于数据的内部构造探求不雅观察样本的自然族群(即集群)。利用案例包括细分客户、新闻聚类、文章推举等。
由于聚类是一种无监督学习(即数据没有标注),并且常日利用数据可视化评价结果。如果存在「精确的回答」(即在演习集中存在预标注的集群),那么分类算法可能更加得当。
3.1 K 均值聚类
K 均值聚类是一种通用目的的算法,聚类的度量基于样本点之间的几何间隔(即在坐标平面中的间隔)。集群是环绕在聚类中央的族群,而集群呈现出类球状并具有相似的大小。聚类算法是我们推举给初学者的算法,由于该算法不仅十分大略,而且还足够灵巧以面对大多数问题都能给出合理的结果。
优点:K 均值聚类是最盛行的聚类算法,由于该算法足够快速、大略,并且如果你的预处理数据和特色工程十分有效,那么该聚类算法将拥有令人惊叹的灵巧性。
缺陷:该算法须要指定集群的数量,而 K 值的选择常日都不是那么随意马虎确定的。其余,如果演习数据中的真实集群并不是类球状的,那么 K 均值聚类会得出一些比较差的集群。
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#k-means
R 实现:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html
3.2 Affinity Propagation 聚类
AP 聚类算法是一种相对较新的聚类算法,该聚类算法基于两个样本点之间的图形间隔(graph distances)确定集群。采取该聚类方法的集群拥有更小和不相等的大小。
优点:该算法不须要指出明确的集群数量(但是须要指定「sample preference」和「damping」等超参数)。
缺陷:AP 聚类算法紧张的缺陷便是演习速率比较慢,并须要大量内存,因此也就很难扩展到大数据集中。其余,该算法同样假定潜在的集群是类球状的。
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#affinity-propagation
R 实现:https://cran.r-project.org/web/packages/apcluster/index.html
3.3 层次聚类(Hierarchical / Agglomerative)
层次聚类是一系列基于以下观点的聚类算法:
最开始由一个数据点作为一个集群
对付每个集群,基于相同的标准合并集群
重复这一过程直到只留下一个集群,因此就得到了集群的层次构造。
优点:层次聚类最紧张的优点是集群不再须要假设为类球形。其余其也可以扩展到大数据集。
缺陷:有点像 K 均值聚类,该算法须要设定集群的数量(即在算法完成后须要保留的层次)。
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering
R 实现:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/hclust.html
3.4 DBSCAN
DBSCAN 是一个基于密度的算法,它将样本点的密集区域组成一个集群。最近还有一项被称为 HDBSCAN 的新进展,它许可改变密度集群。
优点:DBSCAN 不须要假设集群为球状,并且它的性能是可扩展的。此外,它不须要每个点都被分配到一个集群中,这降落了集群的非常数据。
缺陷:用户必须要调度「epsilon」和「min_sample」这两个定义了集群密度的超参数。DBSCAN 对这些超参数非常敏感。
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#dbscan
R 实现:https://cran.r-project.org/web/packages/dbscan/index.html
结语
本文从回归问题、分类问题和聚类问题三个角度下初步理解了各个算法的优缺陷,也基本理解了那些算法到底是什么。但以上每一个算法都有更多的观点和细节没有展现出来,我们不能知道它们的丢失函数是什么、演习目标是什么、权重更新策略是什么等等一些列问题。因此我们希望能从机器之心历来文章中征采一些,为有兴趣的读者供应这些算法的详细细节。
线性回归:
初学 TensorFlow 机器学习:如何实现线性回归?(附练习题)
从头开始:用 Python 实现带随机梯度低落的线性回归
决策树(集成方法):
从头开始:用 Python 实现随机森林算法
从头开始:用 Python 实现决策树算法
支持向量机:
详解支持向量机(附学习资源)
深度学习:
深度神经网络全面概述:从基本观点到实际模型和硬件根本
深度学习与神经网络全局概览:核心技能的发展进程
聚类算法:
机器理解大数据的秘密:聚类算法深度详解
末了,不论是基本观点还是详细算法,最主要的便是实践。不实践这些算法就永久不能创造哪些地方没有节制,因此希望本文能有助于各位读者实践自己的算法。