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

【数据挖掘】XGBoost面试题:与GBDT的区别?为什么使用泰勒二阶展开?为什么可以并行训练?为什么快?防止过拟合的方法?如何处理缺失值?

1、简单介绍XGB

是一种基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。XGB对GBDT进行了一系列优化,比如损失函数进行了二阶泰勒展开、目标函数加入正则项、支持并行和默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但其核心思想没有大的变化。

2、XGB与GBDT的区别

  • 基分类器:XGB的基分类器不仅支持CART决策树,还支持线性分类器。
  • 导数信息:XGB对损失函数做了二阶泰勒展开,GBDT只用了一阶导数信息,并且XGB还支持自定义损失函数,只要损失函数一阶、二阶可导。
  • 正则项:XGB的目标函数加了正则项, 相当于预剪枝,使得学习出来的模型更加不容易过拟合。
  • 列抽样:XGB支持列采样,与随机森林类似,用于防止过拟合。
  • 缺失值处理:对树中的每个非叶子结点,XGB可以自动学习出它的默认分裂方向。如果某个样本该特征值缺失,会将其划入默认分支。
  • 并行化:注意不是tree维度的并行,而是特征维度的并行。XGBt预先将每个特征按特征值排好序,存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。

3、XGBoost为什么使用泰勒二阶展开

  • 精准性:相对于GBDT的一阶泰勒展开,XGB采用二阶泰勒展开,可以更为精准的逼近真实的损失函数
  • 可扩展性:损失函数支持自定义,只需要新的损失函数二阶可导。

4、XGBoost为什么可以并行训练

  • XGB的并行,并不是说每棵树可以并行训练,XGB本质上仍然采用boosting思想,每棵树训练前需要等前面的树训练完成才能开始训练。
  • XGBoost的并行,指的是特征维度的并行。在训练之前,每个特征按特征值对样本进行预排序,并存储为Block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。

5、XGBoost为什么快

  • 分块并行:训练前每个特征按特征值进行排序并存储为Block结构,后面查找特征分割点时重复使用,并且支持并行查找每个特征的分割点
  • 候选分位点:每个特征采用常数个分位点作为候选分割点
  • CPU cache 命中优化: 使用缓存预取的方法,对每个线程分配一个连续的buffer,读取每个block中样本的梯度信息并存入连续的Buffer中。
  • Block 处理优化:Block预先放入内存;Block按列进行解压缩;将Block划分到不同硬盘来提高吞吐。

6、XGBoost防止过拟合的方法

XGB在设计时,为了防止过拟合做了很多优化,具体如下:

  • 目标函数添加正则项:叶子节点个数+叶子节点权重的L2正则化
  • 列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可)
  • 子采样:每轮计算可以不使用全部样本,使算法更加保守
  • shrinkage: 可以叫学习率或步长,在XGB 进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。

7、XGBoost如何处理缺失值

XGB模型的一个优点就是允许特征存在缺失值。对缺失值的处理方式如下:

  • 在特征k上寻找最佳分割点时,不会对该列特征缺失的样本进行遍历,而只对该列特征值为无缺失值的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找分割点 的时间开销。
  • 在逻辑实现上,为了保证完备性,会将该特征值缺失的样本分别分配到左叶子结点和右叶子结点,两种情形都计算一遍后,选择分裂后增益最大的那个方向(左分支或是右分支),作为预测时特征值缺失样本的默认分支方向。
  • 如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子结点。

相关文章:

  • 【物理应用】基于相场法模拟金属镍的晶粒的长大过程附matlab完整代码
  • 这三个步骤让你知道WPS如何转换成WORD文档
  • sql优化最新干货---mysql存储过程、索引和锁
  • 摄像头测试软件汇总
  • 葡聚糖-NHS/N3/Alkyne/SH/Biotin/CHO/OPSS/OH/NH2/COOH/MAL各种活性基团
  • 【linux操作系统】基础指令(入门必备)
  • 【基础教程】Matlab实现等高线图
  • 零信任策略下K8s安全监控最佳实践(K+)
  • Git之本地分支和远程分支建立追踪关系的几种方式
  • vue 中 父子组件值交互怎么使用 this.$emit
  • Codeforces 1009F 长链剖分优化dp做法
  • 还记得这首是什么歌吗?
  • 【C#教程16/16】: 输入输出
  • 银行 IT 架构到底要不要云化?
  • 柔性电子数字源表测试方案
  • ES6核心特性
  • java2019面试题北京
  • JS变量作用域
  • Koa2 之文件上传下载
  • linux安装openssl、swoole等扩展的具体步骤
  • MySQL的数据类型
  • SpriteKit 技巧之添加背景图片
  • 成为一名优秀的Developer的书单
  • 开发基于以太坊智能合约的DApp
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 让你的分享飞起来——极光推出社会化分享组件
  • 实习面试笔记
  • 小而合理的前端理论:rscss和rsjs
  • 一个完整Java Web项目背后的密码
  • 因为阿里,他们成了“杭漂”
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在Unity中实现一个简单的消息管理器
  • 正则表达式
  • HanLP分词命名实体提取详解
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #单片机(TB6600驱动42步进电机)
  • #每日一题合集#牛客JZ23-JZ33
  • (02)Hive SQL编译成MapReduce任务的过程
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (day6) 319. 灯泡开关
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (libusb) usb口自动刷新
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net core使用ef 6
  • .net mvc部分视图
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET项目中存在多个web.config文件时的加载顺序
  • @EnableAsync和@Async开始异步任务支持
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [].shift.call( arguments ) 和 [].slice.call( arguments )