XGBoost 的原理和优点

1 原理:https://www.nowcoder.com/discuss/199755

https://blog.csdn.net/linxid/article/details/80147179

2 时序数据的数据集处理问题

选的模型: 树模型: XGBoost,Lightgbm 

特征工程: 手工加入季节性特征,趋势,滞后特征,类别编码,目标编码

因为数据的产生有先后次序,不可以随便选择一部分数据进行train,另一部分进行validation,所以要用老数据进行train,新数据进行validation,有如下两个方法,方法1适用于数据大的情况。

https://blog.csdn.net/u011597050/article/details/85108407

3 凸函数的定义和在优化中的重要性

笔记57页

重要性:凸优化相对简单: 任何局部最优解即为全局最优解。非凸优化问题的可行域集合可能存在无数个局部最优解,通常求解全局最优的算法复杂度是指数级的。

凸优化性质好,许多日常生活中的非凸优化问题最有效的办法就是利用凸优化的思路去近似求解。

例如:带整数变量的优化问题,松弛之后变成凸优化问题;

任意带约束的非凸连续优化问题,其对偶问题作为原问题解的一个lower bound,一定是凸的。

针对带有hidden variable的近似求解maximum likelihood estimate 的EM 算法,或者贝叶斯版本里头所谓的variational Bayes inference。 而原来的MLE其实是非凸优化问题,所以EM 和VB 算法都是找到了一个比较好优化的concave lower bound 对这个lower bound 进行优化。

https://www.jiqizhixin.com/articles/2019-02-25-

4 xgboost 什么场景不适用

https://www.nowcoder.com/discuss/175759

数据量很大以及特征比较多时太耗内存,太慢了,比如寻找最优特征分裂点时需要遍历所有特征去计算(虽然做了预排序和并行处理) ,但它还是很慢和很耗内存,需要读取所有数据到内存中才好做特征分裂。

https://www.nowcoder.com/ta/review-ml/review?page=99

5 树模型的特征选择中除了信息增益、信息增益比、基尼指数这三个外,还有哪些?

看树的类型,回归树的话可以用均方差的减少量,xgboost 里用到的是自定义函数的增益值。

6 GDBT 和Xgboost 的区别?

好的地方: 二阶泰勒展开,节点分数惩罚正则,增益计算不同,gbdt 是gini,xgb 是优化推导公式

6-1 传统的GBDT以CART作为基分类器,XGboost 还支持线性分类器,这时候xgboost 相当于带L1 和L2 正则化项的逻辑斯蒂回归(分类问题) 或者线性回归。

6-2 传统的GBDT在优化时只用到了一阶导数信息,xgboost 则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数,xgboost 还支持自定义代价函数,只要函数可一阶和二阶求导。

6-3 Xgboost 在代价函数中加入了正则项,用于控制模型的复杂度,正则项里包含了 树的叶子节点个数,每个叶子节点上输出的score 的L2 模的平方和。从Bias -variance  tradeoff 角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也就是xgboost 优于传统CBDT的一个特性。

6-4 Shrinkage ,相当于学习速率(xgboost 中的eta) .Xgboost 在进行完一次迭代后,会将叶子节点上权重·乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间,实际应用中,一般把eta 设置的小一点,然后迭代次数设置的大一点。

6-5 列抽样,: xgboost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost 异于传统gdbt 的一个特性。

6-6 缺失值的处理,对特征的值有缺失的样本,xgboost 可以自动学习出它分裂的方向。

6-7 xgboost 支持并行,不是在trees 粒度的并行,而是在特征粒度上的,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点) ,xgboost 在训练之前,预先对数据进行了排序,然后保存了block 结构,后面的迭代中重复使用了这个结构,大大减少了计算量。在进行节点分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算可以开多线程进行。

6-8 可并行的近似直方图算法,树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有节能的分割点,当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost 还提出了一种可并行的近似直方图算法,用于高效的生成候选的分割点。

https://zhuanlan.zhihu.com/p/30316845

7  XGBoost 和lgb 的区别

https://www.nowcoder.com/discuss/209306?type=post&order=time&pos=&page=1

是对GBDT 方法的不同实现,针对同一目标,做了不同的优化处理。

它们在基础逻辑上并没有啥不同,限定max_tree或者max_iterations,之后算法从0 棵树开始跑,每一轮根据上一轮的残差增加一颗决策树,在每一次增加决策树的时候选择当前最优结构,而在生成当前决策树的过程中,采用了不同的优化方案。

7.1 XGBoost 使用基于预排序的决策树算法,每遍历一个特征需要计算一次特征增益,时间复杂度为Q(datafeature).

lgb 使用基于直方图的决策树算法,直方图的优化算法只需要计算k 次,时间复杂度为O(kfeature)

7.2 XGBoost 按照层生长的决策树生成,LGb采用带有深度限制的叶子节点算法,在分裂次数相同的情况下,leaf-wise 可以降低更多的误差,得到更好的精度,leaf-wise 的缺点在于会产生较深的决策树,产生过拟合。

7.3 支持类别特征,不需要进行独热编码处理。

7.4 优化了特征并行和数据并行算法,除此之外还添加了投票并行方案。

7.5 采用基于梯度的单边采用来保持数据分布,减少模型因数据分布发生变化而造成的模型精度下降。

7.6 特征捆绑转化为图着色问题,减少特征数量。

8 XGBoost的损失函数

Xgboost 可以自定义损失函数,分类时用logloss。节点划分的准则是GINI 指数。CART 决策树分裂的时候用GINI 指数。

logloss 损失函数的优点是可以求一阶导数,二阶导数来应用牛顿法,梯度下降法等最小化损失函数。

9 Gbdt 时间复杂度的计算

针对每个特征,把属于该节点的训练样本根据该特征值升序排列,通过线性扫描的方式决定改特征的最佳分裂点,并记录改特征的最大收益(采用最佳分裂点时的收益)

时间复杂度nlogn*d*m( n 是样本个数,d 是特征个数,m 是树的深度)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值