【问题标题】:Why does Spark's OneHotEncoder drop the last category by default?为什么 Spark 的 OneHotEncoder 默认会丢弃最后一个类别?
【发布时间】: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


【解决方案1】:

根据文档,它是保持列独立:

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

https://spark.apache.org/docs/1.5.2/api/java/org/apache/spark/ml/feature/OneHotEncoder.html

【讨论】:

  • 哈哈,最不懒惰并愿意写something的点。如果有人查找此答案,这里有更多信息。分类特征导致有效截距。如果您包含一般截距项,则最小化器可以添加例如截距为 0.5,所有类别为 -0.5,以获得相同的成本函数值。为避免这种退化,请删除截距并包含所有类别。
  • 补充:对于 Scala api,在逻辑回归分类器上使用 .setFitIntercept(false) 以去除包含所有类别时的截距!
  • 所以您通过引用问题中已经存在的同一段文字来回答问题。
  • @Corey,我认为对此的主要看法应该是“注意这一点”。为了安全起见,我建议在模型选择阶段考虑这一点。
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多