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
只处理数值列。如果您有描述分类变量的特征
[a,b,b,c]
(即没有数字关系)使用LabelEncoder您将得到:
Xgboost
将错误地将此功能解释为具有数字关系!这只是将每个字符串('a','b','c')
映射为一个整数,仅此而已。正确的方法
使用OneHotEncoder您最终将得到:
这是
xgboost
或任何其他机器学习工具的分类变量的正确表示。Pandas get_dummies是一个很好的创建伪变量的工具(在我看来,这更容易使用)。
上述问题中的方法2不能正确表示数据
下面是将一个热编码列添加到具有分类列的Pandas数据帧的代码示例:
我不仅想用XGBoost来回答这个问题,而且想用处理分类数据的任何问题来回答这个问题。虽然“dummiffication”创建了一个非常稀疏的设置,特别是如果有多个具有不同级别的分类列,但是由于数学表示不能反映级别之间的关系,标签编码通常会有偏差。
对于二元分类问题,传统信用评分模型中高度利用的一种天才但未经探索的方法是使用证据权重来代替分类级别。基本上,每个分类级别都被商品比例/不良品比例所取代。
可以阅读更多关于它的信息here。
Python库here。
此方法允许您捕获一列下的“级别”,并避免通过模拟或编码产生的稀疏性或偏差。
希望这有帮助!
相关问题 更多 >
编程相关推荐