xgboost算法原理简介_量子优化算法

xgboost算法原理简介_量子优化算法1、xgboost是什么全称:eXtremeGradientBoosting作者:陈天奇(华盛顿大学博士)基础:GBDT所属:boosting迭代型、树类算法。适用范围:分类、回归优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。缺点:发布时间短(2014),工业领域应用较少,待检验2、基础知识,GBDTxgboost

大家好,又见面了,我是你们的朋友全栈君。

1、xgboost是什么

全称:eXtreme Gradient Boosting
作者:陈天奇(华盛顿大学博士)
基础:GBDT
所属:boosting迭代型、树类算法。
适用范围:分类、回归
优点:速度快、效果好、能处理大规模数据、支持多种语言、支 持自定义损失函数等等。
缺点:发布时间短(2014),工业领域应用较少,待检验

2、基础知识,GBDT

xgboost是在GBDT的基础上对boosting算法进行的改进,内部决策树使用的是回归树,简单回顾GBDT如下:
这里写图片描述

回归树的分裂结点对于平方损失函数,拟合的就是残差;对于一般损失函数(梯度下降),拟合的就是残差的近似值,分裂结点划分时枚举所有特征的值,选取划分点。
最后预测的结果是每棵树的预测结果相加。

3、xgboost算法原理知识

3.1 定义树的复杂度

这里写图片描述

把树拆分成结构部分q和叶子权重部分w。
树的复杂度函数和样例:
这里写图片描述
定义树的结构和复杂度的原因很简单,这样就可以衡量模型的复杂度了啊,从而可以有效控制过拟合。

3.2 xgboost中的boosting tree模型

这里写图片描述

和传统的boosting tree模型一样,xgboost的提升模型也是采用的残差(或梯度负方向),不同的是分裂结点选取的时候不一定是最小平方损失。
这里写图片描述

3.3 对目标函数的改写
这里写图片描述

最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。这么写的原因很明显,由于之前的目标函数求最优解的过程中只对平方损失函数时候方便求,对于其他的损失函数变得很复杂,通过二阶泰勒展开式的变换,这样求解其他损失函数变得可行了。很赞!
当定义了分裂候选集合的时候,这里写图片描述可以进一步改目标函数。分裂结点的候选响集是很关键的一步,这是xgboost速度快的保证,怎么选出来这个集合,后面会介绍。
这里写图片描述

求解:
这里写图片描述

3.4 树结构的打分函数
Obj代表了当指定一个树的结构的时候,在目标上面最多减少多少。(structure score)

这里写图片描述

对于每一次尝试去对已有的叶子加入一个分割
这里写图片描述
这样就可以在建树的过程中动态的选择是否要添加一个结点。
这里写图片描述
假设要枚举所有x < a 这样的条件,对于某个特定的分割a,要计算a左边和右边的导数和。对于所有的a,我们只要做一遍从左到右的扫描就可以枚举出所有分割的梯度和GL、GR。然后用上面的公式计算每个分割方案的分数就可以了。

3.5 寻找分裂结点的候选集
1、暴力枚举

2、近似方法 ,近似方法通过特征的分布,按照百分比确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。
两种策略:全局策略和局部策略。在全局策略中,对每一个特征确定一个全局的候选分裂点集合,就不再改变;而在局部策略中,每一次分裂 都要重选一次分裂点。前者需要较大的分裂集合,后者可以小一点。对比补充候选集策略与分裂点数目对模型的影响。 全局策略需要更细的分裂点才能和局部策略差不多

3、Weighted Quantile Sketch

这里写图片描述
陈天奇提出并从概率角度证明了一种带权重的分布式的Quantile Sketch。

4、xgboost的改进点总结

1、目标函数通过二阶泰勒展开式做近似
2、定义了树的复杂度,并应用到目标函数中
3、分裂结点处通过结构打分和分割损失动态生长
4、分裂结点的候选集合通过一种分布式Quantile Sketch得到
5、可以处理稀疏、缺失数据
6、可以通过特征的列采样防止过拟合

5、参数

xgboost 有很多可调参数,具有极大的自定义灵活性。比如说:
(1)objective [ default=reg:linear ] 定义学习任务及相应的学习目标,可选的目标函数如下:
“reg:linear” –线性回归。
“reg:logistic” –逻辑回归。
“binary:logistic” –二分类的逻辑回归问题,输出为概率。
“multi:softmax” –处理多分类问题,同时需要设置参数num_class(类别个数)
(2)’eval_metric’ The choices are listed below,评估指标:
“rmse”: root mean square error
“logloss”: negative log-likelihood
(3)max_depth [default=6] 数的最大深度。缺省值为6 ,取值范围为:[1,∞]

参考:
官方文档:
http://xgboost.readthedocs.io/en/latest/

Github:
https://github.com/dmlc/xgboost

Xgboost论文:
http://cran.fhcrc.org/web/packages/xgboost/vignettes/xgboost.pdf

陈天奇的boosting tree的ppt:
http://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf

Xgboost调参:
http://blog.csdn.net/wzmsltw/article/details/50994481

GBDT资料:
http://www.jianshu.com/p/005a4e6ac775

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124726.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springboot(16)Spring Boot使用单元测试[通俗易懂]

    转载自嘟嘟独立博客本文链接地址:SpringBoot干货系列:(十二)SpringBoot使用单元测试前言这次来介绍下SpringBoot中对单元测试的整合使用,本篇会通过以下4点来介绍,基本满足日常需求Service层单元测试Controller层单元测试新断言assertThat使用单元测试的回滚正文SpringBoot中引入单元测试很简单,依赖…

    2022年4月13日
    101
  • [解决]Invalid configuration `aarch64-linux’: machine `aarch64′ not recognize「建议收藏」

    [解决]Invalid configuration `aarch64-linux’: machine `aarch64′ not recognize「建议收藏」在TX1板卡上移植开源库出现如下错误checkingbuildsystemtype…Invalidconfiguration`aarch64-linux’:machine`aarch64’notrecognized系统环境ubuntu@tegra-ubuntu:/$file/bin/busybox/bin/busybox:ELF64-bitLS…

    2022年10月17日
    0
  • vue生命周期及其应用场景_介绍vue生命周期流程

    vue生命周期及其应用场景_介绍vue生命周期流程文章目录一,vue生命周期函数:一,vue生命周期函数:vue的生命周期函数又叫钩子函数:生命周期方法详解:beforeCreate//详情//实例初始化之后,组件被创建前,这个时候的el,data,message都是underfined//场景//可以加入loading事件;beforeCreated//详情//实例创建完成后,data、methods被初始化//场景//结束loading事件befor

    2022年10月21日
    0
  • 前端的浅拷贝和深拷贝区别_解构赋值是深拷贝还是浅拷贝

    前端的浅拷贝和深拷贝区别_解构赋值是深拷贝还是浅拷贝一、浅拷贝和深拷贝的区别数据都是存储在内存当中,而我们调用数据的时候都是通过地址来调用数据。对于浅拷贝来说,比如一个数组,只要我们修改了一个拷贝数组,那么原数组也会改变!vara=[0,1,2,3,4];varb=a;console.log(b);//[0,1,2,3,4]console.log(a);//[0,1,…

    2022年9月30日
    0
  • Redis常用命令–set

    Redis常用命令–set

    2022年2月19日
    34
  • java 的double转BigDecimal的坑

    java 的double转BigDecimal的坑大家都知道java的double由于精度问题会给你挖无数个坑,一般采取的方式都会避免使用,但是android的dbflow对model里面的BigDecimal转换为sqlitetable时,fieldtype居然是text.所以,model里面field的属性只能保持double那么,先测试一下:doubled=3.1415;…

    2022年5月27日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号