XGBoost应用于“时间序列预测问题”实战与疑问(包含dump model的booster分析)

使用源码

https://github.com/Jenniferz28/Time-Series-ARIMA-XGBOOST-RNN
感谢作者。

参考博文(有思考)

https://blog.csdn.net/github_38414650/article/details/76061893
感谢作者。

1. 概述(摘录与理解)

XGBoost的全称为eXtreme Gradient Boosting,直接翻译过来是“极限梯度提升”。从下面的摘要原文,我们可以看出,XGBoost构建的是提升树的系统,是一种集成学习的方法,而非一种独立的算法。本文主要预研的是XGBoost在预测任务上的应用,可以理解XGBoost在预测任务上即为很多CART(Classfication and Regression Trees)回归树的集成。
在这里插入图片描述
先摘抄下论文里提到的XGBoost的创新点:
在这里插入图片描述
翻译过来:

  1. 我们设计和构建高度可扩展的端到端提升树系统。
  2. 我们提出了一个理论上合理的加权分位数略图。 推荐分割点的时候,可以只用部分点近似地表示,不用遍历所有的点以节省时间。
  3. 我们引入了一种新颖的稀疏感知算法用于并行树学习。 令缺失值有默认方向,并行的选择最佳分裂点。
  4. 我们提出了一个有效的用于核外树形学习的缓存感知块结构。 用缓存加速寻找排序后被打乱的索引的列数据的过程。

2. XGBoost建树的过程

概念1:回归树与决策树
事实上,分类与回归是一个型号的东西,只不过分类的结果是离散值,回归是连续的,本质是一样的,都是特征(feature)到结果/标签(label)之间的映射。说说决策树和回归树,在上面决策树的讲解中相信决策树分类已经很好理解了。

回归树是个啥呢?

直接摘抄人家的一句话,分类树的样本输出(即响应值)是类的形式,如判断蘑菇是有毒还是无毒,周末去看电影还是不去。而回归树的样本输出是数值的形式,比如给某人发放房屋贷款的数额就是具体的数值,可以是0到120万元之间的任意值。

那么,这时候你就没法用上述的信息增益、信息增益率、基尼系数来判定树的节点分裂了,你就会采用新的方式,预测误差,常用的有均方误差、对数误差等。而且节点不再是类别,是数值(预测值),那么怎么确定呢,有的是节点内样本均值,有的是最优化算出来的比如Xgboost。
细节http://blog.csdn.net/app_12062011/article/details/52136117博主讲的不错

概念2:boosting集成学习,由多个相关联的决策树联合决策,什么叫相关联,举个例子,有一个样本[数据->标签]是[(2,4,5)-> 4],第一棵决策树用这个样本训练得预测为3.3,那么第二棵决策树训练时的输入,这个样本就变成了[(2,4,5)-> 0.7],也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关。

与之对比的是random foreast(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有啥毛线关系。

所以首先Xgboost首先是一个boosting的集成学习,这样应该很通俗了

这个时候大家就能感觉到一个回归树形成的关键点:(1)分裂点依据什么来划分(如前面说的均方误差最小,loss);(2)分类后的节点预测值是多少(如前面说,有一种是将叶子节点下各样本实际值得均值作为叶子节点预测误差,或者计算所得)

总的来说,通过计算预测误差来判断特征的重要性选择最佳节点分裂,在前一个回归树的基础上,再以同样的方式进行树的构建,最后形成森林。树的每个叶节点对应的是一个数也成为权重,最后预测值就是各个符合条件的叶节点的权重相加。

3. XGBoost目标函数以及loss function的构建

(这里过于麻烦,在应用阶段先省略…详情可看上面的参考博文链接)

4. XGBoost论文的创新点在构建回归树的解释

  • ww是最优化求出来的,不是啥平均值或规则指定的,这个算是一个思路上的新颖吧;

  • 正则化防止过拟合的技术,上述看到了,直接loss function里面就有;

  • 支持自定义loss function,哈哈,不用我多说,只要能泰勒展开(能求一阶导和二阶导)就行,你开心就好;

  • 支持并行化,这个地方有必要说明下,因为这是xgboost的闪光点,直接的效果是训练速度快,boosting技术中下一棵树依赖上述树的训练和预测,所以树与树之间应该是只能串行!那么大家想想,哪里可以并行?!
    没错,在选择最佳分裂点,进行枚举的时候并行!(据说恰好这个也是树形成最耗时的阶段)

  • Attention:同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。

5. XGBoost代码中参数的理论解释

  • early stop: n 当发现n棵树预测已经很好了,不需要进一步学习残差了,即停止建树。
  • max_depth: 最大数的深度。当树达到最大深度时则停止建树。
  • min_child_weight:最小的样本权重和,样本权重和就是∑hi,当样本权重和小于设定阈值时则停止建树。在这里,min_child_weight代表的意思是,当一个节点下的样本数小于给定的阈值时,则停止分裂!
  • 除了以上提到了正则项以外,我们还有shrinkage与列采样技术来避免过拟合的出现。所谓shrinkage就是在每个迭代中树中,对叶子结点乘以一个缩减权重eta。该操作的作用就是减少每颗树的影响力,留更多的空间给后来的树提升。
  • 另一个技术则是采样的技术,有两种,一种是列采样(colsample_bytreecolsample_bylevel),一种是行采样(subsample)。其中列采样的实现一般有两种方式,一种是按层随机colsample_bylevel(一般来讲这种效果会好一点),另一种是建树前就随机选择特征colsample_bytree
    按层随机colsample_bylevel的意思就是,上文提到每次分裂一个结点的时候,我们都要遍历所有的特征和分割点,从而确定最优的分割点,那么如果加入了列采样,我们会在对同一层内每个结点分裂之前,先随机选择一部分特征,于是我们只需要遍历这部分的特征,来确定最优的分割点。
    建树前就随机选择特征colsample_bytree就表示我们在建树前就随机选择一部分特征,然后之后所有叶子结点的分裂都只使用这部分特征。
  • 上式中的gamma即阈值,它是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝
  • scale_pos_weight是用来调节正负样本不均衡问题的,用助于样本不平衡时训练的收敛。
  • 更多参数含义请到XGBoost官网:https://xgboost.readthedocs.io/en/latest/parameter.html

疑问池

一、XGBoost中确定特征重要性的方法?

代码中用dump model切分森林可以得到如下形式:
在这里插入图片描述
有几个问题:
1 其中特征的切分依据是什么?
2 leaf计算出来的是什么?
3 为什么没显示全部特征,显示的依据是什么?

个人理解:

  1. Xgboost的实质可以说是一种基于决策树(CART)的分布式的高效的梯度提升算法,它可被应用到分类、回归、排序等任务中,因此,切分点的依据可以是决策树中的划分特征方法(ID3——信息增益;C4.5——增益率;CART——分类:Gini index,回归:最小方差);
    2. leaf叶节点生成的是函数(离散的是常函数;连续的是线性函数) ;
  2. leaf叶节点生成的是所在叶节点样本的均值;
  3. “因为 Random Forest 由于每个树都是独立的,因此每个树都会进行一次随机选择变量,导致两个相关性很高的变量的共同稀释重要性。 然而 Xgboost 每一次round,如果某个变量已经确定了和y变量的关系,那么Xgboost 不会再进行对这个变量的训练。 因此其他相关性高的变量也不会进行训练了。” 参考自https://jiaxiangli.netlify.com/2018/04/training-model/#importancesdef 感谢!
  • 如有不对,请指点,不胜感激!

参考资料:

  1. Chen T, Guestrin C. XGBoost:A Scalable Tree Boosting System[C]// ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 2016:785-794.
  2. https://blog.csdn.net/qdbszsj/article/details/79615712https://blog.csdn.net/qdbszsj/article/details/79615712
  3. https://blog.csdn.net/Liu941027/article/details/79834011
  4. https://blog.csdn.net/m0_37477175/article/details/79991198
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章