OneHotEncoder 多列

Posted

技术标签:

【中文标题】OneHotEncoder 多列【英文标题】:OneHotEncoder Multiple Columns 【发布时间】:2019-07-27 05:34:47 【问题描述】:

我正在尝试将具有多列的数据表编码为给定的一组类别

ohe1 = OneHotEncoder(categories = [list_names_data_rest.values],dtype = 'int8')
data_rest1 = ohe1.fit_transform(data_rest.values).toarray()

这里,list_names_data_rest.values 是一个形状数组 (664,)。我有 664 个独特的功能,我正在尝试编码 data_rest,即 (5050,6)。编码后,我期待一个形状(5050,664)

我是对预定义特征集的一种热编码,因为我正在分块下载数据集(由于内存限制),并且我希望我的神经网络的输入形状保持一致

如果我使用pd.get_dummies,根据我的数据集,我可以为我的神经网络获得不同的类别和不同的输入形状

ohe1.fit_transform 确实需要一个形状 (n_values, n_features) 但是,我不知道如何处理。

【问题讨论】:

嘿@Varoon,您的原始数据有 6 个特征。您希望如何对其进行编码?比如说“a”和“b”在你的类别列表中,你如何编码 row1 = ["a","a","a","a","a","a"] 和 row2 = ["a","a","a","b","b","b"] ? 【参考方案1】:

HashingVectorizer 可能是您的情况的一个很好的解决方案。它与输入特征的数量无关,只需将初始大小设置得足够大。

【讨论】:

【参考方案2】:

如果您希望使用pd.get_dummies,可以选择为每个批次迭代地包含您的编码。

对于您的第一批:

ohe = pd.get_dummies(data_rest, columns=['label_col'])

对于每个后续批次:

for b in batches:
    batch_ohe = pd.get_dummies(b, columns=['label_col'])
    ohe = pd.concat([ohe, batch_ohe], axis=0)

ohe = ohe.fillna(0)

【讨论】:

感谢您的快速回复。但这会将我的输入维度更改为神经网络。使用批处理的想法是保留网络架构并从新数据中学习 您可以先对整个数据集进行编码,然后再开始批量训练? 我确实有内存问题,这就是我批量编码的原因 我的意思是你可以先批量编码你的数据集,然后当你完成批量编码后,你就可以开始训练了。如果您开始对部分编码的标签进行训练,那么对于新标签,模型将不知道如何更改它在之前批次中看到的标签编码。您需要保持架构一致,以便 NN 知道它将遇到多少标签,并根据输出节点的总数(而非部分)相应地计算概率分布。 感谢您的帮助。我曾经厌倦了加载整个数据集并应用了 get_dummies,但我遇到了内存问题。你认为批量编码会解决它吗?在训练模型之前,我仍然会将所有训练集保存在我的 RAM 中。

以上是关于OneHotEncoder 多列的主要内容,如果未能解决你的问题,请参考以下文章

如何将 OneHotEncoder 用于多列并自动删除每列的第一个虚拟变量?

LabelEncoder 和OneHotEncoder

在 numpy 数组上应用 onehotencoder

sklearn.preprocessing.OneHotEncoder

在 OneHotEncoder 之后取消转换

sklearn中的LabelEncoder和OneHotEncoder的区别