scikit-learn: одно горячее кодирование столбца со значениями списка

Я пытаюсь закодировать кадр данных, как показано ниже:

A B C
2 'Привет' ['мы', есть', 'хорошо']
1 'Все' ['привет', 'мир']

Теперь, как вы можете видеть, я могу пометить строковые значения второго столбца, но я не могу понять, как кодировать третий столбец, который имеет список строковых значений, и длина списков различна. Даже если я onehotencode это, я получу массив, который я не знаю, как объединить с элементами массива других столбцов после кодирования. Посоветуйте хорошую технику


person Vivek Sharma    schedule 10.03.2017    source источник
comment
Используйте Multilabelbinarizer для одного горячего кодирования этой функции. См. мой ответ здесь   -  person Vivek Kumar    schedule 10.03.2017


Ответы (1)


Предположим, что у нас есть следующий DF:

In [31]: df
Out[31]:
   A      B                C
0  2  Hello  [we, are, good]
1  1    All   [hello, world]

Давайте воспользуемся sklearn.feature_extraction.text.CountVectorizer

In [32]: from sklearn.feature_extraction.text import CountVectorizer

In [33]: vect = CountVectorizer()

In [34]: X = vect.fit_transform(df.C.str.join(' '))

In [35]: df = df.join(pd.DataFrame(X.toarray(), columns=vect.get_feature_names()))

In [36]: df
Out[36]:
   A      B                C  are  good  hello  we  world
0  2  Hello  [we, are, good]    1     1      0   1      0
1  1    All   [hello, world]    0     0      1   0      1

в качестве альтернативы вы можете использовать sklearn.preprocessing.MultiLabelBinarizer как @VivekKumar предложил в этом комментарии

In [56]: from sklearn.preprocessing import MultiLabelBinarizer

In [57]: mlb = MultiLabelBinarizer()

In [58]: X = mlb.fit_transform(df.C)

In [59]: df = df.join(pd.DataFrame(X, columns=mlb.classes_))

In [60]: df
Out[60]:
   A      B                C  are  good  hello  we  world
0  2  Hello  [we, are, good]    1     1      0   1      0
1  1    All   [hello, world]    0     0      1   0      1
person MaxU    schedule 10.03.2017