使用XGBoost
时,我们需要将分类变量转换为数字。
方法之间的性能/评估指标是否存在差异
- 伪化你的分类变量
- 对分类变量进行编码,例如从(a,b,c)到(1,2,3)
还有:
是否有任何理由不使用方法2(例如labelencoder
)?
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无法正确表示数据
我不仅想从XGBoost的角度回答这个问题,还想从处理分类数据的任何问题的角度回答。虽然"虚拟化"创建了一个非常稀疏的设置,特别是如果你有多个具有不同级别的分类列,那么标签编码通常是有偏见的,因为数学表示不能反映级别之间的关系。
对于二元分类问题,一种在传统信用评分模型中高度利用的天才但尚未探索的方法是使用证据权重来代替分类级别。基本上,每个分类级别都被商品比例/不良品比例所取代
可以在这里阅读更多信息。
Python库。
此方法允许您捕获一列下的"级别",并避免通过虚设或编码产生的稀疏性或偏差诱导。
希望这能有所帮助!
2020年11月23日
XGBoost从1.3.0版本开始增加了对分类特征的实验支持。来自文档:
1.8.7分类数据
除了执行编码的用户之外,XGBoost还提供了实验支持对于使用gpu_host和gpu_predictor的分类数据。没有特别的由于信息在训练期间,about类别被编码到模型中。
https://buildmedia.readthedocs.org/media/pdf/xgboost/latest/xgboost.pdf
在DMatrix部分,文档还显示:
enable_categorical(布尔值,可选)–1.3.0版本中的新增功能。
对分类特征进行专门化的实验支持。不要设置为True,除非您对开发感兴趣。目前仅适用于具有1 vs rest(一个热)的gpuhost-tree方法分类分裂。此外,JSON序列化格式、gpu_predictor和熊猫输入是必需的。
下面是一个将One-hot编码列添加到具有分类列的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)