Строковые индексы, преобразованные в однообразный вектор, являются пустыми (индекс не установлен в 1) для некоторых строк? - PullRequest
1 голос
/ 17 января 2020

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

si = StringIndexer(inputCol="LABEL", outputCol="LABEL_IDX").fit(df)
df = si.transform(df)
oh = OneHotEncoderEstimator(inputCols=["LABEL_IDX"], outputCols=["LABEL_OH"]).fit(df)
df = oh.transform(df)

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

(1,[],[])

Я бы ожидал, что разреженные векторы будут выглядеть как (1,[0],[1.0]) или (1,[1],[1.0]), но здесь векторы - просто нули.

Есть идеи, что здесь может происходить?

1 Ответ

1 голос
/ 17 января 2020

Это связано с тем, как значения кодируются в миллиллибах. 1hot не кодирует двоичное значение, как ...

[1, 0] or [0, 1]

способом [то, это], а скорее

[1] or [0]

В формате разреженного вектора случай [0] выглядит как (1,[],[]), то есть длина = 1, индексы позиции не имеют ненулевых значений и (таким образом) не содержат ненулевых значений в списке (подробнее о том, как mllib представляет разреженные векторы здесь ). Так же, как для двоичной категории требуется только один бит для представления обоих вариантов, кодирование 1hot использует один индекс в векторе. Из другой статьи о кодировке ...

Одна горячая кодировка очень популярна. Мы можем представить всю категорию с помощью N-1 (N = Нет категории), поскольку этого достаточно, чтобы закодировать ту, которая не включена [... Но обратите внимание, что ] для классификации рекомендуется использовать все N без столбцов, поскольку большая часть алгоритма на основе дерева строит дерево на основе всех доступных

Если вы не хотите, чтобы одноразовый кодер отбрасывал последнюю категорию, чтобы упростить представление, класс mllib a dropLast param можно установить, см. https://spark.apache.org/docs/latest/api/python/pyspark.ml.html#pyspark .ml.feature.OneHotEncoderEstimator

...