如何解释 Spark OneHotEncoder 的结果

Posted

技术标签:

【中文标题】如何解释 Spark OneHotEncoder 的结果【英文标题】:How to interpret results of Spark OneHotEncoder 【发布时间】:2017-07-06 19:21:53 【问题描述】:

我从 Spark 文档中阅读了 OHE 条目,

单热编码将一列标签索引映射到一列二进制向量,最多只有一个单值。这种编码允许期望连续特征的算法(例如逻辑回归)使用分类特征。

但遗憾的是,他们没有对 OHE 结果给出完整的解释。所以运行给定的代码:

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])|
   +---+--------+-------------+-------------+

我如何解释 OHE(最后一列)的结果?

【问题讨论】:

【参考方案1】:

one-hot encoding 将categoryIndex 中的值转换为二进制向量,其中最大一个值可能为1。由于存在三个值,因此该向量的长度为2,映射如下:

0  -> 10
1  -> 01
2  -> 00

(为什么映射是这样的?见this question关于one-hot编码器丢弃最后一个类别。)

categoryVec 列中的值正是这些值,但以稀疏格式表示。在这种格式中,向量的零点不会被打印。第一个值 (2) 显示向量的长度,第二个值是一个数组,其中列出了找到非零条目的零个或多个索引。第三个值是另一个数组,它告诉在这些索引处找到了哪些数字。 所以 (2,[0],[1.0]) 表示长度为 2 的向量,位置 0 为 1.0,其他位置为 0。

见:https://spark.apache.org/docs/latest/mllib-data-types.html#local-vector

【讨论】:

以上是关于如何解释 Spark OneHotEncoder 的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sklearn 中使用 OneHotEncoder 的输出?

如何改进此代码以使用 OneHotEncoder? [复制]

如何在 pandas 系列列表中使用 OneHotEncoder?

如何使用 OneHotEncoder 和 Pipeline 进行新的预测?

如何在普通最小二乘回归图中使用 OneHotEncoder 输出

scikit-learn:如何使用管道组合 LabelEncoder 和 OneHotEncoder?