【发布时间】:2017-01-22 20:04:54
【问题描述】:
我想了解 Spark 的 OneHotEncoder 默认删除最后一个类别的原因。
例如:
>>> fd = spark.createDataFrame( [(1.0, "a"), (1.5, "a"), (10.0, "b"), (3.2, "c")], ["x","c"])
>>> ss = StringIndexer(inputCol="c",outputCol="c_idx")
>>> ff = ss.fit(fd).transform(fd)
>>> ff.show()
+----+---+-----+
| x| c|c_idx|
+----+---+-----+
| 1.0| a| 0.0|
| 1.5| a| 0.0|
|10.0| b| 1.0|
| 3.2| c| 2.0|
+----+---+-----+
默认情况下,OneHotEncoder 会丢弃最后一个类别:
>>> oe = OneHotEncoder(inputCol="c_idx",outputCol="c_idx_vec")
>>> fe = oe.transform(ff)
>>> fe.show()
+----+---+-----+-------------+
| x| c|c_idx| c_idx_vec|
+----+---+-----+-------------+
| 1.0| a| 0.0|(2,[0],[1.0])|
| 1.5| a| 0.0|(2,[0],[1.0])|
|10.0| b| 1.0|(2,[1],[1.0])|
| 3.2| c| 2.0| (2,[],[])|
+----+---+-----+-------------+
当然,这种行为是可以改变的:
>>> oe.setDropLast(False)
>>> fl = oe.transform(ff)
>>> fl.show()
+----+---+-----+-------------+
| x| c|c_idx| c_idx_vec|
+----+---+-----+-------------+
| 1.0| a| 0.0|(3,[0],[1.0])|
| 1.5| a| 0.0|(3,[0],[1.0])|
|10.0| b| 1.0|(3,[1],[1.0])|
| 3.2| c| 2.0|(3,[2],[1.0])|
+----+---+-----+-------------+
问题::
- 在什么情况下需要默认行为?
- 盲目拨打
setDropLast(False)可能会忽略哪些问题? - 作者在文档中的以下陈述是什么意思?
默认情况下不包括最后一个类别(可通过 dropLast 配置),因为它使向量条目总和为 1,因此线性相关。
【问题讨论】:
-
我建议您搜索有关
dummy variable trap(和线性回归)的文献/文章。 -
@Aeck 谢谢!看起来虚拟变量陷阱绝对是这个问题的答案,如果有人愿意写一些关于它的...
-
@Corey 提到了一个问题,我什至不知道删除最后一个类别甚至是一件事。在此处发布并回答了一个关于它的问题,其中包括更多关于 虚拟变量陷阱 (DVT) 的信息:stackoverflow.com/a/51604166/8236733。但基本上,……丢掉最后一只猫。完成值是为了避免 DVT,其中一个输入变量可以从其他变量中预测(例如,当编码
[isBoy]会给出相同的信息时,不需要[isBoy, isGirl]的 1hot 编码)。 DVT 的解决方案是丢弃一只(不一定是最后一只)猫。变量。
标签: apache-spark machine-learning pyspark one-hot-encoding bigdata