zoukankan      html  css  js  c++  java
  • AdaboostGBDTGBRT组合算法

    AdaboostGBDTGBRT组合算法(龙心尘老师上课笔记)

    一、Bagging (并行bootstrap& Boosting(串行)

    随机森林实际上是bagging的思路,而GBDT和Adaboost实际上是boosting的思路。而bagging和boosting有什么区别呢?怎样从bagging转到boosting呢?

    Bagging的假设函数:

    如果是二分类问题:,其中T是分类器的总数,g(x)是其中的小分类器的取值(+1或-1),最后根据各个分类器的值求加和,根据和的符号得到最终大分类器是正还是负。

    如果是回归问题:,最后取得是各个小分类器的平均值。

    Bagging的特点1.各个学习器相互独立,可以同时并行生成;2.各个学习期权重相同

    Boosting特别大的区别就在于,各个学习器强烈依赖(上一个学习器产生,再产生下一个),串行生成,其中,gbdt(每个学习器权重相同),Adaboost(每个学习器权重不同)。

    Boosting要解决的核心问题:

    产生不同的训练集(训练集各样本标签不同,训练集各样本抽样权重不同)

    产生不同的模型(不同的训练集,就能产生不同模型)

    产生不同模型对应的权重

    二、GBDT生成新标签,串行生成树

    假设函数:

    损失函数:均方损失函数

    其中红色部分是之前集成学习器产生的残差,对应来看,这样可以理解成,红色部分相当于可以把之前学习器的残差,作为原来样本的新标签。这样就产生了新的训练集可以生成新的模型(下面右图2)。集成弱模型,得到强模型(下图3,样本x不变,标签Y变),依次下去重复,直到集合成最强模型。

    损失函数:

    (一阶泰勒展开,因为h(x)不是单位长度,所以需要放缩到单位长度,变成有约束条件下的凸优化问题;chargeboost中试二阶展开,就不用放缩了)

    从集成学习器变成基学习器,不优化集成学习器整体,而以之前的学习器为已知项(G(X)),优化增加的那个学习器(损失函数也优化基学习器的)。不优化权重整体,而以之前的权重为已知项,优化权重变化的小量。每一步H(X)实际上就是CART树的生成过程。

     三、Adaboost(每次新的学习器是基于上一次分类错误的样本,通过关注样本的权重来实现)

    可以证明GDBT也是Adaboost的一种,最本质的区别:损失函数不同,指数损失函数:

    另一个区别:假设函数不同:

     

    g(x)的取值实际上是+1,-1,然后给一个权重相加,最后只取符号,正的就是+1,负的就是-1;a会越来越小,后面的学习器会越来越弱,所以尽管后面可能有些前面的被分类错误了,影响也不大。一直经历分对,分错,分对,分错的过程,直到损失函数最小,但后面的学习器的分布权重减少。

    理解Adaboost训练过程

    1.  新的弱模型来自于上一个弱模型,而不是之前所有模型的集合(GBDT)

    2.  每个弱模型到强模型之前有权重(弱模型自身生成的权重)

    3.  新权重,是样本的权重

    样本权重:不同的样本分布权重对应不同训练集,类比boostrap,每一次boostrap抽样产生的新的训练集各类别样本比例不一样。(类似于上采样,多复制几遍负样本,也就是给予较多的权重)

    基于错误分类的样本,给予权重的放大缩小,以使其分类正确。

      

    样本的权重(其实是损失函数的系数):

    新的分类器必须是在上一个分类器上表现最差,与上一个分类器不一样,这样才能改进上一个学习器,否者没有什么作用,而二分类问题,表现最差的情况就是拍脑袋分类1/2概率,从而求解权重un. 这种方式求解u过麻烦,因而就有了下图中,构造一种递推的方式。

    模型的权重:

    误差率越小,模型权重越高,也就是说如果一个模型能把所有的都分对,那我们就给予一个很高的权重。

    梯度下降理解Adaboost

    要求解的仍然是增加的新学习器的g(x)和模型权重at

    求解h(x),最优解就是h(x)=gt

    求解η,最优解就是模型权重at

    四、集成学习

    精英制是加了权重之后再投票。

    偏差是算法可能预测出一系列的值,取平均,与真实结果的偏离。方差是训练集数据的变化对学习结果的影响。如果说一个模型偏差高,则是欠拟合;如果说一个模型方差高,则是过拟合。一个模型的误差是由方差、偏差和噪声共同构成。

    损失函数,adaboost基学习器的损失还是是0-1损失函数,只是前面加了权重,集成学习器的损失函数为指数损失函数;CART也可以看做集成学习器,看成是每一个树桩的集成学习。

  • 相关阅读:
    基本类型和包装类对象使用 == 和 equals进行比较的结果?
    ==和equals的区别是什么?
    JDK和JRE有什么区别?
    Java自学指南三、入门视频优先
    Java自学指南二、后端开发全景图与快速入门
    Java自学指南一、找一个开始并能坚持下去的理由
    什么是 happens-before 原则?
    什么是 Java 内存模型?
    Java 中有哪些无锁技术来解决并发问题?如何使用?
    什么是活锁和饥饿?
  • 原文地址:https://www.cnblogs.com/fionacai/p/6038633.html
Copyright © 2011-2022 走看看