十一城

跬步千里,小流江海。

Home Linux ML Python Java Thoughts KmKg BookCan Links About

2017-11-28
机器学习-集成学习

• 分类: ml • 标签:

世界因参差不同而丰富多彩。

集成学习,也称为模型融合。

集成方法的目的是结合一些基于某些算法训练得到的基学习器来改进其泛化能力和鲁棒性(相对单个的基学习器而言)。model ensemble既可以发生在算法内部,也可以在不同种模型预测后最后进行ensemble。

模型融合常见的方法有5种:

普通版

Voting 投票法

  • hard voting 类标记
  • soft voting 类概率

模型融合其实也没有想象的那么高大上,从最简单的Voting说起,这也可以说是一种模型融合。假设对于一个二分类问题,有3个基础模型,那么就采取投票制的方法,投票多者确定为最终的分 类。

Averaging

求均值——简单的加权平均

对于回归问题,一个简单直接的思路是取平均。稍稍改进的方法是进行加权平均。权值可以用排序的方法确定,举个例子,比如A、B、C三种基本模型,模型效果进行排名,假设排名分别是1,2,3,那么给这三个模型赋予的权值分别是3/6、2/6、1/6

这两种方法看似简单,其实后面的高级算法也可以说是基于此而产生的,Bagging或者Boosting都是一种把许多弱分类器这样融合成强分类器的思想

进阶版

ensemble-learning

Bagging

Bagging是Bootstrap aggregating的缩写。中文意思是自助聚合。Bagging是机器学习中一种常用的降低预测方差、提高稳定性的方法。具体步骤是:

  1. 从训练样集中有放回的选取n个样本,然后把这n个样本作为训练集并训练模型(bootstrap的过程)
  2. 把第1步重复m次,从而得到m个不同的预测模型
  3. 利用这m个模型对测试集进行预测,将m个预测结果取平均值(aggregating的过程)

常见的Tree Bagging就是将多个决策树的结果平均后的模型。

常见变体

按照样本采样方式的不同划分

  • Pasting:直接从样本集里随机抽取的到训练样本子集
  • Bagging:自助采样(有放回的抽样)得到训练子集
  • Random Subspaces:列采样,按照特征进行样本子集的切分
  • Random Patches:同时进行行采样、列采样得到样本子集

典型代表——随机森林

该思想的应用有两方面:bagging和boosting
虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练例赋相等的权重1/n,然后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各轮训练集之间相互独立,而Boostlng的各轮训练集的选择与前面各轮的学习结果有关

Boosting

所谓Boosting,就是将弱分离器$f_i(x)$组合起来形成强分类器$F(x)$的一种方法。Boosting 有三个要素:

  1. A loss function to be optimized:例如分类问题中用 cross entropy,回归问题用 mean squared error。
  2. A weak learner to make predictions:例如决策树。
  3. An additive model:将多个弱学习器累加起来组成强学习器,进而使目标损失函数达到极小。

目前比较流行的boosting方案有两种:

  • AdaBoost(传统)
  • Gradient Boosting Decision Tree 梯度提升决策树(弱学习器限定了只能使用CART回归树模型) -> XGBoost

Adaboost

是一种传统的Boost方法,利用前一轮迭代弱学习器的误差率$\epsilon$来更新训练集的权重,一轮轮地迭代下去。在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。

每棵树的权重是$\alpha=\frac12\log\frac{1-\epsilon}\epsilon$,其中$\epsilon$是这个棵树的misclassification rate。如果$\epsilon=0.5$,那么它的权重$\alpha=0$。一颗树表现越好($\epsilon$越小),权重越大。如果$\epsilon=0$,那么权重就是无穷大。因为boosting是把weak learner强化的过程,我们一般认为weak learner准确率应该大于$0.5$,也就是$\epsilon<0.5$,所以这种情况下$\alpha$始终是大于零的。

Gradient boosting

机器学习中的学习算法的目标是为了优化或者说最小化loss Function, Gradient boosting的思想是迭代生多个($m$个)弱的模型,然后将每个弱模型的预测结果相加,第$m$个模型$F_m()$基于前面学习模型的$F_{m-1}(x)$的效果生成的。

Gradient boosting就是通过加入新的弱学习器,来努力纠正前面所有弱学习器的残差,最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。之所以称为 Gradient,是因为在添加新模型时使用了梯度下降算法来最小化的损失。

Stacking 学习法

每个单独分类器的输出会作为更高层分类器的输入,更高层分类器可以判断如何更好地合并这些来自低层的输出。stacking另一个比较特别的是层状结构。以常见的两层stacking为例,第一层是不同的基模型(多个),而第二层是以上一层基模型输出结果为输入数据的分类器(一个)。从某种意义上看,和神经网络的“结构相似”。为了防止过拟合,一般第二层的模型不再使用原始训练数据进行训练,而仅依赖于第一层训练器的输出结果。

stacking与bagging

  • stacking中的各个模型(基分类器)追求的是“准而不同”。stacking中的子模型一般应该是独立准确,而不同的基学习器之间有所差异。
  • bagging中的基学习器追求的是“弱和不同”。bagging中的学习器往往是决策树,主要就是看中了决策树的不稳定性(instability)。过于准确的基学习器会使得bagging的集成失去意义。

参考


dzzxjl

Home Linux ML Python Java Thoughts KmKg BookCan Links About