选自机器之心编译参与:蒋思源、晏奇
作者于本教程之中, 对现代机器学习算法作出一次简要的实战梳理。尽管类似的总结数量众多, 然而它们均未曾实际阐释明晰每个算法于实践里的优劣, 而此处所说的优劣正是作者此次梳理期望达成的。所以, 本文尽力凭借在实践当中所获取的经验, 探讨每个算法的优点与缺点。并且, 机器之心于文末给出了这些算法的具体实现细节。
针对机器学习算法予以分类, 并非是一桩轻而易举的事情, 全面地看, 存在着如下这般的几种方式, 分别是: 生成以及判别, 参数同非参数, 监督与非监督等等。
然而, 从实践经验方面来讲, 这些并非是实战进程里最具成效的分类算法的形式。因为对于应用机器学习来说呢, 开发者通常在脑海当中会存有一个最终目的, 像预测某个结果或者对你的观察予以分类。
因此, 我们打算介绍另外一种路数, 这种路数是用来对对算法进行分类的, 它是基于机器学习任务来进行分类的。
没有免费午餐定理
存在这样一个定理在机器学习里被称作「没有免费的午餐」, 简单来讲, 不存在一个算法能够将所有问题都完美解决, 并且对于依据对预测进行建模的监督学习来说, 这种情况尤为突出。
举一个例子, 你没办法表明神经网络在任何时刻都必定比决策树出色, 反之亦然。这里存在众多起影响作用的因素, 像你所拥有的数据集的规模以及结构。
因此, 在你运用一个处于固定状态的数据测试集进行性能评估, 进而挑选最为适配算法之际, 你理应针对自身所面临的问题去尝试多种彼此各异的算法。
当然, 你用以使用的算法必然得契合你想要试图去解决的那个问题, 如此也就产生了怎样去选择正确的机器学习任务这一个问题。进行一下类比, 要是你有需要去打扫自身的房子, 你兴许就会运用吸尘器、扫帚亦或是拖把, 然而你绝对不会拿出一把铲子而后开始去挖地。
机器学习任务
在本次梳理中,我们将涵盖目前「三大」最常见机器学习任务:
回归方法分类方法聚类方法
说明:
本文梳理不会包含具体领域问题, 像自然语言处理一类, 本文也不会对各个算法都予以梳理, 缘故就是现有算法数量庞大, 并且新算法持续不断出现, 然而, 这份清单会给读者呈现针对每个任务当下具备代表性的算法概览。
1、回归方法
有一种称作回归方法的监督学习算法, 它专门针对数值型连续随机变量来开展预测以及建模工作。其使用案例通常涵盖像房价预测、股票走势或者测试成绩这类呈现连续变化情况的案例。
以数值型目标变量为有标注数据集的特征, 构成了回归任务, 即每一个观察样本, 都凭借一个数值型标注真值达成监督算法。
1.1 线性回归(正则化)
处理回归任务时, 最常用的算法之一是线性回归, 该算法形式极为简单, 它期望运用一个超平面去拟合数据集(当只有两个变量时此超平底情况下是一条直线), 倘若数据集中的变量存在线性关系, 那么它就能拟合得十分良好。
在实践当中, 简单的线性回归常常被采用正则化的回归方法, 也就是 LASSO、Ridge 以及 -Net 所替换。正则化实际上是一种针对过多回归系数施行惩罚, 从而降低过拟合风险的技术。当然了,我们还需要确定惩罚强度,以便让模型在欠拟合与过拟合之间达成平衡。
优点: 对于线性回归而言, 其理解、解释极为直观, 同时, 借助正则化能够减少过拟合的风险;此外, 依靠随机梯度下降与新数据去实现模型权重的更新, 线性模型是比较容易操作。缺点: 当变量显示的是非线性关系时, 线性回归所呈现的表现欠佳;并且于捕捉更为复杂模式方面其也并非足够灵活, 还要增添正确的交互项或者使用多项式, 然而这是存在困难的, 而且需要耗费大量时间。
实现: 实现:
1.2 回归树(集成方法)
有一种决策树叫回归树, 它借助把数据集反复划分成各异的分支来达成分层学习, 划分所依据的标准乃是让每一回分离的信息增益达到最大化, 就是这样的分支结构使回归树能够自然而然地学习到非线性关系。
使用如随机森林(RF)或者梯度提升树(GBM)这般的集成方法,会组合好多独立训练的树, 这种算法的主要思想是让多个弱学习算法合并构成一种强学习算法, 只是这里不会详细阐述将多棵独立树进行组合的具体过程, 在实际应用中, 随机森林(RF)往往容易展现出出色的表现, 然而梯度提升树(GBM)更难以进行参数调试, 不过通常情况下梯度提升树具备更高的性能上限。
优点: 决策树, 能够学习非线性的关系, 对于异常值, 也具备很强的鲁棒性。集成学习, 在实践当中, 表现得相当之好, 它常常会赢得许多, 经典的(并非深度学习的)机器学习竞赛。缺点: 没有约束的情况下, 单独的一棵树, 极其容易出现过拟合的状况, 原因在于, 单独的一棵树, 可以保留分支(不去进行剪枝操作), 并且一直到它记住了训练数据。集成方法, 能够减弱这一缺点所带来的影响。
对于随机森林, 有着其对应的实现方式, 随机森林在R语言环境下也存在实现, 梯度提升树同样有实现情况, 再者梯度提升树在R语言中也是存在相关实现的。
1.3 深度学习
深度学习是指那种能够学习极为复杂模式的多层神经网络, 该算法借助位于输入层与输出层之间的隐藏层对数据的中间表征进行建模, 而这部分恰恰是其他算法极难学到的。
深度学习存在着另外几个关键的机制, 像卷积以及drop - out等等, 这些机制使得该算法能够高效地学习到高维的数据资料。不过呢, 深度学习相对于其他的算法而言, 是需要更多数量的数据的, 原因在于它有着更大数量级的参数是需要去进行估计的。
优点: 深度学习属于当下某些领域里最为先进的技术, 像计算机视觉以及语音识别等方面。深度神经网络于图像、音频还有文本等这些数据上展现出优异表现, 而且该算法运用反向传播算法去更新模型参数对于新数据而言也比较容易上手。它们的架构, 即是层级的数量以及结构, 能适用于多种问题, 并且隐藏层还降低了算法对特征工程的依赖程度。缺点: 深度学习算法一般不适宜当作通用目的的算法, 原因在于其需要数量庞大的数据。实际上, 深度学习在经典机器学习问题上通常没有集成方法表现得那般出色。另外, 其于训练这方面属于计算密集型的, 因而这便需求更具经验之人去开展调参工作指的是设置架构以及超参数以此来削减训练时间。
资源: 资源:
1.4 最近邻算法
最近邻算法属于「按实例来定的」, 这表明它得留存每一个训练样本的观测情况, 最近邻算法借助探寻最相仿的训练样本来预估新观测样本的值。
而这种算法属于内存密集型, 它针对高维数据的处理成效并非很好, 而且还得要有高效的距离函数用以度量以及计算相似度。在实践当中, 基本上采用正则化的回归亦或者树型集成方法当属最佳的选择。
2、分类方法
存在一种监督学习算法, 它是属于分类方法的, 其用以对离散型随机变量来建模或者预测。该算法的使用案例涵盖了邮件过滤, 还有金融欺诈以及预测雇员异动等, 这些案例的输出均以类别作为结果。
有种看法认为, 不少回归算法, 都存在与之相对, 能够发挥不同作用的分类算法, 分类算法一般情况下, 是用于预测一个类别, 或者预测的是类别的概率, 而非一系列连续不断的数值, 这种情况确实会出现。
2.1 回归(正则化)
回归算得上是和线性回归相互对应的分类法子, 而且该算术的基础概念是从线性回归那里推导出来的。回归借助函数(也就是函数)把预测投射到0至1之间, 所以预测值能够当作某个类别的可能性。
那模型依旧是「线性」的, 因而唯有在数据呈现线性可分的情况(也就是数据能够被一个超平面全然分离)时, 算法才会有出色的表现。同样, 模型能够通过对模型系数加以惩罚来开展正则化。
优点: 输出具备很好的概率解释, 而且算法能够正则化进而避免过拟合, 模型借助随机梯度下降以及新数据更新模型权重比较容易。缺点: 多条或非线性决策边界情形时回归性能比较差。
实现: 实现:
2.2 分类树(集成方法)
分类树是和回归树相对应的分类算法,它们常常都被称作决策树, 或者更严谨些的说法是「分类回归树(CART)」, 这便是极为著名的CART算法。
简单的随机森林
优点: 分类树的集成方法就如同回归方法那般, 于实践当中展现出来的表现同样是极为出色的。该集方法一般而言对于异常数据有着颇为显著的鲁棒性, 与此同时还具备可扩展性。鉴于其自身所拥有的层级结构之故, 分类树的集成方法能够以一种极为自然的方式针对非线性决策边界展开建模。缺点: 是不具备可约束性的, 乃是单棵树往往会倾向于出现过拟合这种情况的, 此时采用集成方法这种方式能够在这一方面所产生的影响上起到削弱的作用。
随机森林 实现:随机森林 R 实现:梯度提升树 实现:梯度提升树 R 实现:
2.3 深度学习
事实上, 深度学习更常被应用于分类任务, 像是图像分类这类, 而且深度学习同样极易适配于分类问题。
长处在这种情形下, 深度学习对分类音频数据而言是极为适用的, 对文本数据来说也是相当适用的, 对图像数据来讲同样是极为合用的。短处在于, 如同回归问题那般, 深度神经网络为了展开训练, 是需要数量众多的数据的, 因而它并不是一种广泛通用目的的算法。
资源: 资源:
2.4 支持向量机
支持向量机, 可借一个称作核函数的手段, 拓展至非线性分类问题, 该之算法, 实质乃计算两个名为支持向量的观测数据间的距离。此算法寻觅的决策边界, 是令其与样本间隔最大化的边界, 故而支持向量机又被叫做大间距分类器。
核函数于支持向量机内, 运用非线性变换, 把非线性问题转作线性问题。
比如, SVM运用线性核函数能够获取类似于回归的成果, 只是支持向量机由于将间隔最大化所以更具鲁棒性。因而, 在实际应用中, SVM最为突出的优点便是能够借助非线性核函数对非线性决策边界进行建模。
优点: SVM可针对非线性决策边界实施建模, 且存在诸多可供选择的核函数形式, 又SVM面对过拟合具备比较大的鲁棒性, 此突出表现就在高维空间之中;缺点: 但是SVM属于内存密集型算法, 依据因为挑选正确的核函数至关重要, 故而其在调节参数方面很困难, 并且无法拓展至容量较大的数据集会里, 当前在工业界范畴内,随机森林通比支持向量机算法更具优势。
实现: 实现:
2.5 朴素贝叶斯
一种, 称朴素贝叶斯(NB)的, 因基于贝叶斯定理以及特征条件独立假设而成的分类方法。本质上, 一个概率表, 是所谓朴素贝叶斯模型, 其经由训练数据去更新本表中的概率成分, 得以达成更新。为了对一个新的观察值做出预测这一目的, 依据样本的特征值, 针对在概率表当中寻觅最大概率的那一个类别, 此为朴素贝叶斯算法。
说是「朴素」, 是由于该算法核心是特征条件独立性假设, 即每一个特征相互独立, 然而这一假设在现实世界里基本不现实。
优点: 即便条件独立性假设极难成立, 然而朴素贝叶斯算法于实践里表现得出奇得好。该算法极易实现, 且能够随数据集的更新而扩展, 缺点: 鉴于朴素贝叶斯算法太过简单, 故而其也常常被上述列出的分类算法所取代。
实现: 实现:
3、聚类
有一类被称作聚类的无监督学习任务, 其算法是依据数据的内部结构, 去寻觅观察样本的自然族群也就是集群, 它的使用案例涵盖细分客户这一情况, 还有新闻聚类以及文章推荐等。
聚类属于无监督学习,也就是数据未标注, 一般要借助数据可视化来评判结果。要是有“正确的回答”这一情况, 就是在训练集中存有预标注的集群, 那分类算法没准会更适宜。
3.1 K 均值聚类
K均值聚类属于通用目的算法, 其聚类度量依据样本点间几何距离, 也就是坐标平面内的距离, 集群为围绕聚类中心的族群, 且集群呈类球状并有相似规模, 我们把聚类算推荐给初学者, 是因为该算法不但特别简单, 还足够灵活, 面对多数问题都能得出合理结果。
优点: K均值聚类属于最流行的聚类算法范畴, 原因在于该算法具备足够的快速特性, 且具有简单的特点, 而且倘若你的预处理数据以及特征工程极其有效, 那么这一聚类算法将会有着令人极为赞叹的灵活性趋势。缺点: 该算法存在需要指定集群数量的情况, 然而K值的选择通常来讲并非那么容易去确切判定的情况。另外, 要是训练数据之中的真实集群并非属于类球状的, 那么K均值聚类通常会得出一类比较差强人意的集群状况。
实现: 实现:
3.2 聚类
AP聚类算法, 是一种聚类算法,它相对较新, 该算法借由两个样本点之间的图形距离来确定集群, 采用此聚类办法的集群有着更小且不相等的大小。
先说优点, 此算法于明确集群数量方面无需指明, 不过呢需要对「 」还有「」这般字样的超参数予以指定。转而说缺点, AP聚类算法最为显著的缺点便是训练速度相对迟缓, 而且所需内存量颇为巨大, 正因如此, 要扩展至大数据集是极具难度的。另外而言, 该算法还同样有着潜在集群为类球状的假定情况。
实现: 实现:
3.3 层次聚类( / )
层次聚类是一系列基于以下概念的聚类算法:
一个数据点最初作为一个集群, 对于每个集群, 依据相同标准合并集群, 重复此过程, 直至仅留一个集群, 所以得到了集群的层次结构。
优势方面: 层次聚类最为突出的优势在于, 集群无需再被假定为类球形, 此外还能够拓展至大数据集。不足体现在: 有点类似K均值聚类, 此算法需要设定集群的数量, 也就是在算法结束后需要留存的层次。
实现: 实现:
3.4
这是一种基于密度的算法, 该算法会把样本点存在的密集区域, 组合成一个集群。近期存在另外一展新进展, 此项进展被称作 , 它能够让密度集群发生改变。
优点: 无需假设集群呈球状, 其性能具备可扩展性;并且, 并非必须将每个点都分配至一个集群中, 这能减少集群的异常数据。缺点: 用户得去调整那两个定义集群密度的超参数「」与「」, 对这些超参数表现得极为敏感。
实现: 实现:
结语
然后, 姑且不论基本概念, 还是看具体算法的层面, 最为至关重要的皆是实践。要是不进行这些算法的实践, 那么就永久都无法发觉自己在哪一些区域是还没有完全理解掌握的, 所以但愿这篇文章能够对各位读者在动手实践自己的算法这件事上起到帮助作用。