我目前有一个关于商店位置和商品名称的数据集,用于预测特定产品的销售。
我想使用二进制编码或 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
与其创建大量虚拟变量,不如使用独热编码: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.]])
你可以:
不要使用所有项目,而只使用最常用的项目。
这样创建假人,创建更少的新列,并且需要更少的内存。为此,您将需要计数很少的项目(使用阈值定义少量),并且您将丢失一些信息。
另一种方法是使用因子分解机。
您可以使用上面的两个建议,并在最后平均他们的预测以获得更好的分数。