Одно горячее кодирование составного поля - PullRequest
0 голосов
/ 01 июля 2018

Я хочу преобразовать несколько столбцов с одинаковыми категориальными значениями, используя OneHotEncoder. Я создал составное поле и попытался использовать OneHotEncoder для него, как показано ниже: (Элементы 1-3 из того же списка элементов)

import pyspark.sql.functions as F

df = df.withColumn("basket", myConcat("item1", "item2", "item3")) 
indexer = StringIndexer(inputCol="basket", outputCol="basketIndex")
indexed = indexer.fit(df).transform(df)
encoder = OneHotEncoder(setInputCol="basketIndex", setOutputCol="basketVec")

encoded = encoder.transform(indexed)

def myConcat(*cols):
    return F.concat(*[F.coalesce(c, F.lit("*")) for c in cols])

Я получаю Ошибка памяти .

Этот подход работает? Как горячим образом кодировать составное поле или несколько столбцов с категориальными значениями из одного списка?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Если у вас есть массив категориальных значений, почему вы не пробовали CountVectorizer:

import pyspark.sql.functions as F
from pyspark.ml.feature import CountVectorizer

df = df.withColumn("basket", myConcat("item1", "item2", "item3")) 
indexer = CountVectorizer(inputCol="basket", outputCol="basketIndex")
indexed = indexer.fit(df).transform(df)
0 голосов
/ 01 июля 2018

Примечание: я пока не могу комментировать (из-за того, что я новый пользователь).

Какова мощность ваших "item1", "item2" и "item3"

В частности, какие значения дает следующий отпечаток?

k1 = df.item1.nunique()
k2 = df.item2.nunique()
k3 = df.item3.nunique()
k = k1 * k2 * k3
print (k1, k2, k3)

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

Поэтому, если ваши 3 числа большие, вы получаете ошибку памяти.

Единственные решения:

(1) увеличить вашу память или (2) ввести иерархию среди категорий и использовать категории более высокого уровня для ограничения k.

...