本篇文章主要参考柯国霖大神在知乎上的回答,以及自己阅读LGBM的部分源码整理而来。

1、one-hot编码弊端

one-hot编码是处理类别特征的一个通用方法,然而在树模型中,这可能并不一定是一个好的方法,尤其当类别特征中类别个数很多的情况下。主要的问题是:

①可能无法在这个类别特征上进行切分(即浪费了这个特征)。使用one-hot编码的话,意味着在每一个决策节点上只能使用one vs rest(例如是不是狗,是不是猫等)的切分方式。当类别值很多时,每个类别上的数据可能会比较少,这时候切分会产生不平衡,这意味着切分增益也会很小(比较直观的理解是,不平衡的切分和不切分没有区别)。

②会影响决策树的学习。因为就算可以在这个类别特征进行切分,也会把数据切分到很多零碎的小空间上,如图1左边所示。而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习会变差。但如果使用如图1右边的分裂方式,数据会被切分到两个比较大的空间,进一步的学习也会更好。

图1右边叶子节点的含义是X=A或者X=C放到左孩子,其余放到右孩子。

图1

2、LGBM处理分类特征

2.1 大致流程

为了解决one-hot编码处理类别特征的不足。LGBM采用了Many vs many的切分方式,实现了类别特征的最优切分。用Lightgbm可以直接输入类别特征,并产生如图1右边的效果。在1个k维的类别特征中寻找最优切分,朴素的枚举算法的复杂度是,而LGBM采用了如参考文献【1】的方法实现了的算法。

算法流程如图2所示:在枚举分割点之前,先把直方图按每个类别的均值进行排序;然后按照均值的结果依次枚举最优分割点。从图2可以看到,Sum(y)/Count(y)为类别的均值。当然,这个方法很容易过拟合,所以在LGBM中加入了很多对这个方法的约束和正则化。图3是一个简单的对比实验,可以看到该最优方法在AUC上提升了1.5个点,并且时间只多了20%。

图2

图3

2.2 详细流程

下面具体来讲下在代码中如何求解类别特征的最优切分的流程:

(feature_histogram.hpp文件中FindBestThresholdCategorical函数)

A. 离散特征建立直方图的过程:

统计该特征下每一种离散值出现的次数,并从高到低排序,并过滤掉出现次数较少的特征值, 然后为每一个特征值,建立一个bin容器, 对于在bin容器内出现次数较少的特征值直接过滤掉,不建立bin容器。

B. 计算分裂阈值的过程:

B.1
先看该特征下划分出的bin容器的个数,如果bin容器的数量小于4,直接使用one vs other方式, 逐个扫描每一个bin容器,找出最佳分裂点;

B.2
对于bin容器较多的情况, 先进行过滤,只让子集合较大的bin容器参加划分阈值计算, 对每一个符合条件的bin容器进行公式计算(公式如下: 该bin容器下所有样本的一阶梯度之和 / 该bin容器下所有样本的二阶梯度之和 + 正则项(参数cat_smooth),这里为什么不是label的均值呢?其实上例中只是为了便于理解,只针对了学习一棵树且是回归问题的情况, 这时候一阶导数是Y, 二阶导数是1),得到一个值,根据该值对bin容器从小到大进行排序,然后分从左到右、从右到左进行搜索,得到最优分裂阈值。但是有一点,没有搜索所有的bin容器,而是设定了一个搜索bin容器数量的上限值,程序中设定是32,即参数max_num_cat。
LightGBM中对离散特征实行的是many vs many 策略,这32个bin中最优划分的阈值的左边或者右边所有的bin容器就是一个many集合,而其他的bin容器就是另一个many集合。

B.3
对于连续特征,划分阈值只有一个,对于离散值可能会有多个划分阈值,每一个划分阈值对应着一个bin容器编号,当使用离散特征进行分裂时,只要数据样本对应的bin容器编号在这些阈值对应的bin集合之中,这条数据就加入分裂后的左子树,否则加入分裂后的右子树。

参考文献:

【1】On grouping For maximum homogeneity

【2】https://www.zhihu.com/question/266195966

Lightgbm如何处理类别特征?相关推荐

  1. lgb(lightgbm)处理类别特征遇到的问题(泰坦尼克):

    1.lgb(lightgbm)处理类别特征遇到的问题: ValueError: DataFrame.dtypes for data must be int, float or bool. Did no ...

  2. lightgbm处理类别特征

    lightGBM的categorical_feature(类别特征)使用 http://www.luyixian.cn/news_show_253681.aspx lightGBM比XGBoost的1 ...

  3. 05如何处理类别特征?

    Categorical Variables: Counting Eggs in theAge of Robotic Chickens 定义: 类别变量:顾名思义代表类别或标签. 比如: 世界上的主要城 ...

  4. 利用神经网络的embedding层处理类别特征

    类别特征在现实里十分常见,处理的方法也很多,最常见的思路是转为one-hot编码,当然这种处理方式比较粗暴,在许多算法里效果也不是很好.还有的处理方式寻找类别特征的最优切分,这个需要特定工具的支持,如 ...

  5. AI基础:特征工程-类别特征

    0.导语 特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 此之前,我已经写了以下几篇AI基础的快速入门,本篇文章讲解特征工程基础第一部分 ...

  6. [深度学习]CTR模型如何加入稠密连续型|多值类别特征

    一 稠密连续类型特征的处理 在点击率预估问题中,可以尝试的几种方法 1.归一化后直接拼接到embedding向量侧dnn部分,不参与fm部分交叉 归一化的方式可以包括:直接对原始特征做归一化:通过bn ...

  7. 多值类别特征加入CTR预估模型的方法

    [摘要] 本文用图示的方法梳理和介绍了多值类别特征加入到CTR预估模型的一般方法,通俗易懂. 我们都知道一般单值类别特征加入到CTR预估模型的方法是先对单值类别特征进行one-hot,然后和embed ...

  8. KDD2021 | 推荐系统中利用深度哈希方法学习类别特征表示

    本文分享一篇谷歌团队发表在KDD'21的推荐系统文章:不使用嵌入表的方式获得类别特征的表征用于推荐系统[1]. 本文结构组织如下: 背景 已有的类别特征嵌入方法 One-hot Full Embedd ...

  9. 机器学习基础(三十七) —— 处理类别特征

    当类别特征仍保持原始形式时,其取值来自所有可能取值构成的集合而不是一个数字,故不能作为输入. 当各个取值之间是没有顺序关系的并列关系,这样的类别特征称为 名义(nominal)变量.相反,那些存在顺序 ...

最新文章

  1. sublime text3 怎么配置、运行python_【IT专家】Sublime Text3配置在可交互环境下运行python快捷键...
  2. 怎样用HTML5 Canvas制作一个简单的游戏
  3. linux磁盘满时,如何定位并删除文件
  4. 2021-01-27 计算机-进程与线程区别
  5. Python数据格式:%s字符串,%d整型,%f浮点型
  6. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...
  7. Codeforces Round #324 (Div. 2) B. Kolya and Tanya
  8. vue的html自动刷新,Vue页面刷新记住页面状态的实现
  9. 190616每日一句
  10. STC单片机程序下载原理与自动下载
  11. 去除WinRAR弹窗广告,去除购买许可弹窗
  12. 微信公众号文章编辑排版工具+自动采集+使用视频教程
  13. 22. Asteroid: the PyTorch-based audio source separation toolkit for researchers
  14. objectArx ---反应器
  15. js vue 获取 (昨天、今天、明天) 时间
  16. netty之微信-IM简介(二)
  17. Flink SQL CDC 13 条生产实践经验
  18. 单调有界定理适用于函数吗_用极限定义证明一些极限的性质定理
  19. 游戏服务器和网站,大型网络游戏和大型网站需要服务器的不同
  20. newman执行测试_newman执行postman脚本

热门文章

  1. 怎么把Word转换PPT?这几个方法超好用
  2. Visual Stdio 2022如何打开监视窗口?
  3. 解决无法在哔哩哔哩(b站)上使用HTML5视频播放器脚本插件/油猴等插件失效的问题
  4. 第一次看母亲细嚼慢咽地吃饭,欣慰还是心酸?
  5. linux 下写不了文件,linux下用root为什么写不了windows下的文件
  6. 基于FPGA和ZLG7289实现按键
  7. ES+Redis+MySQL,高可用架构设计太牛了!(至尊典藏版)
  8. arduino+水位传感器+led显示+蜂鸣器报警
  9. nginx: [emerg] “location“ directive is not allowed here in /usr/local/nginx/conf/nginx.conf:72
  10. 韩老师——数据结构与算法—单链表的生成及增删改查操作和常见关于链表的面试题java代码实现