XGBoost分类变量:Dummification与编码

ish*_*ido 32 python categorical-data xgboost

使用时XGBoost我们需要将分类变量转换为数字.

以下方法之间的绩效/评估指标是否会有任何差异:

  1. 使您的分类变量变得模糊
  2. 将您的分类变量编码为例如(a,b,c)到(1,2,3)

也:

是否有任何理由不使用例如方法2 labelencoder?

T. *_*arf 44

xgboost 仅处理数字列.

如果你有一个[a,b,b,c]描述分类变量的功能(即没有数字关系)

使用LabelEncoder你只需要:

array([0, 1, 1, 2])
Run Code Online (Sandbox Code Playgroud)

Xgboost 将错误地将此功能解释为具有数字关系! 这只是将每个字符串映射('a','b','c')到一个整数,仅此而已.

合适的方式

使用OneHotEncoder,您最终会得到:

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
Run Code Online (Sandbox Code Playgroud)

这是适用于xgboost任何其他机器学习工具的分类变量的正确表示.

Pandas get_dummies是一个很好的工具,用于创建虚拟变量(在我看来,它更容易使用).

上述问题中的方法#2不能正确表示数据

  • 假设我们正在谈论将Xgboost用于GBDT而不是线性模型,这个答案根本就不是这样.使用整数作为xgboost编码分类变量,有时(YMMV)out执行一个热编码. (29认同)
  • 对于声称基于树的分割算法可以梳理出编码为数字的分类的人们,他们需要理解xgboost使用基于梯度的分割标准,因此数字关系被保留,与基于熵不同,其中数字编码可以更容易地成功.这可以通过玩具数据集凭经验验证.如果你有大量的类别,当然一个热门是一个糟糕的策略. (11认同)
  • 这会使许多类别的功能看起来比那些功能较少的功能更重要吗? (5认同)
  • *“ ...或任何其他机器学习工具” *我不了解xgboost,但总的来说这根本不正确,许多机器学习工具直接处理分类变量,使用OHE或伪变量会严重降低性能:https ://roamanalytics.com/2016/10/28/are-categorical-variables-getting-lost-in-your-random-forests/。此外,还有许多其他用于分类变量的编码方案,最佳编码将取决于您的模型以及数据。 (3认同)
  • @B_Miner 你能进一步解释一下吗?我真的很想知道与单热编码的分类特征相比,我使用 LabelEncoding 的模型实际上表现如何?只是看起来不对 - 我们如何向企业解释这种行为?我的类别有大约 3000 个不同的值,因此单热编码也使数据集膨胀。 (2认同)

mam*_*oku 14

我不仅想从 XGBoost 的角度回答这个问题,还想从处理分类数据的任何问题的角度回答这个问题。虽然“虚拟化”创建了一个非常稀疏的设置,特别是如果您有多个不同级别的分类列,标签编码通常是有偏差的,因为数学表示不能反映级别之间的关系。

对于二元分类问题,在传统信用评分模型中高度利用的一种天才但尚未探索的方法是使用证据权重来代替分类级别。基本上每个分类级别都被商品的比例/不良品的比例所取代。

可以在这里阅读更多相关信息。

Python 库在这里。

此方法允许您捕获一列下的“级别”,并避免通过虚拟化或编码会出现的稀疏或引入偏差。

希望这可以帮助 !


Jon*_*tan 10

2020 年 11 月 23 日

\n

XGBoost 从 1.3.0 版本开始增加了对分类特征的实验性支持。来自文档:

\n
\n

1.8.7 分类数据

\n

除了执行编码的用户之外,XGBoost 还对使用gpu_hist和gpu_predictor的分类数据提供实验性支持。无需对输入测试数据执行特殊操作,因为有关类别的信息在训练期间已编码到模型中。

\n
\n

https://buildmedia.readthedocs.org/media/pdf/xgboost/latest/xgboost.pdf

\n

在 DMatrix 部分,文档还说:

\n
\n

enable_categorical(布尔值,可选)\xe2\x80\x93 版本 1.3.0 中的新增功能。

\n

专门针对分类特征的实验支持。除非您对开发感兴趣,否则不要设置为 True。目前它\xe2\x80\x99s\仅适用于具有1与其余(一个热)\n分类分割的gpu_hist树方法。此外,还需要 JSON 序列化格式、gpu_predictor 和\npandas 输入。

\n
\n