没有最好的分类器,只有最合适的分类器。
随机森林平均来说最强,但也只在9.9%的数据集上拿到了第一,优点是鲜有短板。
SVM的平均水平紧随其后,在10.7%的数据集上拿到第一。
神经网络(13.2%)和boosting(~9%)表现不错。
数据维度越高,随机森林就比AdaBoost强越多,但是整体不及SVM[2]。
数据量越大,神经网络就越强。
近邻 (Nearest Neighbor)
典型的例子是KNN,它的思路就是——对于待判断的点,找到离它最近的几个数据点,根据它们的类型决定待判断点的类型。
它的特点是完全跟着数据走,没有数学模型可言。
适用情景:
需要一个特别容易解释的模型的时候。
比如需要向用户解释原因的推荐算法。
贝叶斯 (Bayesian)
典型的例子是Naive Bayes,核心思路是根据条件概率计算待判断点的类型。
是相对容易理解的一个模型,至今依然被垃圾邮件过滤器使用。
适用情景:
需要一个比较容易解释,而且不同维度之间相关性较小的模型的时候。
可以高效处理高维数据,虽然结果可能不尽如人意。
决策树 (Decision tree)
决策树的特点是它总是在沿着特征做切分。随着层层递进,这个划分会越来越细。
虽然生成的树不容易给用户看,但是数据分析的时候,通过观察树的上层结构,能够对分类器的核心思路有一个直观的感受。
举个简单的例子,当我们预测一个孩子的身高的时候,决策树的第一层可能是这个孩子的性别。男生走左边的树进行进一步预测,女生则走右边的树。这就说明性别对身高有很强的影响。
适用情景:
因为它能够生成清晰的基于特征(feature)选择不同预测结果的树状结构,数据分析师希望更好的理解手上的数据的时候往往可以使用决策树。
同时它也是相对容易被攻击的分类器[3]。这里的攻击是指人为的改变一些特征,使得分类器判断错误。常见于垃圾邮件躲避检测中。因为决策树最终在底层判断是基于单个条件的,攻击者往往只需要改变很少的特征就可以逃过监测。
受限于它的简单性,决策树更大的用处是作为一些更有用的算法的基石。
随机森林 (Random forest)
提到决策树就不得不提随机森林。顾名思义,森林就是很多树。
严格来说,随机森林其实算是一种集成算法。它首先随机选取不同的特征(feature)和训练样本(training sample),生成大量的决策树,然后综合这些决策树的结果来进行最终的分类。
随机森林在现实分析中被大量使用,它相对于决策树,在准确性上有了很大的提升,同时一定程度上改善了决策树容易被攻击的特点。
适用情景:
数据维度相对低(几十维),同时对准确性有较高要求时。
因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。
SVM (Support vector machine)
SVM的核心思想就是找到不同类别之间的分界面,使得两类样本尽量落在面的两边,而且离分界面尽量远。
最早的SVM是平面的,局限很大。但是利用核函数(kernel function),我们可以把平面投射(mapping)成曲面,进而大大提高SVM的适用范围。
提高之后的SVM同样被大量使用,在实际分类中展现了很优秀的正确率。
适用情景:
SVM在很多数据集上都有优秀的表现。
相对来说,SVM尽量保持与样本间距离的性质导致它抗攻击的能力更强。
和随机森林一样,这也是一个拿到数据就可以先尝试一下的算法。
逻辑斯蒂回归 (Logistic regression)
逻辑斯蒂回归这个名字太诡异了,我就叫它LR吧,反正讨论的是分类器,也没有别的方法叫LR。顾名思义,它其实是回归类方法的一个变体。
回归方法的核心就是为函数找到最合适的参数,使得函数的值和样本的值最接近。例如线性回归(Linear regression)就是对于函数f(x)=ax+b,找到最合适的a,b。
LR拟合的就不是线性函数了,它拟合的是一个概率学中的函数,f(x)的值这时候就反映了样本属于这个类的概率。
适用情景:
LR同样是很多分类算法的基础组件,它的好处是输出值自然地落在0到1之间,并且有概率意义。
因为它本质上是一个线性的分类器,所以处理不好特征之间相关的情况。
虽然效果一般,却胜在模型清晰,背后的概率学经得住推敲。它拟合出来的参数就代表了每一个特征(feature)对结果的影响。也是一个理解数据的好工具。
判别分析 (Discriminant analysis)
判别分析主要是统计那边在用,所以我也不是很熟悉,临时找统计系的闺蜜补了补课。这里就现学现卖了。
判别分析的典型例子是线性判别分析(Linear discriminant analysis),简称LDA。
(这里注意不要和隐含狄利克雷分布(Latent Dirichlet allocation)弄混,虽然都叫LDA但说的不是一件事。)
LDA的核心思想是把高维的样本投射(project)到低维上,如果要分成两类,就投射到一维。要分三类就投射到二维平面上。这样的投射当然有很多种不同的方式,LDA投射的标准就是让同类的样本尽量靠近,而不同类的尽量分开。对于未来要预测的样本,用同样的方式投射之后就可以轻易地分辨类别了。
使用情景:
判别分析适用于高维数据需要降维的情况,自带降维功能使得我们能方便地观察样本分布。它的正确性有数学公式可以证明,所以同样是很经得住推敲的方式。
但是它的分类准确率往往不是很高,所以不是统计系的人就把它作为降维工具用吧。
同时注意它是假定样本成正态分布的,所以那种同心圆形的数据就不要尝试了。
神经网络 (Neural network)
神经网络现在是火得不行啊。它的核心思路是利用训练样本(training sample)来逐渐地完善参数。还是举个例子预测身高的例子,如果输入的特征中有一个是性别(1:男;0:女),而输出的特征是身高(1:高;0:矮)。那么当训练样本是一个个子高的男生的时候,在神经网络中,从“男”到“高”的路线就会被强化。同理,如果来了一个个子高的女生,那从“女”到“高”的路线就会被强化。
最终神经网络的哪些路线比较强,就由我们的样本所决定。
神经网络的优势在于,它可以有很多很多层。如果输入输出是直接连接的,那它和LR就没有什么区别。但是通过大量中间层的引入,它就能够捕捉很多输入特征之间的关系。卷积神经网络有很经典的不同层的可视化展示(visulization),我这里就不赘述了。
神经网络的提出其实很早了,但是它的准确率依赖于庞大的训练集,原本受限于计算机的速度,分类效果一直不如随机森林和SVM这种经典算法。
使用情景:
数据量庞大,参数之间存在内在联系的时候。
当然现在神经网络不只是一个分类器,它还可以用来生成数据,用来做降维,这些就不在这里讨论了。
Rule-based methods
这个我是真不熟,都不知道中文翻译是什么。
它里面典型的算法是C5.0 Rules,一个基于决策树的变体。因为决策树毕竟是树状结构,理解上还是有一定难度。所以它把决策树的结果提取出来,形成一个一个两三个条件组成的小规则。
使用情景:
它的准确度比决策树稍低,很少见人用。大概需要提供明确小规则来解释决定的时候才会用吧。
提升算法(Boosting)
接下来讲的一系列模型,都属于集成学习算法(Ensemble Learning),基于一个核心理念:三个臭皮匠,顶个诸葛亮。
翻译过来就是:当我们把多个较弱的分类器结合起来的时候,它的结果会比一个强的分类器更
典型的例子是AdaBoost。
AdaBoost的实现是一个渐进的过程,从一个最基础的分类器开始,每次寻找一个最能解决当前错误样本的分类器。用加权取和(weighted sum)的方式把这个新分类器结合进已有的分类器中。
它的好处是自带了特征选择(feature selection),只使用在训练集中发现有效的特征(feature)。这样就降低了分类时需要计算的特征数量,也在一定程度上解决了高维数据难以理解的问题。
最经典的AdaBoost实现中,它的每一个弱分类器其实就是一个决策树。这就是之前为什么说决策树是各种算法的基石。
使用情景:
好的Boosting算法,它的准确性不逊于随机森林。虽然在[1]的实验中只有一个挤进前十,但是实际使用中它还是很强的。因为自带特征选择(feature selection)所以对新手很友好,是一个“不知道用什么就试一下它吧”的算法。
装袋算法(Bagging)
同样是弱分类器组合的思路,相对于Boosting,其实Bagging更好理解。它首先随机地抽取训练集(training set),以之为基础训练多个弱分类器。然后通过取平均,或者投票(voting)的方式决定最终的分类结果。
因为它随机选取训练集的特点,Bagging可以一定程度上避免过渡拟合(overfit)。
在[1]中,最强的Bagging算法是基于SVM的。如果用定义不那么严格的话,随机森林也算是Bagging的一种。
使用情景:
相较于经典的必使算法,Bagging使用的人更少一些。一部分的原因是Bagging的效果和参数的选择关系比较大,用默认参数往往没有很好的效果。
虽然调对参数结果会比决策树和LR好,但是模型也变得复杂了,没事有特别的原因就别用它了。
Stacking
这个我是真不知道中文怎么说了。它所做的是在多个分类器的结果上,再套一个新的分类器。
这个新的分类器就基于弱分类器的分析结果,加上训练标签(training label)进行训练。一般这最后一层用的是LR。
Stacking在[1]里面的表现不好,可能是因为增加的一层分类器引入了更多的参数,也可能是因为有过渡拟合(overfit)的现象。
使用情景:
没事就别用了。
(修订:
提醒说stacking在数据挖掘竞赛的网站kaggle上很火,相信参数调得好的话还是对结果能有帮助的。
http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/
这篇文章很好地介绍了stacking的好处。在kaggle这种一点点提升就意味着名次不同的场合下,stacking还是很有效的,但是对于一般商用,它所带来的提升就很难值回额外的复杂度了。)
多专家模型(Mixture of Experts)
最近这个模型还挺流行的,主要是用来合并神经网络的分类结果。我也不是很熟,对神经网络感兴趣,而且训练集异质性(heterogeneity)比较强的话可以研究一下这个。
讲到这里分类器其实基本说完了。讲一下问题里面其他一些名词吧。
最大熵模型 (Maximum entropy model)
最大熵模型本身不是分类器,它一般是用来判断模型预测结果的好坏的。
对于它来说,分类器预测是相当于是:针对样本,给每个类一个出现概率。比如说样本的特征是:性别男。我的分类器可能就给出了下面这样一个概率:高(60%),矮(40%)。
而如果这个样本真的是高的,那我们就得了一个分数60%。最大熵模型的目标就是让这些分数的乘积尽量大。
LR其实就是使用最大熵模型作为优化目标的一个算法[4]。
EM
就像最大熵模型一样,EM不是分类器,而是一个思路。很多算法都是基于这个思路实现的。
@刘奕驰 已经讲得很清楚了,我就不多说了。
隐马尔科夫 (Hidden Markov model)
这是一个基于序列的预测方法,核心思想就是通过上一个(或几个)状态预测下一个状态。
之所以叫“隐”马尔科夫是因为它的设定是状态本身我们是看不到的,我们只能根据状态生成的结果序列来学习可能的状态。
适用场景:
可以用于序列的预测,可以用来生成序列。
条件随机场 (Conditional random field)
典型的例子是linear-chain CRF。
具体的使用 @Aron 有讲,我就不献丑了,因为我从来没用过这个。
就是这些啦。
相关的文章:
[1]: Do we need hundreds of classifiers to solve real world classification problems.
Fernández-Delgado, Manuel, et al. J. Mach. Learn. Res 15.1 (2014)
[2]: An empirical evaluation of supervised learning in high dimensions.
Rich Caruana, Nikos Karampatziakis, and Ainur Yessenalina. ICML '08
[3]: Man vs. Machine: Practical Adversarial Detection of Malicious Crowdsourcing Workers
Wang, G., Wang, T., Zheng, H., & Zhao, B. Y. Usenix Security'14
[4]:http://www.win-vector.com/dfiles/LogisticRegressionMaxEnt.pdf
一、逻辑回归模型
1、理解逻辑回归模型(LR)
逻辑回归是一种分类算法,其原理是将线性回归预测出来的数据映射到logit函数上,从而完成对事件发生概率的预测(最终输出预测标签0,1)。
2、逻辑回归模型的应用场景
LR是很多分类算法的基础组件,它的好处是输出值自然地落在0到1之间,并且有概率意义。因为LR本质上是一个线性的分类器,所以处理不好特征之间相关的情况。
虽然预测效果一般,但胜在模型清洗,背后的概率学经得起推敲。它拟合出来的参数就代表了每一个特征对结果的影响。也是一个理解数据的好工具。
使用条件:当数据线性可分,特征空间不是很大的情况,不用在意新数据的情况,后续会有大量新数据的情况。
小结:
用于分类:适合做很多分类算法的基础组件。
用于预测:预测事件发生的概率(输出)。
用于分析:单一因素对某一个事件发生的影响因素分析(特征参数值)。
3、逻辑回归的优缺点
优点:
从整体模型来说,模型清洗,背后的概率推导经得住推敲;
从输出值来说,输出值自然落在0到1之间,并且有概率意义;
从模型参数来说,参数代表每个特征对输出的影响,可解释性强;
从运行速度来说,实施简单,非常高效(计算量小、存储占用低),可以在大数据场景中使用;
从过拟合角度来说,解决过拟合的方法很多,如L1、L2正则化;
从多重共线性来说,L2正则化就可以解决多重共线性问题;
缺点:
(特征相关情况)因为它本质上是一个线性的分类器,所以处理不好特征之间相关的情况;
(特征空间)特征空间很大时,性能不好;
(预测精度)容易欠拟合,预测精度不高;
二、树模型
1、理解树模型
决策树模型是运用于分类以及回归的一种树结构。决策树由节点和有向边组成,一般一棵树包含一个根节点、若干内部节点和若干叶节点。决策树的决策过程需要从根节点开始,待测数据与决策树中的特征节点进行比较,并按照比较结果选择下一比较分支,直至叶节点作为最终的决策结果
2、树模型的应用
树模型可以生成清晰的基于特征选择不同预测结构的树状结构,当你希望可以更好的理解手上的数据的时候往往可以使用决策树。同时它也是相对容易被供给的分类器(因为这里认为的改变一些特征,是的分类器判断错误。常见于垃圾邮件躲避检测中,因为决策树最终在底层的判断是基于单个条件,攻击者往往只需要改变很少的特征就可以躲过监测)。
小结:
受限于它的简单性,决策树更大的用处是作为一些更有用的算法的基石;
3、树模型的优缺点
优点:
容易理解、可读性强,比较直观;
自变量/特征可以是连续变量,也可以是分类变量;
可处理缺失值;
基本不用做原始数据的预处理,如标准化等;
可以建立非线性模型;
即使是较大的数据及,其训练时间也很短;
劣势:
大型的决策树较难解释;
方差大的决策树会导致模型表现较差;
容易出现过拟合;
三、集成模型
通过组合多个学习器来完成任务,通过集成方法,可以将多个弱学习器组合成一个强分类器,因此集成学习的泛化能力一般比单一分类器要好。
集成方法主要包括Bagging和Boosting,Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,最终得到不一样的效果。
常见的基于Bagging思想的集成模型有:随机森林、
基于Boosting思想的集成模型有:Adaboost、XgBoost、LightGBM等。
Bagging和Boosting的区别总结如下:
在样本选择上:Bagging方法的训练集是从原始集中有放回的选取,所以原始集中选出的各轮训练集之间是独立的;而Boosting方法需要每一轮的训练集不变,知识训练集中每个样本在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整;
在样例权重上:Bagging方法使用均匀取样,所以每个样本的权重相等;而Boosting方法根据错误率不断调整样本的权重,错误率越大则权重越大;
在预测函数上:Bagging方法中所有预测函数的权重相等;而Boosting方法汇总每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重;
并行计算上:Bagging方法中各个预测函数可以并行生成;而Boosting方法各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果;
1、基于bagging思想的集成模型——随机森林模型
随机森林是一种集成算法。它首先随机选取不同的特征和训练样本,生成大量的决策树,然后综合这些决策树的结果来进行最终的分类。
随机森林在现实分析中被大量使用,相对于决策树,在准确性有了很大的额提升,同时一定程度上改善了决策树容易被攻击的特点。
随机森林的应用:
当数据维度相对低(几十维),同时对准确性有较高要求时;
因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候可以先试一下随机森林;
随机森林的优缺点:
优点:
在所有的算法中,随机森林具有极好的准确率;
能够运行在大数据集上;
能够处理具有高维特征的输入样本,而且不需要降维;
能够评估各个特征在分类问题上的重要性;
在生成过程中,能够获取内部生成误差的一种无偏估计;
对于缺失值也能够获得很好的结果;
缺点:
据观测,如果一些分类/回归问题的训练数据中存在噪音,随机森林中的数据集中会出现过拟合的现象;
相对决策树来说,随机森林算法更复杂,计算成本更高(因为RF是有多个决策树组成);
由于其本身的复杂性,它们比其他类似的算法需要更多的时间来训练;
2、基于boosting思想的集成模型
XGBoost模型
XGBoost即梯度提升机器算法,其基本思想是把成百上千个分类准确率较低的树模型组合成一个准确率较高的模型,该模型不断迭代,每次迭代生成一颗新的树,如何在每一步生成合理的树是Boosting分类器的核心。
XGBoost模型的应用:
在不确定使用哪种模型时,可以使用xgboost模型跑看下效果(很多竞赛的top都有用xgboost);
特征选择,可以根据模型输出的特征重要性,来选择相关的特征;
XGBoost的优缺点:
优点:
XGBoost支持多样,并加入了正则项,支持shrinkage缩减(相当于学习率),增加了列抽样来防止过拟合,能够处理缺失值,并且支持并行;
缺点:
对所有叶子节点一视同仁,有些叶子节点影响不大,从这方面来说加重了计算,还有就是预排序会消耗很大空间,且要保存特征的排序索引,消耗很多时间,计算量大;
LightGBM模型
LGB的应用场合:
当数据量较大的时候,使用xgboost需要更长的时间,可以考虑用LGB;
不想对类别特征进行 one hot encoding 时,可使用LGB;
LGB的优缺点:
优点:
内存和计算上现象对xgb有明显优势,支持多线程优化;
支持直接输入类别特征,不需要虚拟化;
缺点:
leaf-wise的建树策略很容易过拟合,需要限制最大深度;
相对XGB来说,LGB较为粗糙,会损失一定精度;
问题中涉及的几个算法都是数据分类的基本技术,其实当样本数据质量很好的时候,各个算法结果之间的差异不会特别大。这个时候可以根据样本的分布特点和具体要解决的业务问题等信息,选择一个或者几个相适合的算法,再进一步根据模型训练结果、验证结果选择一个结果相对较好的算法。
当然,样本数据质量很差的时候,任何算法都无法得到很好的结果,所以这次先不考虑样本数据的获取和质量问题,但从算法角度来考虑,各个算法都有自己的特点。
朴素贝叶斯算法假定所有输入属性的重要性是相等的,且彼此是独立的,这个前提满足的情况下,贝叶斯算法往往十分精确,但实际情况是,经常发生不满足条件独立性的情况,并且缺少可用的概率数据。
决策树算法相对比较好理解,也不需要对样本数据做任何假设,相对更适合处理非数值型数据,但决策数算法的结果有时会很复杂,同一个变量在树生长的时候反复用了好几次导致不好解释,尤其当样本数据是数值型时,数据的微小变化都会影响每个节点变量以及阈值的选择,结果较不稳定。
K 近邻算法是基于类比的学习,可以对缺失值进行处理,但维度过高时,也容易过拟合,本身不建立X与Y的量化公式,算法费时较长。
SVM算法使用一种非线性映射,所以对于非线性决策边界的识别能力是比较强的,本身不容易过拟合,但由于算法本身效果依赖核心点的选择,所以扩展到大数据集时相对比较费时。
逻辑回归算法本身有明确的概率公式,由于会对连续变量进行分箱处理,所以会降低过拟合的程度,增强模型泛化能力。但是对于多分类、或者非线性的决策边界时,表现效果有限。
选择算法时,除了考虑算法本身的特点,还应考虑具体的业务需求,比如有时候业务需求注重解释性。并且以打分卡的形式展现每个属性和个体,那个即使其他算法会更准确一些,考虑到应用,也会选择逻辑回归算法。
所以,具体情况还需具体分析,没有一成不变的准则,最终目的都是为了更好的解决业务问题。
参考链接:https://www.zhihu.com/question/26726794/answer/15128205
网友评论