当前位置: 首页 > news >正文

树模型详解3-xgboost

回归树:

表达式为T(x)=wq(x),意思为:一个样本x,落到树的哪个叶子结点由q(x)得出,具体叶子结点对应的值由w函数得出

如何构建函数:

eef02b6b387d455392d791f671fa737c.png

运用加法模型构建,由T个基学习器构成,也可表示为前T-1个树的结果再加上第T个树的结果

前向分步算法:一种贪心算法,每次只优化当前树至最优结果

下面写目标函数:

fe7e77c0e7db44748b19255135e23cfc.png

即为N个样本的损失函数总和加上正则项,其中正则项是t个模型复杂度的总和,目标是让这个函数最小 

 

正则项如何展开:

799519eaeead4918846ee8a9749ea099.png

T是所有叶子结点的个数,w是叶子结点值平方和

如果某棵回归树值的占比较大,则容易过拟合。 

 

再讲下第一部分的处理

一般可以用梯度下降来处理第一部分,但树模型是阶跃的(x<0一个值大于0一个值),不能这么搞

13c2e0ec22254f1ca457b268c2a4c599.png

 思路:把每一个样本的损失和变换为每个叶子结点的损失和f94f1e34e89f4ae0bcf8fa5894b53f84.png 

比如L结点1=L3+L5=(y3-w1)2+(y5-w1)2

ae7d6cadb5be4963ae7d6675b7e5672b.png

求解得w=y3+y5时能取最小值

因此可以把公式变形为:6c7101f0bb0c4d42899a49a3ec5a0ba7.png 

0b7f48673c69464ebf614db7c69461af.png

用二阶泰勒展开可得最终需要优化的表达式如上图,由此对每个变量w求最优解

c8b359c0322d473d9621ef0966cb6ba6.png

有二次方程公式推出:

38d0316273bc472881c5ec4615985ba6.png

那么就可以得到思路:每次拿到一个数据集,就可以把它的一阶梯度和二阶梯度gh,再得到每个叶子结点的GH,再由上面公式把叶子结点的值都计算出来 

 

那么接下来就是如何确定树的结构能让obj最小

法1:暴力穷举

法2:精确贪心:每次只关注一个节点如何做分裂,计算分裂后增益最大的划分

停止生长:增益均<=0,叶子结点包含样本数小于等于1,层级,叶子结点个数

算法实现:

90024d854159417dab39e32c90508f43.png

I:样本集合 d:特征维度 gain:增益 

k:遍历树

(注意可以并行计算,所以不会太慢,但是每次要根据不同的特征进行样本的排序,花时间)

优化:1.减少特征数(列采样)-按树/层随机选特征

2.每个特征下能不能减少特征值:分桶,每个桶样本数基本一致。改进方法是根据损失函数找加权分位点a87f8c0d7ce24086bc28bd8db1d883eb.png

即有hi个这个元素的样本 ,再按分桶方法去均匀分

策略上分为全局策略和局部策略,全局指一开始订好了3.5.7来分桶,则之后所有结点都按这三个值分,这很容易导致划到一定程度就化不下去了

而局部策略则是每个特征划分的特征值都不一样

 

接下来讲xgboost的缺失值处理:

有些特征不知道,但是样本id、gi、hi这些都能知道。处理方法是将缺失样本全部放到某一支,比较gain,放到最大的那支里

 

学习率:

837e7ac484e84639953b5adc344d8d5b.png

加个学习率让它不要学得太精确,防止过拟合

 

系统设计

1.核外块运算:

主要有两点,一是把没有一次性读完的数据放在磁盘上,二是单独开个线程,在运算的同时把磁盘的搬到核上,保持运算连贯性

 

2.分块并行:

解决的问题:

每次树结点分裂都要重新排序

算gain能否并行处理

 

解决方法:在基学习器学习前就排序,将排序结果保存在block中,按列进行存储。同时保存其索引,通过特征值就可以得到样本值是谁。进而得到gi,hi,得到gain,并把最大的gain筛选出来

392eff0b028441769016aa27f14593fb.png

 分块计算然后让调度中心判断哪块最大

2fc2866d21024eb1ae31be7de3b547eb.png

 

对缓存命中率低这点的优化:

2fec9ec84ae44972b959525c57072795.png

 给每个特征值加一个buffer记录记录g和h值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Elasticsearch的DSL查询,分组后排序,并查询组数量
  • 学工系统学生家庭情况登记功能概述
  • NET的全称、主要功能以及在计算机网络中的作用?
  • 8.3 day bug
  • 快速方便地下载huggingface的模型库和数据集
  • MQTT(速记版)
  • Arduino PID库 (2) –微分导致的过冲
  • 基于ThinkPHP开发的校园跑腿社区小程序系统源码,包含前后端代码
  • css3的继承性
  • 十五 open CV 教程 形态学二值化和腐蚀操作
  • 结构型设计模式:桥接/组合/装饰/外观/享元
  • 【Nuxt】配置
  • 【Python 逆向滑块】(实战六)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信
  • CTF web bibibi题型
  • Unity计算位置平移矩阵
  • hexo+github搭建个人博客
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 2017届校招提前批面试回顾
  • Android Studio:GIT提交项目到远程仓库
  • CAP 一致性协议及应用解析
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Js基础——数据类型之Null和Undefined
  • JWT究竟是什么呢?
  • Markdown 语法简单说明
  • npx命令介绍
  • PHP CLI应用的调试原理
  • 观察者模式实现非直接耦合
  • 简单基于spring的redis配置(单机和集群模式)
  • 深入浅出Node.js
  • 问题之ssh中Host key verification failed的解决
  • 我看到的前端
  • 小程序开发之路(一)
  • 学习Vue.js的五个小例子
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • ​2021半年盘点,不想你错过的重磅新书
  • ​马来语翻译中文去哪比较好?
  • # 职场生活之道:善于团结
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (4)Elastix图像配准:3D图像
  • (solr系列:一)使用tomcat部署solr服务
  • (SpringBoot)第二章:Spring创建和使用
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm码农论坛 毕业设计 231126
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转载)深入super,看Python如何解决钻石继承难题
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 5种线程安全集合
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core中如何集成RabbitMQ
  • .NET MVC之AOP
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件