【历史文档】策略示例-使用BigQuant平台复现XGBoost算法
由ypyu创建,最终由small_q 被浏览 1180 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发IDE(AIStudio):
https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW
新版模版策略:
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
新版数据平台:
https://bigquant.com/data/home
https://bigquant.com/wiki/doc/dai-PLSbc1SbZX
新版表达式算子:
https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS
新版因子平台:
https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5
\
XGBoost算法的概念
树模型
机器学习模型可以简单分为传统机器学习模型和深度学习模型,传统的机器学习又可以根据模型的表达式分为树模型和线性模型。
Boosting模型
树模型以决策树为基础,在之上衍生出了各种算法,从集成学习的角度考虑,树模型可以分为 Bagging 和 Boosting 模型,Boosting 方法是另一种通过弱学习器提高准确度的方法,和 Bagging 方法不同的是,Boosting 每次根据之前模型的表现,进行新的模型的训练,以改变训练数据的权值和弱分类器的组合方式,得到最后的强学习器。
GBDT
对于简单的损失函数,如指数损失和平方损失,每一次提升都较为简单,但是对于一般的损失函数(如绝对损失),优化难度大大增加。因此 GBDT 利用损失函数负梯度在当前模型的值作为提升树中残差的近似值,拟合一个回归树。
XGBoost
XGBoost则是 GBDT 算法的改进和提高。相比于传统的 GBDT 算法,XGBoost 在损失函数、正则化、切分点查找和并行化设计等方面进行了改进,使得其在计算速度上比常见工具包快 5 倍以上。例如,GBDT 算法在训练第 n 棵树时需要用到第 n-1 棵树的残差,从而导致算法较难实现并行;而 XGBoost 通过对目标函数做二阶泰勒展开,使得最终的目标函数只依赖每个数据点上损失函数的一阶导和二阶导,进而容易实现并行。图表 7 显示了 XGBoost 算法的流程,它与 GBDT 在数学上的不同之处在于训练每个弱学习器时的目标函数。数学方面的知识并非本文重点,故点到为止。
本文将通过BigQuant平台复现XGBoost模型,并讲解其中的参数调整,以下为策略链接:
策略案例
https://bigquant.com/experimentshare/ff3157e2ca984cbf9a726cbbda04724b
XGBoost算法的原理
GBDT 对于简单的损失函数,如指数损失和平方损失,每一次提升都较为简单,但是对于一般 的损失函数(如绝对损失),优化难度大大增加。因此 GBDT 利用损失函数负梯度在当 前模型的值作为提升树中残差的近似值,拟合一个回归树。GBDT 的具体算法如下:
- 初始化模型
- 循环训练 K 个模型𝑘 = 1,2, … ,𝐾 (1) 计算负梯度:对于i = 1,2, … , M
(2) 以负梯度𝑟𝑘𝑖训练模型,得到第 k 颗树的叶结点区域$𝑅_{𝑘𝑗}$,𝑗 = 1,2, … ,𝐽 (3) 对𝑗 = 1,2, … ,𝐽,计算: (4) 更新模型: 3. 得到最终模型: XGBoost 是一种高效的 Boosting 训练器,可以实现 GBDT 的功能。且不同于一般的 GBDT,XGBoost 采用损失函数的二阶泰勒展开来近似原损失函数,同时在损失函数后 加入惩罚项:
以树模型作为弱分类器为例,得到区别于 GBDT 构造树的过程。
首先将𝑓𝑡和Ω的表达式带入目标函数中,得到目标函数的如下形式:
由此可得函数的极小值点:
每次对已有的叶子加入一个分割时,只需通过以下式子判断是否进行分割:
其中𝐼𝐿和𝐼𝑅分别属于分裂后的左节点、右节点集合,$𝐼 = 𝐼_𝐿 ∪ 𝐼_𝑅$。 相比于一般的 GBDT,XGBoost 具有以下优点:
- 传统 GBDT 在优化时只用到了梯度方向的信息,XGBoost 对损失函数进行二 阶泰勒展开,不仅用到了二阶导数的信息,还可以根据数据的特点自定义损失 函数,只要一阶导和二阶导存在。
- XGBoost 在损失函数中加入了惩罚项,可以有效降低模型的过拟合。
- XGBoost 不仅支持树模型作为弱学习器,也支持线性模型、Logistic 模型等作 为弱学习器,可以针对数据特点选取更合适的弱学习器。
- XGBoost 借鉴了 Bagging 中的思想,可以实现在每次 Boosting 的过程中随机 抽样样本集和特征集合,有效防止过拟合。
- XGBoost 支持在每颗树的迭代过程中子节点的并行计算,且在搜索上通过预排 序更快的实现算法。
XGBoost 存在以下缺点:
- 在选择树的分隔点时,需要遍历所有特征值。
- 预排序结果的保存消耗大量内存。 (微软推出的 LightGBM 优化了 XGBoost 的上述问题,虽然LightGBM也有自身的缺点,在 Kaggle 的比赛中,越来越多的算法融合了 LightGBM。总体来说,LightGBM 和 XGBoost 在不同问题上表现各有优劣,但是速度上,LightGBM 很多情况下都优于 XGBoost,所以目前也成为数据科学家建立 GBDT 模型的工具。)
改变迭代次数
迭代次数增加时,运行时间变长,模型过拟合程度变高;反之,迭代次数过低,模型欠拟合程度变高。默认值为30次
迭代三十次: 迭代十五次: 迭代一次:
改变损失函数类型
在XGBoost算法中,回归法不适用,需要进行模块的修改。排序(pairwise)(默认值)表现最优 排序(map): 排序(ndcg):
树的最大深度
树的最大深度增加时,运行时间显著变长,模型过拟合程度变高;反之,树的最大深度过低,模型欠拟合程度变高(默认值为6) 最大深度等于3: 最大深度等于10
模型、因子的表现
通过输入代码
m20.feature_gains()
可查看在XGBoost算法中各个因子的得分(使用)情况, 在本策略M2中可根据个人需要更改数据标注条件 在M3中可根据个人需要添加因子或删去表现力差的因子