2017-02-17 53 views
2

我讀星火文檔的OHE項,如何解釋星火結果OneHotEncoder

一熱編碼映射標籤指數的二進制矢量的一列一列,用最多的單個值。此編碼允許期望連續特徵的算法(如Logistic迴歸)使用分類特徵。

但遺憾的是他們沒有給出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(最後一欄)的結果?

回答

6

一個熱編碼變換中categoryIndex的值入二元載體,其中在最大的一個值可以是1。由於有三個值,所述載體是長度爲2和所述映射如下:

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

(爲什麼是這樣的映射?看this question約一熱編碼器丟棄最後一類)。

categoryVec列中的值是完全相同,但這些在稀疏的格式表示。在這種格式下,矢量的零點不被打印。第一個值(2)顯示向量的長度,第二個值是一個數組,其中列出了零個索引,其中找到了非零條目,第三個值是另一個數組,該數組指示在這些索引處找到哪些數字。所以(2,[0],[1.0])意味着長度爲2的矢量,其中位置0處爲1.0,其他位置處爲0。

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