如何处理神经网络中的分类特征?

问题描述 投票:0回答:3

我目前有一个关于商店位置和商品名称的数据集,用于预测特定产品的销量。

我想使用二进制编码或 pandas get_dummies(),但是项目有 5000 个名称,它会导致内存错误,是否有任何替代或更好的方法来处理这个问题?谢谢大家!

print(train.shape)
print(train.dtypes)
print(train.head())

(125497040, 6)
id               int64
date            object
store_nbr        int64
item_nbr         int64
unit_sales     float64
onpromotion     object
dtype: object
   id        date  store_nbr  item_nbr  unit_sales onpromotion
0   0  2013-01-01         25    103665         7.0         NaN
1   1  2013-01-01         25    105574         1.0         NaN
2   2  2013-01-01         25    105575         2.0         NaN
3   3  2013-01-01         25    108079         1.0         NaN
4   4  2013-01-01         25    108701         1.0         NaN
pandas numpy scikit-learn neural-network
3个回答
0
投票

您应该使用 one-hot 编码,而不是创建无数的虚拟变量:https://en.wikipedia.org/wiki/One-hot

Pandas 没有内置此功能,因此最简单的方法是使用

scikit-learn
http://scikit-learn.org/stable/modules/ generated/sklearn.preprocessing.OneHotEncoder.html

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9])
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

0
投票

我认为你可以:

  1. 不要使用所有项目,而只使用最常用的项目。

    通过这种方式创建虚拟对象,创建更少的新列并且需要更少的内存。对于这种情况,您将需要数量很少的项目(用阈值定义很少),并且您将丢失一些信息。

  2. 另一种方法是使用分解机。

您可以使用上面的两个建议,最后对他们的预测进行平均以获得更好的分数。


0
投票

这么多年过去了,我可以用更新的方法来回答自己。除了一种热门类别或截断类别之外,我们还可以使用嵌入。每个类别将由一个可学习的向量表示。这个可学习的向量可以输入神经网络或任何其他机器学习算法,包括决策树。

© www.soinside.com 2019 - 2024. All rights reserved.