大型数据集的一种热编码

Posted

技术标签:

【中文标题】大型数据集的一种热编码【英文标题】:One Hot Encoding of large dataset 【发布时间】:2021-01-16 01:40:36 【问题描述】:

我想使用在 mlxtend 库 apriori 算法中实现的关联规则来构建推荐系统。在我的销售数据中,有关于 3600 万笔交易和 50k 种独特产品的信息。 我尝试使用 sklearn OneHotEncoder 和 pandas get_dummies() 但两者都给出 OOM 错误,因为它们无法创建形状为 (36 mil, 50k) 的帧

MemoryError: Unable to allocate 398. GiB for an array with shape (36113798, 50087) and data type uint8

还有其他解决办法吗?

【问题讨论】:

【参考方案1】:

我认为一个好的解决方案是使用嵌入而不是一次性编码来解决您的问题。此外,我建议您将数据集拆分为更小的子集,以进一步避免内存消耗问题。

你也应该参考这个帖子:https://datascience.stackexchange.com/questions/29851/one-hot-encoding-vs-word-embeding-when-to-choose-one-or-another

【讨论】:

【参考方案2】:

和你一样,一开始我也遇到了 mlxtend 内存不足的错误,但下面的小改动完全解决了这个问题。 `

from mlxtend.preprocessing import TransactionEncoder   

import pandas as pd

te = TransactionEncoder() 

#te_ary = te.fit(itemSetList).transform(itemSetList)

#df = pd.DataFrame(te_ary, columns=te.columns_)

fitted = te.fit(itemSetList)

te_ary = fitted.transform(itemSetList, sparse=True) # seemed to work good

df = pd.DataFrame.sparse.from_spmatrix(te_ary, columns=te.columns_) # seemed to work good

# now you can call mlxtend's fpgrowth() followed by association_rules()   

`

您还应该在大型交易数据集上使用 fpgrowth 而不是 apriori,因为 apriori 太原始了。 fpgrowth 比 apriori 更智能、更现代,但结果相当。 mlxtend 库同时支持 apriori 和 fpgrowth。

【讨论】:

以上是关于大型数据集的一种热编码的主要内容,如果未能解决你的问题,请参考以下文章

keras中多标签图像的一种热编码

如何使用 tf.one_hot 计算一种热编码?

使用 scikit 学习的一种热编码和熊猫

使用 numpy 的一种热编码 [重复]

logit 和 sklearn 管道的一种热编码

大型网格数据集的存储