![759556d97046f4262aa018e935953097.png](https://img-blog.csdnimg.cn/img_convert/759556d97046f4262aa018e935953097.png)
承接上文
挂枝儿:再从GBDT到XGBoost!zhuanlan.zhihu.com![a22a4852cb9b9fa0b65fe16793406239.png](https://img-blog.csdnimg.cn/img_convert/a22a4852cb9b9fa0b65fe16793406239.png)
理解了原理,那么接下来就要开始学习怎么调参了,之前做模型的时候用xgboost比较简单粗暴跟着教程一顿乱fit,但最近比较完整的过了下原理之后,找了个sampledata过来想练个手却感觉完全懵逼了,这篇文章就相当于给自己之后把玩xgboost当个baseline guide吧.
对了,虽然这篇文章是写调参的,但我个人还是觉得
想要靠调参去极大的改善结果是很难的(还是特征工程重要啊!)
另外kaggle上已经有一些更好的调参方式,比如hyperopt基于贝叶斯优化的方式,所以这篇文章里的方式肯定还是不够炫酷的,所以就当做一个熟悉参数和建模思路的note吧.
这篇分为三个部分:
1. XGboost的优势 2. 常用参数列表 3. 调参示例
1. XGBoost的优势
之前从原理层面去理解,那么剥离出学习的场景,xgboost究竟相对与其他算法有什么优势呢?
- 正则化
- 普通的梯度提升算法是没有正则项来防止过拟合的,但xgboost有
- 并行处理
- xgboost并行处理数据的速度要比普通提升树算法更快.
- 不过这个并不是指xgboost可以并行的训练 ,这部肯定还是串行的,但我们在训练梯度,一棵树上寻找切分点的时候是可以并行的.
- 自动处理确实数据(不做切分点,但会把缺失值放进左右子树看效果)
- 剪枝策略
- 普通的提升 采用的是贪心算法,只有在不再有增益时才会停止分裂
- 自带的交叉验证
- xgboost自带的xgboost.cv允许我们在每新增一棵树的时候都进行交叉验证,这样能够很方便的在既有参数的框架下找到最优number of tree,这个功能和sklearn的graid_search必须给定nestimator不一样.
- 可以在目前树模型上继续迭代
- xgboost可以在一整天训练中使用不同的迭代策略(1-10颗树用params1,10~20用param2来训练
2.XGBoost的参数类型
总体来说,xgboost有三种参数类型
- General Parameters(通用): 指导总体的建模方向
- Booster Parameters(集成参数): 指导每一棵树(分类or回归)的在每次迭代时的生长方式
- Learning Task Parameters(任务参数): 指导在目前框架下的模型优化方式,大小权重。
2.1 通用参数
- booster [default=gbtree]
- gbtree 和 gblinear
- silent [default=0]
- 0表示输出信息, 1表示安静模式
- nthread
- 跑xgboost的线程数,默认最大线程数
2.2 集成参数
- eta [default=0.3, 可以视作学习率]
- 为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3
- 取值范围为:[0,1]
- gamma [default=0, alias: min_split_loss]
- 为了对树的叶子节点做进一步的分割而必须设置的损失减少的最小值,该值越大,算法越保守
- range: [0,∞]
- max_depth [default=6]
- 用于设置树的最大深度
- range: [1,∞]
- min_child_weight [default=1]
- 表示子树观测权重之和的最小值,如果树的生长时的某一步所生成的叶子结点,其观测权重之和小于min_child_weight,那么可以放弃该步生长,在线性回归模式中,这仅仅与每个结点所需的最小观测数相对应。该值越大,算法越保守
- range: [0,∞]
- max_delta_step [default=0]
- 如果该值为0,就是没有限制;如果设为一个正数,可以使每一步更新更加保守通常情况下这一参数是不需要设置的,但是在logistic回归的训练集中类极端不平衡的情况下,将这一参数的设置很有用,将该参数设为1-10可以控制每一步更新
- range: [0,∞]