几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

jopen 9年前

关于boost算法

boost算法是基于 PAC学习理论 (probably approximately correct)而建立的一套集成学习算法(ensemble learning)。其根本思想在于通过多个简单的弱分类器,构建出准确率很高的强分类器,PAC学习理论证实了这一方法的可行性。下面关于几种 Boost算法的比较,是基于文章《Additive Logistic Regression a Statistical View of Boosting》整理的。

几种boost算法步骤

通常使用最多的应该是离散的Adaboost算法(Discrete AdaBoost),主要因为它的简单却不俗的表现,Discrete Adaboost算法的步骤如下:

几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

可以看出,Discrete AdaBoost的每一个弱分类的输出结果是1或-1,并没有属于某个类的概率,略显粗糙。如果让每个弱分类器输出样本属于某个类的概率,则可以得到Real AdaBoost算法,其步骤如下:

几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

Real Adaboost每个弱分类器输出样本属于某类的概率后,通过一个对数函数将0-1的概率值映射到实数域,最后的分类器是所有映射函数的和。

将Real Adaboost算法每次迭代的两部合并,直接产生一个映射到实数域的函数,则就成了Gentle AdaBoost, 其算法步骤如下:

几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

Gentle AdaBoost则在每次迭代时,基于最小二乘去做一个加权回归,最后所有回归函数的和作为最终的分类器。

LogitBoost算法则和Gentle AdaBoost算法有点相像,不过其每次进行回归拟合的变量z是在不断更新的,Gentle AdaBoost使用的是y。LogitBoost算法步骤如下:

几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

4种boost算法的原理差异

上面4中boost算法,其大体结构都是比较相似的,那么是如何推导出每种算法的具体形式的呢?

首先是关于损失函数(或代价函数),通常见到比较多的是均方误差和似然函数,而上面的算法中,Discrete AdaBoost、Real AdaBoost和Gentle AdaBoost算法都是采用对数损失函数,具体形式如下:

\begin{aligned} J(F) = Ee^({-yF(x)}) \end{aligned}

其表达的意义实质上与分类错误个数是相同的。

而Logit Boost算法则采用最大化对数似然函数来推导的。

第二点是具体优化方法,Discrete AdaBoost与Real AdaBoost主要通过类似梯度下降的方法来优化,而Gentle AdaBoost与Logit Boost都是采用类似牛顿迭代的方式优化的。

算法的效果差异

在前面提到的参考文章中,对几种算法的效果进行了大量比较,大致如下;

  1. 整体效果而言,效果由好到差的顺序为Logit Boost,Gentle AdaBoost, Real AdaBoost, Discrete AdaBoost
  2. 若弱分类器采用树桩模型(也就是只要2个叶子节点的决策树),Discrete AdaBoost的结果比其他3种算法结果差了很多,大概是由于系统偏差过大导致的泛化误差较大
  3. 若弱分类器采用多层的决策树(4或8个叶子节点),Discrete AdaBoost的结果能有较大提升,而其他3种算法则差异不大。

平时我们所用的AdaBoost算法大多是Discrete AdaBoost,从这里可以看出Discrete AdaBoost算法模型相对比较简单,需要弱分类器的精确度稍高,因此在具体应用时最好将每个弱分类器的叶子节点控制在4个或8个。关于Boost算法 还有很多比较有趣的结论,这里不多讲,可以参考上面的那篇Paper。