Кодировать категориальные функции с несколькими категориями для каждого примера - sklearn - PullRequest
0 голосов
/ 29 сентября 2018

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

Данные выглядят так:

    movieId                                         genres
0        1  [Adventure, Animation, Children, Comedy, Fantasy]
1        2                     [Adventure, Children, Fantasy]
2        3                                  [Comedy, Romance]
3        4                           [Comedy, Drama, Romance]
4        5                                           [Comedy]

Я хочу векторизовать эту функцию.Я пробовал LabelEncoder и OneHotEncoder , но они не могут обрабатывать эти списки напрямую.

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

Есть ли способ заставить эти классы кодировщика работать с такой функцией?Или есть лучший способ представить такую ​​функцию, которая облегчит кодирование?Я с удовольствием приветствую любые предложения.

1 Ответ

0 голосов
/ 29 сентября 2018

Этот вопрос SO имеет несколько впечатляющих ответов.На данных вашего примера последний ответ от Teoretic (с использованием sklearn.preprocessing.MultiLabelBinarizer) в 14 раз быстрее, чем решение Пауло Алвеса (и оба быстрее, чем принятый ответ!):

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
encoded = pd.DataFrame(mlb.fit_transform(df['genres']), columns=mlb.classes_, index=df.index)
result = pd.concat([df['movieId'], encoded], axis=1)

# Increase max columns to print the entire resulting DataFrame
pd.options.display.max_columns = 50
result
   movieId  Adventure  Animation  Children  Comedy  Drama  Fantasy  Romance
0        1          1          1         1       1      0        1        0
1        2          1          0         1       0      0        1        0
2        3          0          0         0       1      0        0        1
3        4          0          0         0       1      1        0        1
4        5          0          0         0       1      0        0        0
...