【问题标题】:OneHotEncoder Multiple ColumnsOneHotEncoder 多列
【发布时间】: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"] ?

标签: pandas machine-learning scikit-learn one-hot-encoding


【解决方案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 中。
    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 2020-10-06
    • 2019-03-25
    • 2021-09-11
    • 2022-01-27
    • 1970-01-01
    • 2021-09-13
    • 2018-10-06
    相关资源
    最近更新 更多