pyspark中的OneHotEncoder的向量大小错误

时间:2018-08-07 07:43:33

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

我试图检查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。而在“ category”列中,不同值的数目为3,即a,b和c。请让我了解我在这里想念的是什么。

1 个答案:

答案 0 :(得分: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 进行配置),因为这会使矢量条目总计为一,因此   线性相关。因此输入值为4.0映射到 [0.0,0.0,0.0,   0.0]

因此,对于n类别,除非将n-1设置为dropLast,否则输出矢量的大小为False。这没有什么错或奇怪-它只需要n-1索引即可唯一地映射所有类别。