【问题标题】:How to handle categorical features in neural network?如何处理神经网络中的分类特征?
【发布时间】:2018-04-03 01:24:11
【问题描述】:

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

我想使用二进制编码或 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

【问题讨论】:

  • 数据帧的长度是多少
  • 长度约为100,000,000。
  • 你需要进行并行编程。一亿行?处理太多了
  • 您能否添加一个示例来说明您的数据的外观。所以我们可以考虑 scikit 矢量化器
  • 这里的关键字是 sparse。要么使用 pandas 稀疏特征(不确定它们有多好;sparse=True)或 sklearn 的(默认稀疏)。如果有 5000 个类别,您将添加 5000 列,但每行中只有一个非零。这就是稀疏数据结构的全部思想(确保求解器可以利用这一点)。

标签: pandas numpy scikit-learn neural-network


【解决方案1】:

我认为你可以:

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

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

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

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

【讨论】:

  • 感谢您的建议。不幸的是,我无法删除任何列,因为我必须预测所有项目。我将尝试 FM 并将其与 NN 进行比较。谢谢!
【解决方案2】:

与其创建大量的虚拟变量,不如使用 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.]])

【讨论】:

  • 一个数据框中大约有 1 亿行。不知道它可以阻止内存错误。
  • 如果我用它来创建一个热编码数组,张量的形状应该是什么样的?谢谢!
  • “Pandas 没有内置这个功能” ...pd.get_dummies?
  • pd.get_dummies 产生......好吧,傻瓜。很多带有 0 和 1 的列。 One-hot 编码产生单个值,您可以将其视为数字或位数组。
  • 不,one-hot 编码变量是 dummy 的另一个名称。输出是一个数组,其中只有 1 列处于活动状态(热),所有其他列包含 0。 pd.get_dummies 和 OneHotEncoder.transform() 将产生完全相同的结果(只是 OneHotEncoder 将适用于数值数据,而 get_dummies 适用于任何类型)。
猜你喜欢
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2021-12-16
  • 2018-01-22
  • 2021-06-13
  • 2011-07-30
  • 2015-11-25
相关资源
最近更新 更多