51

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

以下方法之间的绩效/评估指标是否存在差异:

  1. 虚拟化你的分类变量
  2. 将分类变量从 (a,b,c) 编码为 (1,2,3)

还:

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

4

4 回答 4

68

xgboost仅处理数字列。

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

使用LabelEncoder你会简单地得到这个:

array([0, 1, 1, 2])

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

合适的方式

使用OneHotEncoder你最终会得到这个:

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

这是分类变量xgboost或任何其他机器学习工具的正确表示。

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

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

于 2015-12-18T00:55:20.660 回答
14

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

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

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

Python 库在这里

此方法允许您捕获一列下的“级别”,并避免通过虚拟化或编码发生的稀疏性或偏差感应。

希望这可以帮助 !

于 2018-04-15T00:44:42.487 回答
4

2020 年 11 月 23 日

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

1.8.7 分类数据

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

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

在 DMatrix 部分,文档还说:

enable_categorical (boolean, optional) – 1.3.0 版中的新增功能。

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

于 2021-05-15T10:25:58.370 回答
1

这是将 One hot encodings 列添加到具有分类列的 Pandas DataFrame 的代码示例:

ONE_HOT_COLS = ["categorical_col1", "categorical_col2", "categorical_col3"]
print("Starting DF shape: %d, %d" % df.shape)


for col in ONE_HOT_COLS:
    s = df[col].unique()

    # Create a One Hot Dataframe with 1 row for each unique value
    one_hot_df = pd.get_dummies(s, prefix='%s_' % col)
    one_hot_df[col] = s

    print("Adding One Hot values for %s (the column has %d unique values)" % (col, len(s)))
    pre_len = len(df)

    # Merge the one hot columns
    df = df.merge(one_hot_df, on=[col], how="left")
    assert len(df) == pre_len
    print(df.shape)
于 2018-11-14T09:39:44.313 回答