美文网首页
从集成学习到XGBoost算法

从集成学习到XGBoost算法

作者: Pastore_Zx | 来源:发表于2019-03-26 19:55 被阅读0次

    未经许可,不许转载。

    XGBoost

    一.XGBoost的前世今身

    1.集成学习(三个臭皮匠赛过诸葛亮)

    ①集成学习通过构建并结合多个学习器来完成学习任务。
    ②一般策略:先产生一组“个体学习器”(决策树,神经网络等),然后通过某种策略将他们结合。
    ③个体学习器是同种的 ------>同质集成(基学习器/弱学习器)
    个体学习器是不同的 ----->异质集成

    集成学习大致分为两类:
        ①Boosting流派(GBDT,Xgboost,AdaBoost)
        该流派:基学习器间有强依赖,必须序列化产生。
        ②Bagging流派(RandomForest)
        该流派:基学习器间无强依赖,必须并行化产生
        
        本篇主要来写XGB,所以主要分析Boosting
    

    2.从AdaBoost谈起

    ①主要问题:每一轮如何改变训练数据的权值或概率分布?and如何将弱分类器组合成一个强分类器
    ②Adaboost主要做法:

    对于问题1:提高那些被前一轮弱分类器错误分类样本的权值,降低那些被正确分类样本的权值。
    对于问题2:加权多数表决,加大误差率小的若分类器的权值。
    

    ③Adaboost算法步骤

    1> 初始化训练数据的权值分布(w = 1/N)(每个训练样本在基分类器学习中作用相同)
    2> 使用具有权值分布的训练数据集学习得到基本分类器
    3> 计算基本分类器在训练数据集上的分类误差率e_m
    4> 通过下图公式计算基本分类器的系数:当e_m<1/2时,系数大于0,并且系数随着e_m的减小而增大。所以分类误差率越小的基本分类器在最终分类器的作用越大。
    
    参数更新公式
    5>更新训练数据集的权值分布(如下公式),其中Z_m是使D_m+1成为概率分布的规范化因子。误分样本权值扩大,正确分类样本权值变小。
    
    6>重复上述操作M次后得到M个弱学习器,构建基本分类器的线性组合,得到最终分类器:
    

    ④Adaboost的算法解释
    可以理解为加法模型+损失函数为指数函数+向前分布学习算法:
    令基学习器线性组合,来最小化指数损失函数


    3.到GBDT

    ①利用损失函数的负梯度在当前模型的值,作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
    ②GBDT基本流程:

    1> 初始化f_0(x) = arg min 损失函数
    2> 计算残差r_mi:
    
    残差
    3> 用r_mi拟合一个回归树,得到第m棵树的叶节点区域
    4> 利用线性搜索,估计叶节点区域的值,使损失函数最小化
    5> 更新回归树
    6> 得到输出的最终模型
    

    ③为何可以用负梯度来做残差的近似值
    回归任务下,GBDT 在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数。则此时的负梯度为:

    ④具体过程研究:(此段来自July七月在线的讲解)
    假定训练集只有4个人:A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工。我们限定叶子节点做多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。我们会得到下图结果:

    上图1中,用平均年龄做预测值,此时计算图1的残差。根据A的实际值 - A的预测值 = A的残差(注意:A的预测值是指前面所有树累加的和,这里前面只有一棵树所以直接是15,如果还有树则需要都累加起来作为A的预测值。)进而得到A,B,C,D的残差分别为-1,1,-1,1。到第二棵树中去学,这次得到的残差是(0,0,0,0),则认为预测值与真实年龄一样了。

    二.XGBoost算法

    1.XGBoost的就是由许多分类与回归树集成.

    XGBoost在具体流程上,与GBDT几乎一样。

    其核心就是,不断的分裂函数去拟合残差。在train后,我们得到k棵树,根据样本的特征对应各叶子节点,每个叶子节点对应一个分数,最后将每棵树对应的分数加起来就是该样本的预测。

    2.XGBoost数学

    XGBoost与GBDT最大的不同便是其目标函数,以及其的优化方法等。
    下图是XGBoost的目标函数:


    实质是把样本分配到叶子结点会对应一个obj,优化过程就是obj优化。也就是分裂节点到叶子不同的组合,不同的组合对应不同obj,所有的优化围绕这个思想展开

    其分为三部分:损失函数+正则项+常数项
    其中正则项为:

    损失函数鼓励尽量拟合训练数据,正则化鼓励更简单的模型。
    损失函数是最小二乘时,我们很容易来进行进行二次优化(且二阶导数有利于梯度下降更快更准),但当损失函数其他时,我们可以来使用泰勒展开,

    为什么要用泰勒展开?
    实际上,使用泰勒展开,是为了在不选定损失函数具体形式下,仅仅依靠输入数据的值就可以进行叶子分裂优化计算。本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
    具体来看:
    
    其与Obj一一对应。
    
    正则项所代表含义如下图所示
    

    3.XGBoost分裂节点

    我们现在知道,XGBoost是如何优化,如何计算。那么我们应该如何去分裂出树呢?
    1.我们依次枚举,进行划分。对所有特征进行分割后,我们选择增益Gain最高的那个特征。
    ①当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂。
    ②当树达到最大深度时则停止建立决策树。
    ③当样本权重和小于设定阈值时则停止建树。

    2.如果数据太大,不能直接计算,我们可以采取近似算法。

    3.最终策略:

    最终策略为:贪心(遍历所有,选取眼下最好)+ 二次最优(损失函数不是二次的用泰勒展为二次)
    

    4.XGBoost如何处理缺失值

    1.其他tree如何处理缺失值:

    ①直接使用中位数
    ②引入权重,对需要替换的数据先和其他数据做相似度测量,在补全缺失点是相似的点的数据会有更高的权重

    2.XGBoost如何处理缺失值:

    xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。具体的可以参考陈天奇博士的论文。

    感谢七月在线July老师的讲解

    相关文章

      网友评论

          本文标题:从集成学习到XGBoost算法

          本文链接:https://www.haomeiwen.com/subject/gkgnvqtx.html