关于XGBoost模型的浅理解以及用法

xgboost是一种集成分类器(弱分类器),xgboost 是基于提升树的。
提升树:简单说,就是一个模型表现不好,我继续按照原来模型表现不好的那部分训练第二个模型,依次类推。
形象的比喻就是:
做题的时候,第一个人做一遍得到一个分数,第二个人去做第一个人做错的题目,第三个人去做第二个人做错的题目,以此类推,不停的去拟合从而可以使整张试卷分数可以得到100分(极端情况)。
把这个比喻替换到模型来说,就是真实值为100,第一个模型预测为90,差10分,第二个模型以10为目标值去训练并预测,预测值为7,差三分,第三个模型以3为目标值去训练并预测,以此类推。

1. xgboost原理解读

1.0 学习路径:
我们xgboost的学习路径可以按照下面四个步骤来:
构造原始目标函数问题:
xgboost目标函数包含损失函数和基于树的复杂度的正则项;

泰勒展开问题:
原始目标函数直接优化比较难,如何使用泰勒二阶展开进行近似;
树参数化问题:
假设弱学习器为树模型,如何将树参数化,并入到目标函数中;这一步的核心就是要明白我们模型优化的核心就是优化参数,没有参数怎么训练样本,怎么对新样本进行预测呢?

如何优化化简之后的目标函数问题:
优化泰勒展开并模型参数化之后的的目标函数,主要包含两个部分:
如何求得叶子节点权重
如何进行树模型特征分割

关于XGBoost模型的浅理解以及用法_第1张图片

从这个目标函数我们需要掌握的细节是,前后部分是两个维度的问题
两个累加的变量是不同的:
一个是i,i这边代表的是样本数量,也就是对每个样本我们都会做一个损失的计算,这个损失是第t个树的预测值和真实值之间的差值计算(具体如何度量损失视情况而定)。
另一个是累加变量是j,代表的是树的数量,也就是我们每个树的复杂度进行累加。
需要注意的是我们这里具体的损失函数是没有给出定义的,所以它可以是树模型,也可以是线性模型。

关于XGBoost模型的浅理解以及用法_第2张图片

关于XGBoost模型的浅理解以及用法_第3张图片
关于XGBoost模型的浅理解以及用法_第4张图片 

xgboost 代码调参
框架参数:
booster:弱学习器类型
objective:分类还是回归问题以及对应的损失函数
n_estimators:弱学习器的个数
弱学习器参数:
max_depth:树的深度
min_child_weight:最小节点的权重阈值,小于这个值,节点不会再分裂;
gamma:节点分裂带来损失最小阈值,我们使用目标函数之差计算增益,小于这个阈值的时候,不再分裂
learning_rate:控制每个弱学习器的权重缩减系;这个系数会乘以叶子节点的权重值,它的作用在于削弱每个树的影响力,如果学习率小,对应的弱学习器的个数就应该增加。

与GBDT相比,Xgboost的优化点:
算法本身的优化:首先GBDT只支持决策树,Xgboost除了支持决策树,可以支持多种弱学习器,可以是默认的gbtree, 也就是CART决策树,还可以是线性弱学习器gblinear以及DART;其次GBDT损失函数化简的时候进行的是一阶泰勒公式的展开,而Xgboost使用的是二阶泰勒公式的展示。还有一点是Xgboost的目标函数加上了正则项,这个正则项是对树复杂度的控制,防止过拟合。
可以处理缺失值。尝试通过枚举所有缺失值在当前节点是进入左子树,还是进入右子树更优来决定一个处理缺失值默认的方向
运行效率:并行化,单个弱学习器最耗时的就是决策树的分裂过程,对于不同特征的特征分裂点,可以使用多线程并行选择。这里想提一下,我自己理解,这里应该针对的是每个节点,而不是每个弱学习器。这里其实我当时深究了一下,有点混乱。为什么是针对每个节点呢?因为我每个节点也有很多特征,所以在每个节点上,我并行(多线程)除了多个特征,每个线程都在做寻找增益最大的分割点。还有需要注意的一点是Xgboost在并行处理之前,会提前把样本按照特征大小排好序,默认都放在右子树,然后递归的从小到大拿出一个个的样本放到左子树,然后计算对基于此时的分割点的增益的大小,然后记录并更新最大的增益分割点。

常考Xgboost模型面试题总结

问题1:简单介绍一下XGBoost
首先需要说一说GBDT,它是一种基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。
XGBoost对GBDT进行了一系列优化,比如损失函数进行了二阶泰勒展开、目标函数加入正则项、支持并行和默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但其核心思想没有大的变化。
问题2:XGBoost与GBDT有什么不同
基分类器:XGBoost的基分类器不仅支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的Logistic回归(分类问题)或者线性回归(回归问题)。
导数信息:XGBoost对损失函数做了二阶泰勒展开,GBDT只用了一阶导数信息,并且XGBoost还支持自定义损失函数,只要损失函数一阶、二阶可导。
正则项:XGBoost的目标函数加了正则项, 相当于预剪枝,使得学习出来的模型更加不容易过拟合。
列抽样:XGBoost支持列采样,与随机森林类似,用于防止过拟合。
缺失值处理:对树中的每个非叶子结点,XGBoost可以自动学习出它的默认分裂方向。如果某个样本该特征值缺失,会将其划入默认分支。
并行化:注意不是tree维度的并行,而是特征维度的并行。XGBoost预先将每个特征按特征值排好序,存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。
问题3:XGBoost为什么使用泰勒二阶展开
精准性:相对于GBDT的一阶泰勒展开,XGBoost采用二阶泰勒展开,可以更为精准的逼近真实的损失函数
可扩展性:损失函数支持自定义,只需要新的损失函数二阶可导。
问题4:XGBoost防止过拟合的方法
XGBoost在设计时,为了防止过拟合做了很多优化,具体如下:
目标函数添加正则项:叶子节点个数+叶子节点权重的L2正则化
列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可)
子采样:每轮计算可以不使用全部样本,使算法更加保守
shrinkage: 可以叫学习率或步长,为了给后面的训练留出更多的学习空间

问题5:XGBoost如何处理缺失值
XGBoost模型的一个优点就是允许特征存在缺失值。对缺失值的处理方式如下:
在特征k上寻找最佳 split point 时,不会对该列特征 missing 的样本进行遍历,而只对该列特征值为 non-missing 的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找 split point 的时间开销。
在逻辑实现上,为了保证完备性,会将该特征值missing的样本分别分配到左叶子结点和右叶子结点,两种情形都计算一遍后,选择分裂后增益最大的那个方向(左分支或是右分支),作为预测时特征值缺失样本的默认分支方向。
如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子结点。

资料链接:
https://www.cnblogs.com/pinard/p/11114748.html

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

你可能感兴趣的:(机器学习,机器学习,sklearn,集成学习,分类,回归)