【问题标题】:Pandas Faster Way for One Hot Encoding vs pd.get_dummiesPandas 一种热编码的更快方式与 pd.get_dummies
【发布时间】:2020-07-16 03:04:32
【问题描述】:

我需要在我的 pandas 数据框上对分类变量进行一个热编码。

我的数据集非常大,有 2000 多个产品 ID 进行热编码。

我尝试了 pd.get_dummies,但它总是崩溃。

我也尝试过 scikit-learn 的 OneHotEncoder,它也崩溃了! (它适用于较小的数据帧子集)

还有哪些其他方法?对非常大的数据集进行热编码分类变量的最有效方法是什么?

我的数据框:

Month   User    ProductID
1       A       ProdA
3       A       ProdB
11      A       ProdC
12      A       ProdD

需要的输出:

Month   User    ProdA  ProdB  ProdC  ProdD
1       A       1      0      0      0
3       A       0      1      0      0
11      A       0      0      1      0
12      A       0      0      0      1

【问题讨论】:

  • 鉴于您的分类数据中的级别数,您可能会查看类似 Catboost 的内容,它旨在处理分类变量而无需编码
  • 您是否考虑过使用 keras 或其他一些 ML 库? keras 有一个函数 to_categorical 可能会起作用。
  • @ayhan 我也试过 scikit-learn 的 OneHotEncoder,它也崩溃了! (它适用于较小的数据帧子集)
  • 这真是令人惊讶。您的数据框有多少行?你能对整个事情执行基本操作吗? (例如将 +1 映射到数字字段等)。如果您想在计算机集群上并行操作,可以查看koalas

标签: python pandas machine-learning scikit-learn


【解决方案1】:

我的数据集非常大,包含 2000 多个产品 ID 和数百万用户行。

这将产生一个巨大的数据集。大概是因为内存崩溃了。

也许您应该考虑替代完整的 one-hot 编码。

一种方法是创建顶级类别的虚拟对象,其余类别为“其他”。

tops = df.ProductID.value_counts().head(10)

将为您提供顶级产品 ID。然后你可以使用

df.ProductID[~df.ProductID.isin(tops)] = 'other'

并从中创建假人。

如果您有响应变量,您也可以使用mean encoding

【讨论】:

  • 听起来是个好主意!我会试一试,应该可以的。
【解决方案2】:

对于具有如此多不同可能值的特征,one-hot 编码可能不是最佳选择。

我建议使用目标编码 (https://contrib.scikit-learn.org/categorical-encoding/)。与将为特征的 k 个唯一值创建 k 列的 one-hot 编码不同,目标编码将一个特征转换为一列。

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 2021-12-17
    • 1970-01-01
    • 2016-03-19
    • 2016-07-21
    • 2018-04-08
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多