xgboost公式推导

基本构成

boosted tree作为有监督学习算法有几个重要部分:模型、参数、目标函数、优化算法
模型
模型指给定输入x如何去预测输出y
参数
参数指我们需要学习的东西,在线性模型中,参数指我们的线性系数w
目标函数
目标函数:损失 + 正则,教我们如何去寻找一个比较好的参数
一般的目标函数包含下面两项:
这里写图片描述
Bias-variance tradeoff,Bias可以理解为假设我们有无限多数据的时候,可以训练出最好的模型所拿到的误差。而Variance是因为我们只有有限数据,其中随机性带来的误差。
误差函数尽量去拟合训练数据,正则化项则鼓励更加简单的模型。因为当模型简单之后,有限数据拟合出来结果的随机性比较小,不容易过拟合,使得最后模型的预测更加稳定。
优化算法
给定目标函数之后怎么学的问题


Boosted Tree

基学习器:分类和回归树(CART)

这里写图片描述
CART会把输入根据输入的属性分配到各个叶子节点,而每个叶子节点上面都会对应一个实数分数。

Tree Ensemble构成

一个CART往往过于简单无法有效地预测,因此一个更加强力的模型叫做tree ensemble。
这里写图片描述
用两棵树来进行预测。我们对于每个样本的预测结果就是每棵树预测分数的和。
tree ensemble
预测函数:
这里写图片描述
目标函数:
这里写图片描述

模型学习:additive training

第一部分是训练误差,第二部分是每棵树的复杂度的和。
每一次保留原来的模型不变,加入一个新的函数f到我们的模型中。
这里写图片描述
如何选择每一轮加入什么f呢?
选取一个f来使得我们的目标函数尽量最大地降低(加入f后的预测结果与实际结果误差减少)。
这里写图片描述
对于l是平方误差时:
这里写图片描述
对于l不是平方误差的情况:
采用如下的泰勒展开近似来定义一个近似的目标函数
这里写图片描述
移除常数项(真实值与上一轮的预测值之差),目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数
这里写图片描述

树的复杂度

以上是目标函数中训练误差的部分,接下来定义树的复杂度。
对于f的定义做一下细化,把树拆分成结构函数q(输入x输出叶子节点索引)和叶子权重部分w(输入叶子节点索引输出叶子节点分数),结构函数q把输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数是什么。
这里写图片描述
定义一棵树的复杂度如下:
一棵树里面叶子节点的个数,以及每个树叶子节点上面输出分数的L2模平方。
这里写图片描述
目标函数改写:
这里写图片描述
其中I被定义为每个叶子上面样本集合Ij={i|q(xi)=ji} (每个叶子节点里面样本集合);
f(xi)等价于求出w(q(xi))的值(每一个样本所在叶子索引的分数) ;T为叶子节点数量。
定义Gj(每个叶子节点里面一阶梯度的和)Hj(每个叶子节点里面二阶梯度的和):
这里写图片描述
目标函数改写:
这里写图片描述
求偏导得出:
这里写图片描述
Obj代表了当我们指定一个树的结构的时候,我们在目标上面最多减少多少,可叫做结构分数(structure score),Obj计算示例:
这里写图片描述

枚举所有不同树结构的贪心法

exact greedy algorithm 贪心算法获取最优切分点
利用这个打分函数来寻找出一个最优结构的树,加入到我们的模型中,再重复这样的操作。
常用的方法是贪心法,每一次尝试去对已有的叶子加入一个分割。对于一个具体的分割方案,计算增益:
这里写图片描述
对于每次扩展,如何高效地枚举所有的分割呢
假设我们要枚举所有 x

引入新叶子的惩罚项

优化这个目标对应了树的剪枝, 当引入的分割带来的增益小于一个阀值的时候,我们可以剪掉这个分割。
这样根据推导引入了分裂节点的选取计算分数和叶子的惩罚项,替代了回归树的基尼系数与剪枝操作。

当我们正式地推导目标的时候,像计算分数和剪枝这样的策略都会自然地出现,而不再是一种因为heuristic(启发式)而进行的操作了。

缩减与列抽样

缩减,每一个树生成结果乘以一个步长系数 防止过拟合
列采样样 类似随机森林每个树特征抽样 防止过拟合

划分点查找算法

贪心算法
算法1 exact greedy algorithm—贪心算法获取最优切分点
这里写图片描述
approximate algorithm近似算法
算法2 利用Sk
这里写图片描述
核心思想:
通过特征的分布,按照分布式加权直方图算法确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。
在寻找split point的时候,不会枚举所有的特征值,而会对特征值进行聚合统计,然后形成若干个bucket(桶),只将bucket边界上的特征值作为split point的候选,从而获得性能提升。
Weighted Quantile Sketch—分布式加权直方图算法
如何找Sk
这里写图片描述
统计每个特征里面点的权值确定候选切割点(理解为按照一定顺序排成直方图相邻候选点不超过阈值控制直方图每个宽度)
参考
处理稀疏特征分裂算法
这里写图片描述
对于稀疏性的离散特征,在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个工程技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍。
并行化处理
在训练之前,预先对每个特征内部进行了排序找出候选切割点,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。
特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。
优化导致每个样本的梯度信息在内存中不连续,直接累加有可能会导致cache-miss,所以xgboost先将样本的统计信息取到线程的内部buffer,然后再进行小批量的累加。
按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的缓存中,然后再计算,提高算法的效率。


参数

自定义损失函数

  1. 损失函数举例
    这里写图片描述
  2. 针对Logistic loss求一阶二阶梯度
    这里写图片描述
  3. 代码示例
#!/usr/bin/python
import numpy as np
import xgboost as xgb
###
# 定制损失函数
print ('开始运行示例,使用自定义的目标函数')dtrain = xgb.DMatrix('../data/agaricus.txt.train')
dtest = xgb.DMatrix('../data/agaricus.txt.test')param = {'max_depth': 2, 'eta': 1, 'silent': 1}
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
num_round = 2# 用户定义目标函数,给出预测,返回梯度和二阶梯度
def logregobj(preds, dtrain):labels = dtrain.get_label()preds = 1.0 / (1.0 + np.exp(-preds))grad = preds - labelshess = preds * (1.0-preds)return grad, hess# 用户定义的评估函数,返回一个对指标名称和结果
# 当你做定制的损失函数,默认的预测价值可能使评价指标不正常工作,所以要自定义评估函数
def evalerror(preds, dtrain):labels = dtrain.get_label()return 'error', float(sum(labels != (preds > 0.0))) / len(labels)# 训练定制的目标
bst = xgb.train(param, dtrain, num_round, watchlist, logregobj, evalerror)

Xgboost参数

官方
常用参数:
一般参数:
booster[default=gbtree]选择基分类器 gbtree、gblinear 树或线性分类器
silent [default=0] 是否输出详细信息 0不输出 1输出
nthread [default to maximum number of threads available if not set]线程数默认最大
Tree Booster参数:
1. eta [default=0.3]:shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。
2. min_child_weight [default=1]:这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
3. max_depth [default=6]: 每颗树的最大深度,树高越深,越容易过拟合。
4. gamma [default=0]:在树的叶子节点上作进一步分区所需的最小损失减少。越大,算法越保守。[0,∞]
5. max_delta_step [default=0]:这个参数在更新步骤中起作用,如果取0表示没有约束,如果取正值则使得更新步骤更加保守。可以防止做太大的更新步子,使更新更加平缓。 通常,这个参数是不需要的,但它可能有助于逻辑回归时,类是非常不平衡。设置它的值为1-10可能有助于控制更新。
6. subsample [default=1]:样本随机采样,较低的值使得算法更加保守,防止过拟合,但是太小的值也会造成欠拟合。
7. colsample_bytree [default=1]:列采样,对每棵树的生成用的特征进行列采样.一般设置为: 0.5-1
8. lambda [default=1]:控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
9. alpha [default=0]:控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合。
10. scale_pos_weight [default=1]如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。
11. tree_method[default=’auto’]可选 {‘auto’, ‘exact’, ‘approx’} 贪心算法(小数据集)/近似算法(大数据集)
学习任务参数:
objective [ default=reg:linear ]定义最小化损失函数类型
最常用的值有:
binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。
multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。
在这种情况下,你还需要多设一个参数:num_class(类别数目)。
multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。
seed [ default=0 ]随机种子
eval_metric[根据目标objective默认]
对于有效数据的度量方法。
对于回归问题,默认值是rmse,对于分类问题,默认值是error。
典型值有:
rmse 均方根误差( ∑Ni=1ϵ2N‾‾‾‾‾‾‾√ )
mae 平均绝对误差( ∑Ni=1|ϵ|N )
logloss 负对数似然函数值
error 二分类错误率(阈值为0.5)
merror 多分类错误率
mlogloss 多分类logloss损失函数
auc 曲线下面积
命令行参数:
num_round 迭代次数/树的个数


GBDT与XGBoost区别

  1. 目标函数通过二阶泰勒展开式做近似。传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。注:支持自定义代价函数,只要函数可一阶和二阶求导。
  2. 定义了树的复杂度,即xgboost在代价函数里加入了正则项,用于控制模型的复杂度,正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。代替了剪枝。
  3. 分裂结点处通过结构打分和分割损失动态生长。结构分数代替了回归树的误差平方和。
  4. 分裂结点特征分割点选取使用了近似算法-可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。用于加速和减小内存消耗。
  5. 可以处理稀疏、缺失数据(节点分裂算法能自动利用特征的稀疏性),可以学习出它的分裂方向,加快稀疏计算速度。
  6. 列抽样(column subsampling)[传统GBDT没有],Shrinkage(缩减),相当于学习速率(xgboost中的eta)[传统GBDT也有]
  7. 支持并行化处理。xgboost的并行是在特征粒度上的,在训练之前,预先对特征进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。
  8. 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。通过booster [default=gbtree]设置参数:gbtree: tree-based models/gblinear: linear models。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28869.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解GCN原理-公式推导

GNN survey convolution 如何graph domain 上做convolution 是最近最热门的研究方向。 总的来说有两种卷积的方法: Spectral and non-spectral (spatial) spectral Network 通过对图的拉普拉斯矩阵做特征分解,将它定义在 傅里叶 domain上。 在深入…

WorkPlus Knowledge:基于ChatGPT创建专属你的智能化知识库

ChatGPT 到底是个啥东西?其实它就是一个高级点的聊天app,唯一不同的是,它具备了聊天机器人加搜索工具加文本创造工具的能力。举个例子,你跟某爱同学说,哎呀,我不会写作业,好难过。某爱同学会告诉…

OpenAI - tiktoken ⏳ | fast BPE tokeniser

文章目录 关于 ⏳ tiktoken性能表现安装tiktoken 如何计算 tokenEncodingsTokenizer libraries 对不同编程语言的支持How strings are typically tokenized 使用编解码比较 encodings计算chat API调用的tokens拓展 tiktoken 关于 ⏳ tiktoken tiktoken is a fast BPE tokenise…

NLP(五十五)tiktoken的使用

tiktoken是OpenAI于近期开源的Python第三方模块,该模块主要实现了tokenizer的BPE(Byte pair encoding)算法,并对运行性能做了极大的优化。本文将介绍tiktoken模块的使用。 tiktoken简介 BPE(Byte pair encoding)算法是NLP中常见的…

基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围

原文:基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围 - 腾讯云开发者社区-腾讯云 标题有点长,但是基本也说明出了这篇文章的主旨,那就是利用GPT AI智能回答自己设置好的问题 既能实现…

【关于ChatGPT的30个问题】18、ChatGPT对于用户隐私的保护措施如何?/ By 禅与计算机程序设计艺术

18、ChatGPT对于用户隐私的保护措施如何? 目录 18、ChatGPT对于用户隐私的保护措施如何?

c++ 旅行商问题(动态规划)

目录 一、旅行商问题简介旅行商问题问题概述问题由来 二、基本思路三、实现1、状态压缩2、状态转移 四、代码五、复杂度分析 一、旅行商问题简介 旅行商问题 TSP,即旅行商问题,又称TSP问题(Traveling Salesman Problem)&#xff…

ChatGPT 最佳实践指南之:系统地测试变化

Test changes systematically 系统地测试变化 Improving performance is easier if you can measure it. In some cases a modification to a prompt will achieve better performance on a few isolated examples but lead to worse overall performance on a more representa…

医疗健康大数据:应用实例与系统分析

来源:网络大数据 1 、概述 随着信息技术和物联网技术的发展、个人电脑和智能手机的普及以及社交网络的兴起,人类活动产生的数据正以惊人的速度增长。根据国际数据公司(International DataCorporation,IDC)的报告,仅2011年&#xf…

夏季达沃斯论坛《2023年十大新兴技术报告》正式公布

来源:悦智网 该报告概述了未来3-5年内有望对社会产生积极影响的技术。该报告的范围不仅仅描述了技术及其相关的风险和机遇,还包括了对每项技术如何对人类、地球、繁荣、产业和公平产生影响的定性评估。 在夏季达沃斯论坛(世界经济论坛第十四届…

音视频技术开发周刊 | 292

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 谷歌将 AI 芯片团队并入云计算部门 追赶微软和亚马逊 OpenAI推出的ChatGPT获得一定成功,微软是OpenAI的重要投资者,它将ChatGPT植入必应搜索&#…

CollovGPT——人工智能工具颠覆传统室内设计行业

作为线上室内设计领先的平台,Collov一直致力于使用先进的技术重新定义「室内设计」:让室内设计不再是一种奢侈品,而是每一个人都可以享受的生活体验。 经过两年的迭代和开发,我们现在正式上线CollovGPT — 一款基于Stable Diffusi…

扩散模型和Transformer梦幻联动!一举拿下新SOTA

作者丨羿阁 萧箫 来源丨量子位 导读 “U-Net已死,Transformer成为扩散模型新SOTA了!” 就在ChatGPT占尽AI圈风头时,纽约大学谢赛宁的图像生成模型新论文横空出世,收获一众同行惊讶的声音。 MILA在读ML博士生Ethan Caballero 论文…

92K Star !AI 都完全不需要咱们人类了?

Auto-GPT 究竟是一个开创性的项目,还是一个被过度炒作的 AI 实验?本文为我们揭开了喧嚣背后的真相,并揭示了 Auto-GPT 不适合实际应用的生产局限性。 作者:Jina AI 创始人兼 CEO 肖涵博士 译者: 新智元编辑部 原文链接…

揭秘 Auto-GPT 喧嚣背后的残酷真相!

Auto-GPT 究竟是一个开创性的项目,还是一个被过度炒作的 AI 实验?本文为我们揭开了喧嚣背后的真相,并揭示了 Auto-GPT 不适合实际应用的生产局限性。 本文来自 Jina 官方投稿,作者为 Jina AI 创始人兼 CEO 肖涵博士,如…

通过ChatGPT使用Mermaid.js生成时间序列图、组织结构图等

1、用mermaid.js 生成京东网站改版时间序列图 以下是使用Mermaid.js生成的京东网站改版时间序列图: gantttitle 京东网站改版时间序列图dateFormat YYYY-MM-DDsection 基础功能改版登录注册界面 :done, 2018-01-15, 10d购物车页面优化 :done, 2018-02-10, 10d商…

淘汰ChatGPT的Auto-GPT是炒作?自己跑代码,不需要人类,GitHub已破5万星

视学算法报道 编辑:编辑部 【导读】Auto-GPT究竟是一个开创性的项目,还是一个被过度炒作的AI实验?这篇文章为我们揭开了喧嚣背后的真相,并揭示了Auto-GPT不适合实际应用的局限性。 这两天,Auto-GPT——一款让最强语言…

AIPRM for ChatGPT 提示词模板扩展工具实践

(1)基本介绍 AIPRM for ChatGPT是一个Chrome浏览器扩展程序,基于Chromium内核开发的浏览器都可以使用该扩展,比如微软的Edge浏览器等。 在AIPRM的帮助下,我们可以在ChatGPT中一键使用各种专门为网站SEO、SaaS、营销、…

惊!掌握通义千问的关键,从这些必知内容开始!

今年快过半了,要说顶流话题还得是ChatGPT,相关话题的热度居高不下,而其从GPT-3.5到GPT-4的升级,也让我们深刻了解了什么叫一代版本一代神,从GPT-3.5到GPT-4,真的就是一个跨阶级式的升级。 技术内涵 ChatGPT…

讯飞星火大模型申请及测试:诚意满满

“ 大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加:keeepdance,备注:chatgpt,拉你进群。 最近国产大模型跟下饺子似,隔几天就发布一个。厂家发布得起劲&#xf…