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 用于多列并自动删除每列的第一个虚拟变量?