python - python 中二进制单热(one-of-K)编码的问题

标签 python pandas scikit-learn categorical-data

二进制单热(也称为 one-of-K)编码在于为分类变量的每个不同值制作一个二进制列。例如,如果一个颜色列(分类变量)采用值“红色”、“蓝色”、“黄色”和“未知”,则二进制单热编码会将颜色列替换为二进制列“颜色=”红色”、“颜色=蓝色”和“颜色=黄色”。我从 pandas 数据框中的数据开始,我想使用这些数据来训练带有 scikit-learn 的模型。我知道两种进行二进制单热编码的方法,但没有一种让我满意。

  1. Pandas 和 get_dummies 在数据框的分类列中。就原始数据框包含可用的所有数据而言,此方法似乎非常出色。也就是说,您在将数据拆分为训练、验证和测试集之前进行一次性编码。但是,如果数据已经拆分成不同的集合,则此方法效果不佳。为什么?因为其中一个数据集(比如测试集)可以包含更少的给定变量值。例如,训练集可能包含变量颜色的值红色、蓝色、黄色和未知,而测试集仅包含红色和蓝色。所以测试集最终会比训练集有更少的列。 (我也不知道新列是如何排序的,即使有相同的列,每组中的顺序也可能不同)。

  2. Sklearn 和 DictVectorizer 这解决了之前的问题,因为我们可以确保对测试集应用完全相同的转换。但是,转换的结果是一个 numpy 数组而不是 pandas 数据框。如果我们想将输出恢复为 pandas 数据帧,我们需要(或者至少这是我这样做的方式): 1) pandas.DataFrame(data=outcome of DictVectorizer transformation, index=index of original pandas data frame, columns= DictVectorizer().get_features_names) 和 2) 沿索引将生成的数据框与包含数字列的原始数据框连接起来。这可行,但有点麻烦。

如果我们将数据拆分为训练集和测试集,是否有更好的方法在 pandas 数据帧中进行二进制单热编码?

最佳答案

如果您的列顺序相同,您可以连接 dfs,使用 get_dummies,然后再次拆分它们,例如,

encoded = pd.get_dummies(pd.concat([train,test], axis=0))
train_rows = train.shape[0]
train_encoded = encoded.iloc[:train_rows, :]
test_encoded = encoded.iloc[train_rows:, :] 

如果您的列的顺序不同,那么无论您尝试什么方法,您都会遇到挑战。

关于python - python 中二进制单热(one-of-K)编码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256415/

相关文章:

python - 如果我已经将模型作为 pickle,为什么还需要在 docker 容器中使用 sklearn?

python - 创建两个分类变量的热图

python - 使用 Python 将字符串列合并到一组列表

python - pandas 使用 $ 特殊文本样式分割字符串

python - 如何解决 ValueError : The number of classes has to be greater than one; got 1 class

machine-learning - 变量的二次变换

python - Python 中的循环效率

python - 如何在Python中利用字节数组的每一位

python - 在 Caffe 中生成用于对象检测的 lmdb 文件

python - 从文本文件解析/循环 JSON 对象 (Python)