Xgboost 原理笔记

Xgboost 原理笔记

数据描述:
Y:是否下单 X: 用户id、是否是新用户等一些用户属性。商品类别、跟踪码、商品id、商品 下单总量、商品品牌、商品价格、用户1日内对该商品加购次数、商品最近3日内点击的总量、用户3日内对同类商品的加购次数、用户1日内对该商品加购次数、用户总点击的总量、用户总加购的总量 、用户总下单的总量、用户点击和下单量比、用户加购和下单量比等等。

枚举当时在做数据处理相关时候的简单栗子:
1、对于数据缺失值,根据有全的数据的列相同的数值取平均数或者中位数进行填充。
2 、对于数据缺失值,或者针对这些缺失值进行预测,把缺失值当做y,利用已知的数据,运用 随机森林预测。
3、 仓位相同的拿出来,然后取均值,先把空的扔了,然后获取中位数。这个就是先验性的均值。再把值拿出来,赋予到这个缺失值中。
4 、把渠道那列做成一个one-hot的编码
5、如果有俩个是没有渠道的信息的话,就可以补成no,所以虽然是四列,但是本质上是三列。补的方法就是看渠道那个渠道是最多的。就把缺失值补上去。
6 对数据进行离散化。离散化什么意思呢:就是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
进行离散化的原因:
6.1、易于快速迭代模型;
6.2、 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
6.3、异常数据在离散化后的特征后有很强的鲁棒性:比如一个美女特征是体重>50kg是1,否则0。如果特征没有离散化,一个异常数据“体重是100kg” 就困给模型带来困扰。
6.4、是广义线性模型,表达能力无力吐槽;每个单变量离散化为n个后,每个变量有属于自己的权重,也就是非线性混进了模型中了,这样表达能力突飞猛进,就加大拟合;
6.5、离散化后特征交叉就可以使用了,比如M+N个变量变成M*N个变量,也把非线性引入了进来,提升表达能力;
6.6、特征离散化后,模型会更稳定
6.7、模型过拟合的风险降低。

进行离散化的原理:
1、排序 2、去重 3、索引
排序:一般使用sort对数组或结构体排序
去重:unique()和lower_bound()
unique的作用是“去掉”容器中相邻元素的重复元素(不一定要求数组有序),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址;
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置。【ps.upper_bound是返回第一个大于b[x]的指针,upper_bound()=lower_bound()+1】
注:Xgboost 也可以不进行数据清洗的

处理不平衡的数据:
对样本少的进行过采样,对样本多的进行下采样,或者相结合xgboost模型本身是不用过多的处理不平衡数据的。但是想和lr模型进行你拟合,lr模型会介意数据是否是平衡的,所以需要进行采样。

xgboost的原理
从目标函数开始:

目标函数通常包含俩部分:
– 损失函数:选择与训练数据匹配适用的模型
• 回归:残差平方
• 分类:0-1损失、logistic损失、合叶损失(SVM)
– 正则项: 与模型复杂度度有关(选择最简单的模型)
• L2正则 • L1正则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面大概rf、adaboost、gbdt、xgboost的一些区别:

rf:学习器之间不存在强依赖关系,学习器可并行训练生成,是bagging的代表,投票方式集成,放回抽样,每个学习器随机选择部分特征去优化。

adaboost:属于boosting,采用指数损失函数替代原本分类任务的0/1损失函数,是加法模型+指数损失函数+前向分布算法。从弱分类器出发反复训练,在其中不断调整数据权重,或者概率分布,同时提高前一轮被弱分类器误分的样本的权重,最后用分类器进行投票表决。

gbdt: 用cart回归做学习器,集成为回归模型,回归用二叉回归树,分类用二叉分类树,gbdt属于boosting的优秀代表,是由多棵树累加之和,也就是串行生成,回归树的损失函数为平方损失,对函数近似值进行梯度下降,用损失函数的负梯度在当前模型的值来模拟问题问题中残差的近似值。即梯度上升决策树算法,相当于融合决策树和梯度上升。gbdt需要对特征归一化,对异常值也相对敏感,gbdt减少模型的偏差。在这里gbdt深度不要超过6,但是随机森林可以在15以上的。

xgboost:

xgboost属于boosting的集大成者,集成模型可分类也可回归,由于它可在特征粒度上进行计算,结构风险和工程实现都做了很多优化,泛化,性能和扩展性能比 gbdt要好。样本不是放回,每轮计算样本不重复,支持子采样,也就是每轮计算可以不使用全部样本,以减少过拟合,列采样,每轮计算按百分比随机采样一部分特征,既提高计算又减少过拟合。支持线性分类器,可以自定义损失函数,快又准,可以在不选定损失函数具体形式的情况下,仅仅依靠数据的值就可以进行叶子分裂优化计算,损失函数的选取和模型算法优化/参数选择分开了。这种去耦合增加了xgboost的适用性,使得它按需选取损失函数。经过优化推导,迭代时利用二阶梯度信息,泰勒展开式二项逼近,对函数残差近似值进行梯度下降,加入了正则项,叶子节点数,每个叶子节点输出score-l2-norm支持特征抽样,支持并行,只有在建树的阶段才会用到,每个节点可以并行的寻找分裂特征。xgboost在训练的过程中给出各个特征的增益评分,最大增益的特征会 被选出来作为分裂依据,从而记忆了每个特征对在模型训练时的重要性,从根到叶子中间节点涉及某特征的次数作为该特征重要性排序。

xgboost的工程细节下篇文章后面写。