先说结论,XGBoost和LightGBM是支持缺失值的

由于XGBoost和LightGBM对缺失值的处理方法是相同的,因此我们只拿XGBoost来解读

建议大家看下论文,链接:https://www.kdd.org/kdd2016/subtopic/view/xgboost-a-scalable-tree-boosting-system

XGBoost是一种boosting的集成学习模型

支持的弱学习器(即单个的学习器,也称基学习器)有树模型(gbtree/dart,dart为引入dropout的树模型,下次将详解)和线性模型(gblinear),默认为gbtree。

1、 如果弱学习器为gblinear由于线性模型不支持缺失值,会将缺失值填充为0

2、如果弱学习器为gbtreedart,则支持缺失值,其分裂过程如下。

一、 训练阶段

在训练过程中,如果特征 f 0 f_0 f0​出现了缺失值,处理步骤如下:
1、首先对于 f 0 f_0 f0​非缺失的数据,计算出 L s p l i t L_{split} Lsplit​并比较大小,选出最大的 L s p l i t L_{split} Lsplit​,确定其为分裂节点(即选取某个特征的某个阈值);

2、然后对于 f 0 f_0 f0​缺失的数据,将缺失值分别划分到左子树和右子树,分别计算出左子树和右子树的 L s p l i t L_{split} Lsplit​,选出更大的 L s p l i t L_{split} Lsplit​,将该方向作为缺失值的分裂方向(记录下来,预测阶段将会使用)。

二、预测阶段

在预测阶段,如果特征 f 0 f_0 f0​出现了缺失值,则可以分为以下两种情况:

1、如果训练过程中, f 0 f_0 f0​出现过缺失值,则按照训练过程中缺失值划分的方向(left or right),进行划分;

2、如果训练过程中, f 0 f_0 f0​没有出现过缺失值,将缺失值的划分到默认方向(左子树)。

下面是论文和源码的解析。论文是这样描述的::

想要对XGBoost实现细节有更加深刻理解,还需要去阅读XGBoost的源码,如下:

//来源:https://github.com/dmlc/xgboost
//代码位置:include/xgboost/tree_model.h
/*! \brief get next position of the tree given current pid */
inline int RegTree::GetNext(int pid, bst_float fvalue, bool is_unknown) const {bst_float split_value = (*this)[pid].SplitCond();if (is_unknown) {return (*this)[pid].DefaultChild();} else {if (fvalue < split_value) {return (*this)[pid].LeftChild();} else {return (*this)[pid].RightChild();}}
}
} // 若缺失返回True,非缺失返回False
inline bool RegTree::FVec::IsMissing(size_t i) const {return data_[i].flag == -1;
}

算法流程如下

  1. is_unknown,判断特征是否缺失
  2. DefaultChild为缺失值的默认划分方向,详见代码如下
//来源:https://github.com/dmlc/xgboost
//src/tree/param.h
//设置默认的分裂方向/*!\return whether missing value goes to left branch */inline bool DefaultLeft() const { return (sindex >> 31) != 0; }// calculate the cost of loss function
template <typename TrainingParams, typename T>
XGBOOST_DEVICE inline T CalcGain(const TrainingParams &p, T sum_grad, T sum_hess) {if (sum_hess < p.min_child_weight) {return T(0.0);
}if (p.max_delta_step == 0.0f) {if (p.reg_alpha == 0.0f) {return Sqr(sum_grad) / (sum_hess + p.reg_lambda);} else {return Sqr(ThresholdL1(sum_grad, p.reg_alpha)) /(sum_hess + p.reg_lambda);}} else {T w = CalcWeight(p, sum_grad, sum_hess);T ret = sum_grad * w + T(0.5) * (sum_hess + p.reg_lambda) * Sqr(w);if (p.reg_alpha == 0.0f) {return T(-2.0) * ret;} else {return T(-2.0) * (ret + p.reg_alpha * std::abs(w));}}
}

还有人不懂XGBoost的缺失值处理?(全面解析篇)相关推荐

  1. 震惊!居然还有人不懂二叉树!99%的程序员都会了,不会就点进来吧!

    什么!你居然点进来了!看来你就是那百分之一的程序员吧.既然不懂什么是二叉树,那我就来给你讲讲. 1. 树 所谓二叉树,本质上还是个树呀,想要知道什么是二叉树,就要了解树是什么样子的.纳尼!树是什么样子 ...

  2. 还有人不懂分布式锁的实现就把这篇文章丢给他

    大多数互联网系统都是分布式部署的,分布式部署确实能带来性能和效率上的提升,但为此,我们就需要多解决一个分布式环境下,数据一致性的问题. 当某个资源在多系统之间,具有共享性的时候,为了保证大家访问这个资 ...

  3. Java-方法的详解( 看完之后,我不允许还有人不懂!)

    文章目录 一.什么是方法 二.方法定义 三.方法调用 四.方法重载 1.什么是方法重载? 2.为什么会出现方法重载? 3.被称为方法重载的必要条件是什么? 4.编译器是如何识别出相同名字的方法的呢? ...

  4. 竟然还有人不懂69是什么

    六九五十四啊 睡前套路 偶尔套路,偶尔鸡汤

  5. 锐龙做服务器稳定么,都2021年了,还有人说AMD不如Intel稳定,这样误导别人真的好吗?...

    原标题:都2021年了,还有人说AMD不如Intel稳定,这样误导别人真的好吗? Hello大家好,我是兼容机之家的小牛! 都2021年了,竟然还有人觉得AMD不如Intel稳定!这些人难道都不看新闻 ...

  6. 天真,居然还有人认为java的参数传递方式是引用传递

    代码写的越急,程序跑得越慢.-- Roy Carlson 时间过得真快,2020已经过去了一半,但是疫情好像还没有真正的消灭,人们出行还是得带着口罩,天气越来越热,受罪啊. 言归正传,都2020年了, ...

  7. mobile还有人用吗 spring_话说,苹果手机语音备忘录功能还有人用吗?

    hi,各位,苹果手机自带的语音备忘录功能还有人在用吗? 前两天,有小伙伴在后台留言问:"苹果手机语音备忘录怎么恢复?" 小编一时还有些恍惚"它是什么,手机上有吗?&quo ...

  8. 还搞不懂 Java NIO?快来读读这篇文章!

    来自:会点代码的大叔 首先,我们需要弄清楚几个概念:同步和异步,阻塞和非阻塞. 01 同步和异步 1. 同步 进程触发 IO 操作的时候,必须亲自处理: 比如你必须亲自去银行取钱. 2. 异步 进程触 ...

  9. 我就不信看完这篇你还搞不懂信息熵

    我就不信看完这篇你还搞不懂信息熵 https://mp.weixin.qq.com/s/7NrB0UtmELXD3UNO3C6jGA 让我们说人话!好的数学概念都应该是通俗易懂的. 信息熵,信息熵,怎 ...

最新文章

  1. python的模块itsdangerous
  2. linux下几种反弹Shell方法的总结与理解
  3. 数据结构:堆排序一(heap sort)
  4. python中类中属性和方法的具体定义方法和使用
  5. 在C#代码中应用Log4Net 中配置文件的解释
  6. C++学习笔记之二:通过结构体来理解类
  7. Qt::Key_Return和Qt::Key_Enter区别
  8. linux tar 使用
  9. 两张照片重叠处半透明_那些悬浮在空中的照片是怎么拍的?
  10. python异步高并发_通过python异步通讯方式构建高并发压力测试工具
  11. Xamarin只言片语1——Xamarin下的弹框
  12. JavaScript--Array; Array.prototype
  13. 个性化hexo博客,添加评论系统,分享,友情链接功能
  14. 双绞线的制作方式详解
  15. c语言中static 变量
  16. vertica 数据库 linux,CentOS 7下安装vertica记录
  17. 拒绝跟风,谈谈几种算法岗的区别和体验
  18. 【笔记本显卡改BIOS硬超频方法初探及简明步骤】
  19. EEGLAB系列教程5:数据预处理2(ICA去伪迹)
  20. GWAS丨GEMMA软件下载和安装

热门文章

  1. redist 在linux上的安装教程
  2. 这些网站,你应该知道(一)
  3. 有糖如何用777元指纹手机完善大社交生态?
  4. 英语老师教计算机,英语教案-小学计算机老师教案?
  5. 拜占庭将军问题 原文翻译
  6. retrospective material for final English exam unit_5 Law
  7. sqlserver数据库修改日志文件大小限制
  8. 西北大学844计算机考研真题,2018年西北大学信息科学与技术学院844软件工程学科专业基础综合之计算机操作系统考研基础五套测试题...
  9. 智能家居“伪智能”陷阱此起彼伏 该如何辨别?
  10. 【传感器大赏】6轴加速度计陀螺仪