Кодирование категориальных данных из массивов n-длины разных категорий в Python - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время я только начинаю понимать машинное обучение (я веб-программист, пытающийся повышать свою квалификацию) и столкнулся с проблемой, основанной на наборе данных, предоставленном Kaggle.

Это был набор данных, в котором каждая особенность содержала 1..n ярлыки, описывающие ингредиенты блюда и целевое поле, из которого приготовлена ​​еда.

Ingredients {ArrayOf<string>} | Cuisine {string}
[Tomato, Spaghetti, Beef, Basil, Oregano] | Italian
[Coriander Seeds, Cumin, Paprika, Chicken, Garlic, Ginger] | Indian
[Beef, Onion] | French

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

Я хочу знать, есть ли у меня правильная теория в моем подходе в

  • итерация по каждому элементу кадра данных при предварительной обработке
  • получение всех ингредиентов и добавление их в набор
  • Для каждого ингредиента добавьте новый столбец к фрейму данных, названному для ингредиента
  • Итерация по каждой функции и на основе каждого ингредиента установка следующего столбца в 1 или 0 (то есть установка столбца «Говядина» в 1)
  • Обучение модели на основе преобразованного набора данных

Хотя это может работать в минуту, это может быть не масштабируемым, поскольку у меня в настоящее время есть 10 000 уникальных ингредиентов, и в будущем я буду испытывать еще десятки тысяч.

Я на правильном пути со своими мыслями и должен ли я принимать какие-либо соображения относительно расширения функций в будущем? и есть ли какие-либо встроенные функции, которые поддерживают то, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 01 ноября 2018

Использование:

vocab = set(j for i in df['Ingredients'] for j in i) 

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(vocabulary=vocab, analyzer=lambda x: x)

X = cv.fit_transform(df['Ingredients'])

Если вы загрузите столбец Ingredients {ArrayOf<string>} как text, вам придется преобразовать в список с помощью -

df['Ingredients'] = df['Ingredients {ArrayOf<string>} '].apply(lambda x: [i.strip() for i in x.replace('[','').replace(']','').split(',')])

выход

X будет вашей входной матрицей -

X.todense()

matrix([[1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
        [0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]], dtype=int64)

Для словарного запаса -

cv.get_feature_names()

['Basil',
 'Beef',
 'Chicken',
 'Coriander Seeds',
 'Cumin',
 'Garlic',
 'Ginger',
 'Onion',
 'Oregano',
 'Paprika',
 'Spaghetti',
 'Tomato']
...