XGBoost分类变量:虚拟与编码

2024-05-21 09:07:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

  1. 虚幻你的分类变量
  2. 把你的分类变量从(a,b,c)编码到(1,2,3)

另外:

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


Tags: 方法编码分类差异指标数值xgboostlabelencoder
3条回答

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不能正确表示数据

下面是将一个热编码列添加到具有分类列的Pandas数据帧的代码示例:

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)

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

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

可以阅读更多关于它的信息here

Python库here

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

希望这有帮助!

相关问题 更多 >