快速理解bagging与boosting及其分支

  首先,集成学习是指综合多个模型的结果,以提升机器学习的性能。相比单个模型,往往能取得更好的结果。而Bagging和Boosting是集成学习中的两个方法(还有一个stacking,暂不做阐释),刚开始接触时稍有混乱,在此稍浅地记录下学习历程,以便快速理解
  1. Bagging
  Bagging是Bootstrap Aggregating的简称,这是一种并行的方法,其首先生成多种基分类器,在最后预测时通过投票法,从多个基分类器中得到预测结果,有效降低样本方差,每个基分类器之间具有弱关联性相对独立
  其中最常用的Bagging法为随机森林(Random Forest):
  Random Forest的分类器一般是决策树,且通常为CART决策树,步骤如下:

  • 假设原样本集有M个样本,每个样本包含N个属性,则首先有放回地抽取M个样本(每次抽1个,抽完后放回,重新在M个样本中抽1个,因此子集中将包含重复样本)
  • 如此,这个子集包含MxN个元素,再随机从N个属性中,选择n<<N个属性作为决策树每个节点的分裂属性(一般n=logN),若为CART树,则根据GINI指数来确定每个节点选择哪种属性来分裂(原始Bagging使用了所有属性,而不是随机选择n个)
  • 重复上述步骤,生成大量决策树
  • 对于每个测试数据,根据每棵决策树的预测结果,投票表决得到最后结果(可以是少数服从多数,也可以是加权,或者一票否决等)
    RF的优点
  • 随机性的引入,使得RF不易陷入过拟合
  • 随机性的引入,使得RF具有较强的抗干扰性,在很多数据集上都体现出优势
  • 能够处理高维数据(N很多)
  • 并行,训练速度快,实现简单
  • 训练过程中,能够检测到各属性间的相互影响
      2. Boosting
      Boosting是一种串行的方法,每个基分类器之间强关联,必须训练得到前一个基分类器,才能够根据偏差来获得下一个分类器,直至误差小于阈值
      Boosting的分支有很多,其中之一为Adaboost,即自适应Boosting,这里直接引用李航《统计学习方法》中的例子辅助理解:
    快速理解bagging与boosting及其分支
    快速理解bagging与boosting及其分支
  1. 对所有样本赋予权重,第一次时没有先验知识可赋予相同权重wi=1Nw_i=\frac{1}{N}wi​=N1​
  2. 根据训练集与权重分布,选择使误差最低的阈值v, 误差ei=Gi(xj)!=yjwje_i=\sum_{G_i(x_j)!=y_j}{w_j}ei​=∑Gi​(xj​)!=yj​​wj​
  3. 计算系数αi=12log1eieiα_i=\frac{1}{2}log\frac{1-e_i}{e_i}αi​=21​logei​1−ei​​
  4. 计算规范化因子Zm=i=1Nwmiexp(αmyiGm(xi))Z_m=\sum_{i=1}^{N}{w_{mi}exp(-\alpha_my_iG_m(x_i))}Zm​=∑i=1N​wmi​exp(−αm​yi​Gm​(xi​)),第一轮的Z已在图片中标注
  5. 计算新的权重wm+1,i=wmiZmexp(αmyiGm(xi))w_{m+1, i}=\frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i))wm+1,i​=Zm​wmi​​exp(−αm​yi​Gm​(xi​))

  于是可以得到新的权重{wm+1,1,wm+1,2,...,wm+1,N}\{w_{m+1, 1}, w_{m+1, 2},..., w_{m+1, N}\}{wm+1,1​,wm+1,2​,...,wm+1,N​},可以看到,对于上一轮分错的样本,将被赋予更高的权重,因此下一轮的分割阈值也将随之改变
最后的G由前面G1 G2 G3累加而成,由此也可以看出“累加”的特性,必须串行进行
  此外还有GBDT,传统Boosting包括Adaboost更关注正确错误样本的加权,而GBDT的目的则是为了使之前的模型误差往梯度下降的方向进行
  在GBDT中,将损失函数的负梯度作为当前模型残差的近似值,进而拟合一棵CART树
  如若选择均方根误差作为损失函数,即
L=iN(yif(xi))2L=\sum_{i}^{N}{(y_i-f(x_i))}^2L=∑iN​(yi​−f(xi​))2
  则在对第i个样本的负梯度为Lf(xi)=yif(xi)-\frac{\partial{L}}{\partial f(x_i)}=y_i-f(x_i)−∂f(xi​)∂L​=yi​−f(xi​)
  选择其它损失函数时,只要能求一阶导,皆可算出对应偏差,作为下一轮迭代的初始样本
  XGBoost则是在GBDT的基础上的优化,两者的区别主要如下:

  1. GBDT通常以CART树作为基学习器,而XGBoost则还可以使用线性学习器
  2. GBDT的梯度仅使用了一阶导信息,而XGBoost对代价函数进行二阶泰勒展开,同时使用了一阶导和二阶导
  3. 类似RF,支持列抽样,即并不是对所有属性进行学习,而是随机选择一定的属性,既防止过拟合,也减少计算量,加快速度
  4. 引入正则项,控制模型复杂度,并降低模型方差
  5. XGBoost支持并行,这里的并行指的是在计算最佳分裂点时,对特征值的排序这一步。在进行特征分裂时,需要计算各特征的增益等,这一步可通过多线程并行,但是对于下一轮迭代的计算,也依旧是串行的。
上一篇:VC++:如何将程序最小化到托盘 [转]


下一篇:wm_concat()函数