如何向量化一个热编码过程?

数据挖掘 Python 一热编码
2022-02-16 18:21:20

很抱歉这个奇怪的问题 - 我什至不知道这是否有意义,但是我在大学的 Python 课程介绍中想到了这一点,并且从那以后一直想知道它。

所以我有一些使用 Python 进行数据科学的经验,但从未参加过结构化课程。我在上介绍课,第一天我们被要求计算某个名字出现在列表中的次数。显然,我想出的答案是将一个变量初始化为零,然后遍历列表并在列表中的第 i 个名称等于目标名称时为其自身添加一个。

然而,在 Andrew Ng 的深度学习课程中,尽可能将我们的计算向量化。这让我想知道如何将这项任务矢量化。

在理想情况下,我想出的是创建一个向量,其中每个目标名称都替换为 1,其他名称替换为 0。然后我可以只取向量的总和,我就会得到我的回答。这个问题是我知道如何创建所述向量的唯一方法是遍历原始列表,从而破坏了以这种方式解决问题的目的。

无论如何,虽然我知道创建这个向量并不完全是一种热编码,但有没有办法对这个过程进行向量化?一种热编码是迭代完成的。如果没有,是否还有其他示例可以将基本迭代任务转换为能够并行处理的任务?

抱歉,如果这是一个愚蠢的问题或没有任何意义 - 只是作为基础 Python 的菜鸟我很好奇。

2个回答

您可以在此处阅读 sklearn 文档如果单击源代码,则可以检查代码

如果你想做一种热编码,你可以做

    >>> from sklearn.preprocessing import OneHotEncoder
    >>> enc = OneHotEncoder(handle_unknown='ignore')
    >>> X = [['Male', 1], ['Female', 3], ['Female', 2]]
    >>> enc.fit(X)
    OneHotEncoder(handle_unknown='ignore')
    >>> enc.categories_
    [array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]
    >>> enc.transform([['Female', 1], ['Male', 4]]).toarray()

如果您是一位经验丰富的开发人员,您应该只尝试实现这一点。以非最佳方式实现 OHE 的几行代码是:

for col in columns_encoding:
    variables = df[col].unique()
    for v in variables:
        df[col + str(v)] = [1 if row == v else 0 for row in df[col].values]

其中 columns_encoding 是您要编码的列的列表,并 df 您的数据框

除了性能原因之外,维护更为重要。只需OneHotEncodersklearn库中使用,不要考虑并行化此任务。一种热编码是相当便宜的预处理器,运行整个管道不会有太大差异。拟合模型最耗时,因此请专注于此。

如果您真的想知道如何对其进行矢量化,则需要遍历整个数据集以获得唯一值和 one-hot 向量长度。您可以并行化第二遍将分类值替换为 one-hot 向量并合并数据集块。

并行化并不总是最好的做法。启动、管理和合并多个线程总是有一些额外的成本。除非你有很多事情要做,否则你不会看到太大的不同。

当我们谈论向量化时,我们主要指的是对数值数组的一些计算,这些计算很容易分离。这主要是使用numpy内部矢量化的操作(本机代码,python 机器外部)来完成的。它更多的是关于 CPU 如何在内部处理数组操作——在一个循环中处理多个元素,而不是一次处理一个。您可以在wiki上阅读有关AVX的更多信息,尽管这确实是低级的硬件内容;)

tl; 博士

  • 使用库中的方法
  • 不要使用循环,numpy尽可能使用,