ColumnTransformer встречает обработку естественного языка

Как объединить несколько механизмов извлечения признаков или преобразований в один преобразователь в конвейере scikit-learn

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

Поэтому я решил написать пост на примере ответа на этот вопрос.

Существует несколько различных методов добавления или комбинирования различных типов объектов. Один из методов использует scipy.sparse.hstack, который укладывает разреженные матрицы по горизонтали.

Тем не менее, я представлю один метод, новый горячий ребенок в блоке: функцию ColumnTransformer из sklearn. Если вы хотите попробовать, вам нужно будет обновить свой sklearn до 0.20.

Данные

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

Наши данные содержат разнородные типы данных, это числовые, категориальные и текстовые данные. Мы хотим использовать разные этапы предварительной обработки и преобразования для этих разных типов столбцов.

Например: мы можем захотеть сразу закодировать категориальные функции и tfidfvectorize текстовые функции.

«Цена» - это целевая характеристика, которую мы будем прогнозировать.

Дата Предварительная обработка

Целевая функция - цена

df.price.describe()

  • Удалите price = 0 и исследуйте его распределение.

Целевая цена функции искажена вправо. Как линейные модели, подобные нормально распределенным данным, мы преобразуем цену и сделаем ее более нормально распределенной.

df["price"] = np.log1p(df["price"])

Разработка функций

  • Заполните отсутствующее «имя_категории» словом «другое» и преобразуйте «имя_категории» в тип данных категории.
  • Заполните отсутствующее «brand_name» словом «unknown».
  • Определите популярные бренды, а остальные установите как «прочие».
  • Заполните отсутствующее «item_description» значением «None».
  • Преобразуйте «item_description_id» в тип данных категории.
  • Преобразуйте «brand_name» в тип данных категории.

Наши особенности и цель:

target = df.price.values
features = df[['name', 'item_condition_id', 'category_name', 'brand_name', 'shipping', 'item_description']].copy()

Разделите данные на обучающий и тестовый наборы:

X_train, X_test, y_train, y_test = train_test_split(features, target, test_size = 0.2, random_state=0)

Ниже описано, как применять ColumnTransformer. На удивление все очень просто.

  • Закодируйте «item_condition_id» и «brand_name».
  • CountVectorizer «имя_категории» и «имя».
  • TfidfVectorizer «item_description».
  • Мы можем сохранить оставшуюся функцию «доставка», установив remainder='passthrough'. Значения добавляются в конец преобразования:

Модель и оценка

Мы объединим этот шаг предварительной обработки на основе ColumnTransformer с регрессией в конвейере для прогнозирования цены.

Блокнот Jupyter можно найти на Github. Наслаждайтесь остатком недели!

Использованная литература: