工程实现

块结构设计

我们知道,决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序。而 XGBoost 在训练之前对根据特征对数据进行了排序,然后保存到块结构中,并在每个块结构中都采用了稀疏矩阵存储格式(Compressed Sparse Columns Format,CSC)进行存储,后面的训练过程中会重复地使用块结构,可以大大减小计算量。

  • 每一个块结构包括一个或多个已经排序好的特征;
  • 缺失特征值将不进行排序;
  • 每个特征会存储指向样本梯度统计值的索引,方便计算一阶导和二阶导数值;

这种块结构存储的特征之间相互独立,方便计算机进行并行计算。在对节点进行分裂时需要选择增益最大的特征作为分裂,这时各个特征的增益计算可以同时进行,这也是 Xgboost 能够实现分布式或者多线程计算的原因。

缓存访问优化算法

块结构的设计可以减少节点分裂时的计算量,但特征值通过索引访问样本梯度统计值的设计会导致访问操作的内存空间不连续,这样会造成缓存命中率低,从而影响到算法的效率。

为了解决缓存命中率低的问题,XGBoost 提出了缓存访问优化算法:为每个线程分配一个连续的缓存区,将需要的梯度信息存放在缓冲区中,这样就是实现了非连续空间到连续空间的转换,提高了算法效率。

此外适当调整块大小,也可以有助于缓存优化。

“核外”块计算

当数据量过大时无法将数据全部加载到内存中,只能先将无法加载到内存中的数据暂存到硬盘中,直到需要时再进行加载计算,而这种操作必然涉及到因内存与硬盘速度不同而造成的资源浪费和性能瓶颈。为了解决这个问题,XGBoost 独立一个线程专门用于从硬盘读入数据,以实现处理数据和读入数据同时进行。

此外,XGBoost 还用了两种方法来降低硬盘读写的开销:

块压缩:对 Block 进行按列压缩,并在读取时进行解压;
块拆分:将每个块存储到不同的磁盘中,从多个磁盘读取可以增加吞吐量。

优点:

  1. 精度更高:GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost
    引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
  2. 灵活性更强:GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,(使用线性分类器的
    XGBoost 相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题))。此外,XGBoost
    工具支持自定义损失函数,只需函数支持一阶和二阶求导;
  3. 正则化:XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的 L2
    范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合;
  4. Shrinkage(缩减):相当于学习速率。XGBoost
    在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间;
  5. 列抽样:XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算;
  6. 缺失值处理:XGBoost 采用的稀疏感知算法极大的加快了节点分裂的速度;
  7. 可以并行化操作:块结构可以很好的支持并行计算。

缺点:

  1. 虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂过程中仍需要遍历数据集;
  2. 预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。

XGBoost-工程实现与优缺点(中)相关推荐

  1. 特征工程在实际业务中的应用!

    Datawhale干货 作者:知乎King James,伦敦国王大学 知乎|https://www.zhihu.com/people/xu-xiu-jian-33 导读:大概知道特征工程,但是不清楚特 ...

  2. 导入eclipse工程到Android Studio中

    ref: 从 Eclipse 迁移至 Android Studio | Android Studio https://developer.android.com/studio/intro/migrat ...

  3. Android 工程引入自定义Library后,工程无法识别Library中的类

    这个问题有点神啊. 在工程中导入第三方类库包(自定义Library)本来运行的好好的,突然间所有引用的Library中的类都无法在工程中引用了,一个劲的打红叉,eclipse也重启了,项目也clean ...

  4. 简单工程验收单表格_中铁超大型工程项目-123个精细化管理手册配套表格附件,超全...

    中铁超大型工程项目-123个精细化管理手册配套表格附件,超全! 什么是项目精细化? 答:工程项目精细化管理是一个系统的管理体系,包含一系列管理制度和办法,除了<工程项目精细化管理办法>这个 ...

  5. 超简单:解析 yml 类型(application.yml)配置文件 、springboot 工程读取 yml 文件中的值

    方法三是我觉得最简单的. 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 工程结构: 2. 我要读取  application.yml 中属性 ...

  6. XGBoost原理及在Python中使用XGBoost

    原理见:http://www.myexception.cn/operating-system/2084839.html 译文转自:http://blog.csdn.net/zc02051126/art ...

  7. 工程思想 ——【程序中的二进制】

    前言:程序在计算机中运行时候都是二进制机器码的形式,最初每个二进制码的状态"0"或者"1"代表着一个电子开关的开闭状态.因此软件程序,特别是很靠近硬件或者追求性 ...

  8. idea创建父子工程module_在IDEA中创建父工程和子模块module的方法步骤

    在IDEA中创建父工程和子模块module的方法步骤 1.右键选择你所创建的空文件夹,然后new,再点击Module 2.依次选择maven,这里不要点击"create from arche ...

  9. xgboost在LTR(学习排序)中的应用

    LTR背景介绍 Learning to rank (LTR) 中文译为"排序学习",在信息检索(IR)以及 NLP 领域都有着广泛应用,此外在计算广告.推荐系统场景下同样也有应用空 ...

  10. 最速下降法 c 语言程序,工程優化方法中的“最速下降法”和“DFP擬牛頓法”的 C 語言實現...

    這個小程序是研一上學期的"工程優化"課程的大作業.其實這題本可以用 MATLAB 實現,但是我為了鍛煉自己薄弱的編碼能力,改為用 C 語言實現.這樣,就得自己實現矩陣的運算(加減乘 ...

最新文章

  1. WinForm的RadioButton使用小技巧
  2. Windbg内核调试之四: Dump文件分析
  3. Python的IDE:利用MyEclipse2017软件的PyDev插件实现Python编程
  4. 学习springboot基础必备
  5. javascript中的模块系统
  6. JS左侧竖向滑动菜单
  7. 嵌入式Linux系统编程学习之二十五信号量
  8. SAP License:我对SAP项目实施是这样理解的
  9. docker-compose RabbitMQ与Nodejs接收端同时运行时的错误
  10. xps测试数据处理软件,XPS数据处理时 XPSpeaks 分峰拟合
  11. ASC19 T4 CESM
  12. 后端使用postman进行测试
  13. python艺术画_Python也能绘制艺术画?这里有一个完整教程
  14. 服务器虚拟机uefi,为虚拟机启用或禁用 UEFI 安全引导
  15. STFT filter bank
  16. Android 获取手机中微信聊天记录
  17. CC2530驱动_ds18b20
  18. 海思hi3516EV300_4G图传模组防雷防静电推荐图
  19. simon手册翻译_part2
  20. Verilog十大基本功7 (IC设计经典书籍)

热门文章

  1. 深入 char * ,char ** ,char a[ ] ,char *a[]
  2. Android之调用微信登陆、分享、支付
  3. android 固定底部 布局_Android系统列表控件
  4. 这场戏里,到底是谁脏了?
  5. 985硕博士:你为什么比我差?
  6. 每日一笑 | 如果把大脑看成CPU的话...
  7. 惊呆了!竟然还有这样的操作!
  8. java 有没有with语句_Java中的try-with-resources语句
  9. redis 查询缓存_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....
  10. java数组深拷贝和浅拷贝_java中的深拷贝与浅拷贝(值类型 vs 引用类型)