未经许可,不许转载。
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老师的讲解
网友评论