Есть какие-нибудь мысли о том, как бы вы использовали приведенные ниже «полуфиксированные» категориальные признаки в предикативной модели?

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

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

В исходном наборе данных довольно много категориальных переменных, каждая из которых содержит более 50 уникальных значений:

Все эти переменные имеют одинаковый формат: система нумерации плюс текстовое описание. Высокая кардинальность является очевидной проблемой для One-Hot Encoding, поскольку каждая из этих категорий стала бы новым собственным столбцом, значительно увеличивая размерность.

И, несмотря на «уникальность» внешнего вида, лежащие в основе контексты детализированы, а временами двусмысленны и запутанны: например, инцидент с грузовиком может одновременно квалифицироваться как 901 — Автомобиль, 837 — Транспортные средства или запчасти к ним, и произвольно либо 902 — Маленький грузовик или 903 — Большой грузовик.

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

Теперь давайте подробнее рассмотрим некоторые примеры:

Как видно из выделенного текста, объединение этих переменных на самом деле дает четкое повествование, которое отличает первые три инцидента (пожар в доме) от двух последних (пожар, связанный с автомобилем). Такой подход к семантической характеристике текстовых документов на основе встроенных шаблонов слов и фраз известен как тематическое моделирование.

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

После загрузки набора обучающих данных первым шагом будет объединение этих пяти переменных и создание «списка списков» в качестве нового столбца «raw_text»:

Далее необходимая предварительная обработка:

  • удалите лишнее (например, нумерацию, знаки препинания, символы, стоп-слова) и лемматизируйте:

  • стандартизировать выбор слов для синонимов или текстов, семантически близких:

Как только мы применяем эти шаги предварительной обработки к «raw_text», вывод сохраняется в новом столбце с именем «clean_text». Вот топ-20 самых частых слов:

Большой! Теперь мы готовы к тематическому моделированию.

Мы будем использовать библиотеку Gensim (сокращение от Generate Similar) и один из методов под названием Скрытое распределение Дирихле (LDA). ), который описан согласно Википедии:

«Наблюдения (например, слова) собираются в документы, и присутствие каждого слова относится к одной из тем документа. Каждый документ будет содержать небольшое количество тем»

Проще говоря, основными входными данными для модели LDA являются:

  1. Словарь: он создается путем токенизации каждого документа, т.е. «clean_text», подготовленный на предыдущих шагах, где каждому слову присваивается уникальный идентификатор, передаваемый в качестве ключа к словарю:

Например, id = 0 возвращает слово «потолок».

2. Корпус: doc2bow используется для расчета частотности каждого слова. Окончательный корпус будет представлять каждое слово в виде пары (word_id, word_frequency). Например, первый инцидент выглядел загадочно, например:

Наконец, мы можем обучить модель LDA с заданным количеством тем (в данном случае мы попробовали ее с тремя темами):

С помощью print_topics() мы можем взглянуть на то, что влечет за собой каждая из этих тем. Например, пять наиболее частых слов, которые связаны с первой темой, это: «мусор», «склад», «комната», «желоб», «промышленность», а слово «мусор» является самым важным вкладчиком в эту тему. тема с весом 0,35.

Напомним, что в LDA каждый документ представляет собой набор этих трех тем:

Теперь вместо пяти переменных высокой мощности у нас осталось всего три вектора: t0, t1, t2, каждый из которых представляет вероятность инцидента, относящегося к одной из трех тем:

Как вам наши переработанные функции?