目录
1. XGBoost原理简介
2. XGBoost参数说明
3. 使用示例
训练XGBoost简单demo
使用交叉验证
进阶操作-调整样本权重
进阶操作-自定义目标函数(损失函数)
用前n棵树做预测
绘制特征重要度
与sklearn组合使用
优化超参数-网格搜索
完整代码地址
参考
1. XGBoost原理简介
XGBoost本质上还是GBDT,但它把算法的速度和效率做到了极致,所以叫X(Extreme)GBoost。
XGBoost主要从以下方面做了优化:
- 算法本身的优化
- 弱学习器的选择上,除了 树模型,还支持线性模型等。
- 在损失函数上,加入了L1和L2正则化项,以防止过拟合。
- 使用损失函数的二阶泰勒展开,在当前模型的值来近似表示残差,然后在每一步中去拟合这个残差。由于对损失函数进行一阶和二阶求导,能更快的收敛。
- 算法运行效率的优化,对每个弱学习器,比如决策树建立的过程做并行选择。
- 算法健壮性的优化,对特征的缺失值做了处理。
更详细的原理介绍可参考刘建平老师的博客:XGBoost算法原理小结
https://www.cnblogs.com/pinard/p/10979808.html
为什么XGBoost要用泰勒展开,优势在哪里?
XGBoost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了XGBoost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
2. XGBoost参数说明
先给出XGBoost官方文档的3个重要页面:
(1)XGBoost Parameters 参数说明
: https://xgboost.readthedocs.io/en/latest/parameter.html
(2)Notes on Parameter Tuning 调参指南
: https://xgboost.readthedocs.io/en/latest/tutorials/param_tuning.html
(3)Awesome XGBoost 一些非常棒的使用案例、教程和示例
: https://github.com/dmlc/xgboost/tree/master/demo
关于 XGBoost Parameters 参数
的一些简要说明:XGBoost参数有三类,分别是通用参数
、(基)模型参数
(例如时Tree Bosster或者Linear Booster等)、任务参数
。下面介绍部分常用的参数:
General Parameters 通用参数
- booster:基模型,默认是gbtree
- verbosity :(silent)开启静默模式,在后台跑,不输出信息, 1 (warning), 2 (info), 3 (debug)
- nthread:线程个数
Parameters for Tree Booster (树)模型参数,还有其他模型的参数,如gblinear等
- eta:学习率,范围是【0,1】,默认是0.3
- gamma:一个阈值:minimum loss reduction,控制是否对叶子结点做进一步分割,gamma值越大,算法会越保守,就不会很激进的去做下一步分裂,以免过拟合,范围是【0,】,默认是0。可以控制过拟合
- max_depth:最大树深,范围是【0,】,默认是6。可以控制过拟合
- min_child_weight:最小孩子权重,范围是【0,】,默认是1。
- subsample:控制所取训练样本占全量样本的比例,默认是1
- colsample_bytree:建树时考虑column的占比
- colsample_bylevel:在每层做分裂时,考虑column的占比
- colsample_bynode:在每个节点做分裂时,考虑column的占比
- lambda:控制正则化强度,L2正则化
- alpha:控制正则化强度,L1正则化
- scale_pos_weight:控制样本权重,即控制正例与负例的平衡,例如样本本身不均衡的情况。其实就是正负例的权重比值,默认是1,即正负样本权重一样
Learning Task Parameters 任务参数
- objective:目标函数
- eval_metric:评估标准(验证集),例如:“rmse”:均方根误差,"mae":平均绝对误差,“error”:二分类的错误率等等
【注意】
:
xgboost有2套python API:1个是
原生API
,1个是sklearn 风格的API
,差别主要体现在参数命名和数据集上,例如原生API 数据集需要放到DMatrix的数据结构里。例如为了确定估计器的数目,也就是boosting迭代的次数,也可以说是残差树的数目ÿ