我想了解Spark OneHotEncoder默認放棄最後一個類別的理由。爲什麼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配置),因爲它使矢量條目總結爲一個,並因此線性依賴包括在內。
我建議你搜索文獻/關於'虛擬變量文章(和線性迴歸) – Aeck
@Aeck謝謝!看起來像虛擬變量陷阱絕對是這個答案問題,如果有人在意寫一點關於它的... – Corey