没有最好的分类器,只有最合适的分类器

数据维度越高,随机森林就比AdaBoost强越多,但是整体不及SVM[2]。

数据量越大,神经网络就越强。

近邻 (Nearest Neighbor)

贝叶斯神经网络 pytorch 贝叶斯神经网络应用_随机森林

典型的例子是KNN,它的思路就是——对于待判断的点,找到离它最近的几个数据点,根据它们的类型决定待判断点的类型。

它的特点是完全跟着数据走,没有数学模型可言。

适用情景:

需要一个特别容易解释的模型的时候。

比如需要向用户解释原因的推荐算法。

贝叶斯 (Bayesian)

贝叶斯神经网络 pytorch 贝叶斯神经网络应用_神经网络_02

典型的例子是Naive Bayes,核心思路是根据条件概率计算待判断点的类型。

是相对容易理解的一个模型,至今依然被垃圾邮件过滤器使用。

适用情景:

需要一个比较容易解释,而且不同维度之间相关性较小的模型的时候。

可以高效处理高维数据,虽然结果可能不尽如人意。

决策树 (Decision tree)

贝叶斯神经网络 pytorch 贝叶斯神经网络应用_贝叶斯神经网络 pytorch_03

决策树的特点是它总是在沿着特征做切分(横向分割)。随着层层递进,这个划分会越来越细。

虽然生成的树不容易给用户看,但是数据分析的时候,通过观察树的上层结构,能够对分类器的核心思路有一个直观的感受。

举个简单的例子,当我们预测一个孩子的身高的时候,决策树的第一层可能是这个孩子的性别。男生走左边的树进行进一步预测,女生则走右边的树。这就说明性别对身高有很强的影响。

适用情景:

因为它能够生成清晰的基于特征(feature)选择不同预测结果的树状结构,数据分析师希望更好的理解手上的数据的时候往往可以使用决策树。


同时它也是相对容易被攻击的分类器[3]。这里的攻击是指人为的改变一些特征,使得分类器判断错误。常见于垃圾邮件躲避检测中。因为决策树最终在底层判断是基于单个条件的,攻击者往往只需要改变很少的特征就可以逃过监测。


受限于它的简单性,决策树更大的用处是作为一些更有用的算法的基石。

随机森林 (Random forest)

贝叶斯神经网络 pytorch 贝叶斯神经网络应用_决策树_04

提到决策树就不得不提随机森林。顾名思义,森林就是很多树。

严格来说,随机森林其实算是一种集成算法。它首先随机选取不同的特征(feature)和训练样本(training sample),生成大量的决策树,然后综合这些决策树的结果来进行最终的分类。

随机森林在现实分析中被大量使用,它相对于决策树,在准确性上有了很大的提升,同时一定程度上改善了决策树容易被攻击的特点。

适用情景:

数据维度相对低(几十维),同时对准确性有较高要求时。

因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。

SVM (Support vector machine)

贝叶斯神经网络 pytorch 贝叶斯神经网络应用_随机森林_05

SVM的核心思想就是找到不同类别之间的分界面,使得两类样本尽量落在面的两边,而且离分界面尽量远。

最早的SVM是平面的,局限很大。但是利用核函数(kernel function),我们可以把平面投射(mapping)成曲面,进而大大提高SVM的适用范围。

贝叶斯神经网络 pytorch 贝叶斯神经网络应用_贝叶斯神经网络 pytorch_06

提高之后的SVM同样被大量使用,在实际分类中展现了很优秀的正确率。

适用情景:

SVM在很多数据集上都有优秀的表现。

相对来说,SVM尽量保持与样本间距离的性质导致它抗攻击的能力更强。

和随机森林一样,这也是一个拿到数据就可以先尝试一下的算法。

神经网络 (Neural network)

神经网络现在是火得不行啊。它的核心思路是利用训练样本(training sample)来逐渐地完善参数。还是举个例子预测身高的例子,如果输入的特征中有一个是性别(1:男;0:女),而输出的特征是身高(1:高;0:矮)。那么当训练样本是一个个子高的男生的时候,在神经网络中,从“男”到“高”的路线就会被强化。同理,如果来了一个个子高的女生,那从“女”到“高”的路线就会被强化。

最终神经网络的哪些路线比较强,就由我们的样本所决定。

神经网络的优势在于,它可以有很多很多层。如果输入输出是直接连接的,那它和LR就没有什么区别。但是通过大量中间层的引入,它就能够捕捉很多输入特征之间的关系。卷积神经网络有很经典的不同层的可视化展示(visulization),我这里就不赘述了。

神经网络的提出其实很早了,但是它的准确率依赖于庞大的训练集,原本受限于计算机的速度,分类效果一直不如随机森林和SVM这种经典算法。

使用情景:

数据量庞大,参数之间存在内在联系的时候。

当然现在神经网络不只是一个分类器,它还可以用来生成数据,用来做降维,这些就不在这里讨论了。

提升算法(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上很火,参数调得好的话还是对结果能有帮助的。

小结

贝叶斯神经网络 pytorch 贝叶斯神经网络应用_决策树_07