【问题标题】:Wrong vector size of OneHotEncoder in pysparkpyspark 中 OneHotEncoder 的向量大小错误
【发布时间】:2019-01-14 05:29:53
【问题描述】:

我试图检查 pyspark 中 OneHotEncoder 的输出。我在编码器的论坛和文档中读到,编码向量的大小将等于正在编码的列中不同值的数量。

from pyspark.ml.feature import OneHotEncoder, StringIndexer

df = sqlContext.createDataFrame([
(0, "a"),
(1, "b"),
(2, "c"),
(3, "a"),
(4, "a"),
(5, "c")
], ["id", "category"])

stringIndexer = StringIndexer(inputCol="category",   outputCol="categoryIndex")

model = stringIndexer.fit(df)

indexed = model.transform(df)

encoder = OneHotEncoder(inputCol="categoryIndex", outputCol="categoryVec")

encoded = encoder.transform(indexed)
encoded.show()

以下是上面代码的结果

+---+--------+--------------+-------------+
| id|category|categoryIndex|  categoryVec|
+---+--------+--------------+-------------+
|  0|       a|           0.0|(2,[0],[1.0])|
|  1|       b|           2.0|    (2,[],[])|
|  2|       c|           1.0|(2,[1],[1.0])|
|  3|       a|           0.0|(2,[0],[1.0])|
|  4|       a|           0.0|(2,[0],[1.0])|
|  5|       c|           1.0|(2,[1],[1.0])|
+---+--------+--------------+-------------+

根据 categoryVec 列的解释,向量的大小为 2。而“类别”列中不同值的数量为 3,即 a、b 和 c。请让我了解我在这里缺少什么。

【问题讨论】:

    标签: python pyspark apache-spark-ml one-hot-encoding


    【解决方案1】:

    来自pyspark.ml.feature.OneHotEncoder 的文档:

    class pyspark.ml.feature.OneHotEncoder(dropLast=True, inputCol=None, outputCol=None)
    

    将一列类别索引映射到一列的单热编码器 二进制向量,每行最多有一个单值 表示输入类别索引。例如,有 5 个类别,一个 输入值 2.0 将映射到输出向量 [0.0, 0.0, 1.0, 0.0]默认情况下不包括最后一个类别(可通过 dropLast 配置),因为它使向量条目总和为 1,因此 线性相关。所以输入值 4.0 映射到 [0.0, 0.0, 0.0, 0.0].

    所以对于n 类别,除非您将dropLast 设置为False,否则您将获得大小为n-1 的输出向量。这没有什么不对或奇怪的——你只需要n-1 索引来唯一地映射所有类别。

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2013-09-12
      • 1970-01-01
      • 2017-12-10
      相关资源
      最近更新 更多