2017-02-17 4 views
2

Я прочитал запись Охи из Спарка Docs,Как интерпретировать результаты Спарка OneHotEncoder

Один горячего кодирование отображает столбец индексов метки на столбец двоичных векторов, с не более одной одной стоимостью , Эта кодировка позволяет алгоритмам, которые ожидают непрерывные функции, такие как логистическая регрессия, использовать категориальные функции.

но, к сожалению, они не дают полного объяснения результатов 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])| 
    +---+--------+-------------+-------------+ 

Как я мог интерпретировать результаты Охи (последний столбец)?

ответ

6

Один горячее кодирование преобразует значения в categoryIndex в бинарный вектор, где при максимальном одно значения может быть 1. Так как существует три значения, то вектор имеет длину 2 и отображение выглядит следующим образом:

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

(Почему отображение как это? См this question об одном горячем кодировщике капельного последней категорию.)

значения в колонке categoryVec являются именно эти, но представлены в редком формате. В этом формате нули вектора не печатаются. Первое значение (2) показывает длину вектора, второе значение представляет собой массив, в котором перечислены ноль больше индексов, где найдены ненулевые записи, а третье значение - это еще один массив, который сообщает, какие числа найдены по этим индексам. Итак, (2, [0], [1.0]) означает вектор длины 2 с 1,0 в позиции 0 и 0 в другом месте.

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

Смежные вопросы