一、XGBoost的简介
XGBoost全称为eXtreme Gradient Boosting,即极致梯度提升树。
XGBoost是非常强大且受欢迎的机器学习模型,尤其是在各类竞赛中被广泛使用。他是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器(个体学习器间存在强依赖关系,必须串行生成的序列化方法)。
XGBoost是一种提升树模型,即它将许多树模型集成在一起,形成一个很强的分类器。其中所用到的树模型则是CART回归树模型。
为了让没接触或者刚接触模型的萌新能看懂,我举个例子解释一下XGBoost模型:假设我现在想做一个甜品,但是我是第一次做,不知道每个原材料和调料具体放多少才是最合适的,所以第一次我是凭感觉去制作,所以可能第一次做出来的结果会不太好,然后我尝了一下,觉得是糖放多了太甜了,同时水加的太少了,那么我下一次尝试就可以减少糖的分量和多添加一些水。这次做完后,可能结果是味道层次不够丰富,那我可以再次进行尝试制作的时候多加一个原材料种类,就这样不断进行尝试上百次甚至上千次之后,最后获得了一杯味道适中,并且口感独特的甜品。此时把最终用到的原材料和他对应的份量都记录下来,这个菜谱就是对于这道菜来说相对完美的模型,每个原材料和他对应的份量就是这个模型的参数,而这个不断从错误当中学习,然后不断改进的算法就是XGBoost模型。
二、XGBoost和GBDT的区别
XGBoost | GBDT |
---|---|
决策树+线性分类器 | 决策树 |
弱分类器的输入除了残差之外,还有二阶导数 | 前一个弱分类器的残差(一阶导数)作为后一个弱分类器的输入 |
每一个弱分类的损失函数不包含正则项 | 每一个弱分类的损失函数包含正则项 |
必须手动将缺失值补齐 | 模型会自动补齐,无需手动处理 |
不支持并行 | 支持并行(注意:此处支持的为参数的并行) |
每一次迭代都需要对特征进行排序操作 | 训练前将所有特征进行排序,保存为bloc结构 |
训练中使用全部特征 | 列抽样 |
三、XGBoost的调参
Xgboost 的调参,通常认为对它性能影响较大的参数有:
eta:每次迭代完成后更新权重时的步长。越小训练越慢。
num_round:总共迭代的次数。
subsample:训练每棵树时用来训练的数据占全部的比例。用于防止 Overfitting。
colsample_bytree:训练每棵树时用来训练的特征的比例,类似 RandomForestClassifier 的 max_features。
max_depth:每棵树的最大深度限制。与 Random Forest 不同,Gradient Boosting 如果不对深度加以限制,最终是会 Overfit 的。 early_stopping_rounds:用于控制在 Out Of Sample 的验证集上连续多少个迭代的分数都没有提高后就提前终止训练。用于防止Overfitting。
一般的调参步骤是:
将训练数据的一部分划出来作为验证集。
先将 eta 设得比较高(比如 0.1),num_round 设为 300 ~ 500。
用 Grid Search 对其他参数进行搜索
逐步将 eta 降低,找到最佳值。
以验证集为 watchlist,用找到的最佳参数组合重新在训练集上训练。注意观察算法的输出,看每次迭代后在验证集上分数的变化情况,从而得到最佳的 early_stopping_rounds。
最后要提一点,所有具有随机性的 Model 一般都会有一个 seed 或是 random_state 参数用于控制随机种子。得到一个好的 Model 后,在记录参数时务必也记录下这个值,从而能够在之后重现 Model。