//声明:翻译:https://www.quora.com/What-are-the-advantages-of-different-classification-algorithms 中Xavier Amatriain 对问题“What are the advantages of different classification algorithms?”的回答
你可以从下面几个方面来看你要选择哪个算法比较合适:
训练样本的数量
特征空间的维数
我是否期望问题是【线性可分离】的吗?(线性可分离就是指不同类问题在图中用直线能完全分开)
特征是否是独立的
希望特征与目标变量是【线性可分离】的吗?
过度拟合是否将成为一个问题?
系统在速度、性能、内存占用方面有什么需求?
…
不管上述有多复杂,我们要只要遵循奥卡姆的剃刀原则(Razor principle):如无必要,勿增实体。
通常,我推荐先用逻辑回归。逻辑回归是一种具有很好表现的分类算法,只要你的【特征】是线性或近似线性的并且【问题】是线性可分的就可以用它进行训练。你可以通过【特征工程】将大多数非线性特征简单的转化成较好的线性的特征。它抗噪声干扰能力强,并且你可以通过使用l2和l1正则化的方法来对特征进行选择从而避免过度拟合。逻辑回归也可以用在大数据的场景中,因为它是非常有效并且可以分布式的使用,如,ADMM(logreg)。逻辑回归LR最大的优点就是它的输出的是几率,更容易解释,这样还可以直接拿来用,例如,用排行来代替分类。
即使你认为逻辑回归方法不能十分的有效,那也请你使用一个简单的l2-regularized LR来试一下。
好了,那么假设你已经了解了并简单使用了LR,下一步该做什么?我主要推荐两个合适的方向:1.SVM 2.决策树集。如果我不知道你要分类的问题,那我肯定会使用决策树集成的方法,但是我会先从描述SVM开始讲为什么SVM会是一个值得考虑的方法。
PS:csdn上一个感觉不错的逻辑回归的介绍
Support Vector Machines (SVMs) 使用与LR不同的损失函数(Hinge)。他们的解释也不相同(最大间距)。然而,实际上,一个使用线性核的SVM与之前讲的逻辑回归没有太大的区别。(如果你很好奇这一点,你可以看Andrew Ng如果从逻辑递归中导出SVMs Support Vector Machines Optimization objective PS:反正我是什么也看不懂。Andrew Ng是个中国人,叫吴恩达,他的主页有不错的东西)。使用SVM代替逻辑回归的主要原因是因为你的问题可能不是线性可分的。这种情况下,你可能必须要使用一个SVM并且使用一个非线性的核(例如,RBF)。实际上,逻辑回归同样可以使用不同的核,但是重点是你可能在实际使用中发现SVM更好用。另一个使用SVM的原因是如果你的数据是在一个高维空间中。例如,SVMs被报道过对文本的分类效果更佳。
不幸得是,SVMs的主要缺点是它的费劲、低效率的训练过程。所以,当你有很多训练样本时,我不推荐你使用SVM来处理。进一步说,对企业级规模的数据我都不推荐使用SVM。任何稍微大一点的数据使用别的算法可能会更好的接近。
这让我来到了第三大算法家庭:决策树集。它主要包括了两个不同的算法:随机森林算法-Random Forests(Algorithm)和梯度提升决策树Gradient Boosted Trees。我一会再说他们的不同,这会儿我想把它们当作一种来说,为了与逻辑回归进行比较。
决策树集与逻辑回归相比有不同的优势。一个主要的优势就是它们不期望线性的特征或者相互之间有线性作用的特征。我在讲逻辑回归时没有提到的一点是,逻辑回归能很好的应对二值得特征(即绝对的特性,要么零,要么一)。决策树集里因为有许多的决策树组成,可以很好的处理连续型的特征。其它的主要优点是,因为它的结构组成(使用装袋或加速),这类算法可以很好的处理高纬空间的大数量的训练样本。
至于随机森林RFs和梯度提升决策树GBDTs的不同,我不想详述,但是简单的理解可以认为GBDTs通常表现的更好,但是很难使用。更具体一点说,GBDTs有超多的参数可以调整,并且更容易过饱和。而RFs则可以“开箱即用”,这就是为什么它那么受欢迎的原因。
放在最后并非不重要,这个答案如果不参考深度学习的话也不会太完整。我绝不推荐这种方法作为一般目的分类技术。但是,你可能听说过这种方法在某种情况下分类效果有多好,例如图像分类。如果你使用了前面讲的几种方式后发现任然问题没有得到很好的解决,你可以再用一下深度学习的方法。事实上,如果你使用一些像Theano一样的开源接口的话,你就知道这种方法在你的数据集中表现的有多快了!
那么,总结一下,先从一些简单的方法,例如逻辑回归等方法开始,作为一个基准,如果需要提高,再一点点使用更复杂的方法。(PS:主要是剃刀原则)。到那时,决策树集,特别是随机森林,非常容易调试,可能是一个不错的方法。如果你用完随机森林仍然觉得还有很大的提升空间,那你就试试用GBDT或更佳发烧的去用深度学习方法。
你也可以看一下网站Kaggle Competitions(一个大赛网站 里面有正在进行的竞赛,和过去完成的竞赛,包括完成的代码、论坛等。竞赛的奖金很多,有兴趣可以参加一下!)。如果你搜索关键字“classification” 并且选择那些已经完成的,那你可以看到人用来赢得竞赛的例子,其中有可能和你手中遇到的问题一样。到那个时候你可能会明白使用集的方法在那个是会让结果更好。集的唯一问题就是:它们需要维持所有相互独立的平行方法。这可能是你最后的花哨的一步!
//声明:翻译:Edwin Chen的博客 –“Choosing a Machine Learning Classifier”
我们怎么知道该选择怎么样的机器学习算法来解决我们的分类问题?当然,如果你真的很注重分类的精度,你最好多选几种机器学习方法测试一下(每个算法尝试使用不同的参数来看看哪个结果最好),并且要根据交叉验证方法(Cross-Validation)选择一个最好的算法。但是如果你只是要找一个看起来不错的算法来解决你的问题,或者找一个开始下手的算法,可以尝试使用下面这些年来我总结的感觉很好用的大纲。
如果你的训练集很小,高偏离/低方差的分类器(例如,朴素贝叶斯)比低偏离/高方差的分类器(如,KNN-K近邻)有着很大的优势,因为后者容易过拟合(至于什么是过拟合,和什么是偏离/方差的问题,请开这扇门)。但是低偏离/高方差的分类器随着你的训练集的增大变得越来越有优势(他们有很小的渐近误差),因为高偏离的分类器不能提供高精度的模型。
你也可以认为是生成模型和辨别模型的区别(//TODO 这块我也不太明白,记得回头仔细看看)。
超级简单,你只是在做一大群计算。如果假设的NB条件相互独立性成立,那朴素贝叶斯比其他辨别模型如逻辑回归要快,你只需要较少的训练数据即可。并且及时假设条件不成立,朴素贝叶斯分类器在实际使用中也通常有较好的效果。这是一种好的尝试,如果想让一些东西快又简单并且性能很好。它的主要缺点是不能学习不同特征之间的相互作用。(例如,它不能学习这种情况:你爱和Brad Pitt还有Tom Cruise演的电影,但是你不喜欢他俩一起演的电影。)
逻辑回归有很多调整模型的方式,并且你不用像朴素贝叶斯方法那样担心太多相互关联的特征。你也能得到一个很好的概率性的解释,不像决策树和SVMs那样,并且你还能很容易的加入新的数据来升级你的模型(使用一个在线梯度下降方法),这一点也与决策树和SVMs不同,它们不好做模型维护。当你需要一个概率框架(例如,通过简单的调整分类阈值,来得知不确定区间或置信区间confidence intervals)或者如果你希望将来能在训练集中加入更多的数据并很快的融入你的模型,那你就应该使用逻辑回归。
容易解释和说明(对某些人来说是这样-我不确定我是否属于这个阵营)。他们很容易处理相关的特征并且他们是无参数的,所以你不用担心异常点或数据是否线性可分离的问题。(例如,决策树可以很简单的应对下面这种情况,你的第一类A在特征x的低端,第二类B在特征x的中间范围,然后A也在上端)。它的一个缺点是它们不支持在线学习,所以当新的样本来临时你必须重建你的树。另一个缺点是它们容易过拟合,但是只是当集合方法如随机森林或加速的树的等加入进来的时候才会。还有,随机森林在处理很多分类问题时效果更好(通常比SVMs好一点我觉得),它速度快、伸缩性好,并且你不用担心它像SVMs一样去设置一大堆的参数,所以在当前它很受大家欢迎。
高精度、对过拟合有较好的理论保证,并且使用一个合适的核可以得到较好的效果,甚至你的数据在特征空间里不是线性可分的。特别是在高维空间的像文本识别的问题中效果好。占用内存、难以解释甚至在运行和调试的过程中有点烦人,所以,我认为随机森林将会取代它。
//声明:翻译:https://www.quora.com/What-are-the-advantages-of-different-classification-algorithms 中Waleed Kadous对问题“What are the advantages of different classification algorithms?”的回答
- 消耗很多内存,因为要存储所有的实例
- 对低维空间效果更好,不适合高维空间
- 可能会过拟合
- 可能会陷入局部最小值的情况,所以需要集(ensembles)来帮助降低变量。
- 选择和寻找一个恰当的核是一个挑战
- 结果/输出很难理解
- 没有一个标准的方法来处理多类的问题。基本上就是一个二值分类器
- 很难选择一个合适的拓扑结构
- 训练需要很长时间和很多数据
- 输出/问题 不好理解
- 缺乏表现力(这什么鬼?分个类需要什么表现力)
- 基本上是一个二值分类器
- 不好做增量处理
- 表现简单,不能做丰富的假设
- 相互独立的属性的假设限制太多
- 很难确定拓扑结构的依赖关系
参考文献:
原文:https://www.quora.com/What-are-the-advantages-of-different-classification-algorithms
奥卡姆剃刀原则:http://baike.baidu.com/view/646319.htm
莫文的博客也有翻译,我有参考:http://www.cnblogs.com/nsnow/p/4670785.html
斯坦福大学深度学习教程 :http://ufldl.stanford.edu/tutorial/supervised/OptimizationStochasticGradientDescent/