Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么Spark';s OneHotEncoder是否默认删除最后一个类别?_Apache Spark_Machine Learning_Pyspark_One Hot Encoding_Bigdata - Fatal编程技术网

Apache spark 为什么Spark';s OneHotEncoder是否默认删除最后一个类别?

Apache spark 为什么Spark';s OneHotEncoder是否默认删除最后一个类别?,apache-spark,machine-learning,pyspark,one-hot-encoding,bigdata,Apache Spark,Machine Learning,Pyspark,One Hot Encoding,Bigdata,我想了解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(

我想了解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])|
+----+---+-----+-------------+
问题::

  • 在什么情况下,默认行为是可取的
  • 盲目调用
    setdLoast(False)
    ,可能会忽略哪些问题
  • 作者在文档中的以下陈述是什么意思
默认情况下不包括最后一个类别(可通过dropLast配置),因为它使向量条目的总和为一,因此线性相关


根据文档,保持列的独立性:

将一列类别索引映射到一列的单热编码器 对于二进制向量,每行最多有一个值 指示输入类别索引。例如,对于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,保存所有类别。输出向量为 稀疏的


我建议您搜索有关
伪变量陷阱(和线性回归)的文献/文章@Aeck谢谢!如果有人愿意写一点关于虚拟变量的文章,那么虚拟变量陷阱似乎就是这个问题的答案…@Corey讲述了一个问题,当时我甚至不知道删除最后一个类别是一件事,对此我感到困惑。发布并回答了一个关于虚拟变量的问题,其中包括更多关于虚拟变量的内容这里的陷阱(DVT):但基本上,…删除最后一个cat。这样做是为了避免DVT,其中一个输入变量可以从其他变量中预测(例如,当一个编码
[isBoy]
会给出相同的信息时,不需要1热编码
[isBoy]
),DVT的解决方案是删除一个(不一定是最后一个)对于cat.variables.Haha,这是最不懒惰和最不愿意写东西的一个例子。如果有人查找这个答案,这里有更多的信息。分类功能会导致有效的截取。如果你包含一个通用截取项,那么最小值可以加上例如0.5到截取和-0.5到所有类别,以获得相同的v成本函数的值。为避免这种退化,请删除截距并包含所有类别。此外,对于Scala api,请使用
。setFitIntercept(false)
在逻辑回归分类器上删除截取,包括所有类别!因此,您通过引用问题中已经存在的同一段文本来回答问题。@Corey,我认为主要内容应该是“注意这一点”.为了安全起见,我建议在选型阶段考虑这一点。