还有人不懂XGBoost的缺失值处理?(全面解析篇)
先说结论,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、如果弱学习器为gbtree或dart,则支持缺失值,其分裂过程如下。
一、 训练阶段
在训练过程中,如果特征 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;
}
算法流程如下
- is_unknown,判断特征是否缺失
- 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的缺失值处理?(全面解析篇)相关推荐
- 震惊!居然还有人不懂二叉树!99%的程序员都会了,不会就点进来吧!
什么!你居然点进来了!看来你就是那百分之一的程序员吧.既然不懂什么是二叉树,那我就来给你讲讲. 1. 树 所谓二叉树,本质上还是个树呀,想要知道什么是二叉树,就要了解树是什么样子的.纳尼!树是什么样子 ...
- 还有人不懂分布式锁的实现就把这篇文章丢给他
大多数互联网系统都是分布式部署的,分布式部署确实能带来性能和效率上的提升,但为此,我们就需要多解决一个分布式环境下,数据一致性的问题. 当某个资源在多系统之间,具有共享性的时候,为了保证大家访问这个资 ...
- Java-方法的详解( 看完之后,我不允许还有人不懂!)
文章目录 一.什么是方法 二.方法定义 三.方法调用 四.方法重载 1.什么是方法重载? 2.为什么会出现方法重载? 3.被称为方法重载的必要条件是什么? 4.编译器是如何识别出相同名字的方法的呢? ...
- 竟然还有人不懂69是什么
六九五十四啊 睡前套路 偶尔套路,偶尔鸡汤
- 锐龙做服务器稳定么,都2021年了,还有人说AMD不如Intel稳定,这样误导别人真的好吗?...
原标题:都2021年了,还有人说AMD不如Intel稳定,这样误导别人真的好吗? Hello大家好,我是兼容机之家的小牛! 都2021年了,竟然还有人觉得AMD不如Intel稳定!这些人难道都不看新闻 ...
- 天真,居然还有人认为java的参数传递方式是引用传递
代码写的越急,程序跑得越慢.-- Roy Carlson 时间过得真快,2020已经过去了一半,但是疫情好像还没有真正的消灭,人们出行还是得带着口罩,天气越来越热,受罪啊. 言归正传,都2020年了, ...
- mobile还有人用吗 spring_话说,苹果手机语音备忘录功能还有人用吗?
hi,各位,苹果手机自带的语音备忘录功能还有人在用吗? 前两天,有小伙伴在后台留言问:"苹果手机语音备忘录怎么恢复?" 小编一时还有些恍惚"它是什么,手机上有吗?&quo ...
- 还搞不懂 Java NIO?快来读读这篇文章!
来自:会点代码的大叔 首先,我们需要弄清楚几个概念:同步和异步,阻塞和非阻塞. 01 同步和异步 1. 同步 进程触发 IO 操作的时候,必须亲自处理: 比如你必须亲自去银行取钱. 2. 异步 进程触 ...
- 我就不信看完这篇你还搞不懂信息熵
我就不信看完这篇你还搞不懂信息熵 https://mp.weixin.qq.com/s/7NrB0UtmELXD3UNO3C6jGA 让我们说人话!好的数学概念都应该是通俗易懂的. 信息熵,信息熵,怎 ...
最新文章
- python的模块itsdangerous
- linux下几种反弹Shell方法的总结与理解
- 数据结构:堆排序一(heap sort)
- python中类中属性和方法的具体定义方法和使用
- 在C#代码中应用Log4Net 中配置文件的解释
- C++学习笔记之二:通过结构体来理解类
- Qt::Key_Return和Qt::Key_Enter区别
- linux tar 使用
- 两张照片重叠处半透明_那些悬浮在空中的照片是怎么拍的?
- python异步高并发_通过python异步通讯方式构建高并发压力测试工具
- Xamarin只言片语1——Xamarin下的弹框
- JavaScript--Array; Array.prototype
- 个性化hexo博客,添加评论系统,分享,友情链接功能
- 双绞线的制作方式详解
- c语言中static 变量
- vertica 数据库 linux,CentOS 7下安装vertica记录
- 拒绝跟风,谈谈几种算法岗的区别和体验
- 【笔记本显卡改BIOS硬超频方法初探及简明步骤】
- EEGLAB系列教程5:数据预处理2(ICA去伪迹)
- GWAS丨GEMMA软件下载和安装
热门文章
- redist 在linux上的安装教程
- 这些网站,你应该知道(一)
- 有糖如何用777元指纹手机完善大社交生态?
- 英语老师教计算机,英语教案-小学计算机老师教案?
- 拜占庭将军问题 原文翻译
- retrospective material for final English exam unit_5 Law
- sqlserver数据库修改日志文件大小限制
- 西北大学844计算机考研真题,2018年西北大学信息科学与技术学院844软件工程学科专业基础综合之计算机操作系统考研基础五套测试题...
- 智能家居“伪智能”陷阱此起彼伏 该如何辨别?
- 【传感器大赏】6轴加速度计陀螺仪