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

Согласно статье Ченг Го и Феликса Беркхана Внедрение категориальных переменных в объекты, «встраивание, полученное из обученных нейронных сетей, значительно повышает производительность всех протестированных методов машинного обучения при использовании вместо этого в качестве входной функции. ” По сути, они обнаружили, что обученные матрицы встраивания можно использовать в качестве входных данных для других моделей, чтобы улучшить их производительность по сравнению с обучением на самих входных данных. Результаты их статьи показаны ниже на рисунке 1, где точность относится к сравнению прогнозируемого значения модели, а переменная проверки (с EE) относится к подходу внедрения объекта.

На данный момент я попытаюсь воспроизвести его с помощью собственного набора данных, проанализировав данные по оттоку из последнего конкурса Financial Data Challenge 2022. Код для обучения внедрению матриц можно найти на моем GitHub.

Встраивание объекта

Вложение — это подход к обработке категориальных переменных. Это похоже на однократное кодирование, когда набор табличных данных столбца «Пол», состоящий из таких категорий, как «мужской» и «женский», в виде строки будет преобразован в два столбца с тем же именем, что и «1», если row -item указывает на утвердительный ответ и '0' в противном случае. С другой стороны, подход встраивания будет представлять каждую категорию как вектор с действительным знаком, кодирующий значение слова таким образом, что похожие слова будут ближе друг к другу в векторном пространстве. Это определение делает его более сложным, чем оно есть на самом деле; для меня это помогает понять, как это выглядит на самом деле. Вы можете представить себе матрицу встраивания, имеющую те же строки с разным количеством категорий и столбцы, для которых задано почти любое число, которое вы хотите (больше столбцов означает более высокую сложность и потенциал для изучения дополнительных скрытых факторов из вашего пространства слов), и строки матрицы это вектор, представляющий определенную категорию. Для этого примера см. рис. 2 ниже; он показывает, как выглядит столбец, если мы выражаем его в формате горячего кодирования или в виде встраивания.

Матрица встраивания в этом примере будет иметь форму 2 x N. Для этого проекта мы выбираем N, используя эмпирическое правило, определенное пакетом FastAI, N ​​= min(600, round(1,6 * категории⁰,56).

Слои внедрения широко используются, особенно при встраивании слов. Самым популярным примером, вероятно, является Word2vec, представляющий собой просто сеть уровня 2, которая использует уровень внедрения для преобразования слов в числовой формат, который можно использовать в качестве входных данных для новых сетей. Таким образом, хотя в большинстве онлайн-учебников и документов встраивание слоев упоминается в связи с обработкой текста, это не единственная область, где их можно использовать. С помощью этого мощного метода можно закодировать почти любую категориальную переменную.

Различие между подходом One Hot Encoding и Entity Embedded в категориальных переменных

В этом разделе я расскажу вам о том, что вам нужно знать на практике о различиях между двумя слоями.

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

  1. Уменьшен размер ввода

Поскольку слои внедрения чаще всего используются при обработке текста, давайте возьмем предложение в качестве конкретного примера:

"Я такой, какой я есть"

Давайте сначала целочисленно закодируем ввод

Плотный слой требует, чтобы ввод был строго числовым. Таким образом, нам нужно выполнить однократное кодирование:

Обратите внимание, что 1-е измерение этой матрицы представляет собой длину предложения, а 2-е измерение представляет собой количество уникальных слов в нашем Корпусе. Вместо этого слой Embedding принимает первый вход, вектор в целочисленной кодировке, который намного меньше. Для этого примера мы представили, что Корпус состоит только из 3 слов, которые появляются в нашем предложении: «я», «есть», «кто». Однако в реальных сценариях корпусом будет весь английский словарь, состоящий примерно из 180 000 слов! Представьте, что вам нужно хранить в памяти 180 000 длинных векторов для каждого отдельного экземпляра в нашем наборе данных, 99% которых будут состоять из нулей, которые не влияют на конечный результат!

2. Сниженная вычислительная сложность

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

Однако на слое встраивания отсутствуют некоторые параметры, которые можно обучить, а именно функции смещения и активации.

Можете ли вы использовать слой Embedding для кодирования числовых функций? Нет, это не имеет смысла. Если преимущество слоя Embedding состоит в том, что он позволяет пропустить этап горячего кодирования, становится ясно, что нам не нужен слой Embedding, когда сразу не нужно кодирование one-hot! Поэтому, если ваш набор данных включает в себя набор многомерных категориальных переменных и одну из числовых переменных, вы должны использовать слой Embedding для кодирования первого и слой Dense для кодирования второго. Затем их можно объединить и передать на следующий уровень.

Как это работает?

Все началось со сборки нашего объекта TabularPandas:

df = pd.read_csv(path/'.csv')
cont_nn,cat_nn = cont_cat_split(df, max_card=9000, dep_var='y')
procs = [Categorify, FillMissing, Normalize]
y_names = 'y'
y_block = CategoryBlock()
splits = RandomSplitter()(range_of(df))
to = TabularPandas(df, procs=procs, cat_names=cat_names, cont_names=cont_names,y_names=y_names, y_block=y_block, splits=splits)
dls = to.dataloaders()

Стохастический градиентный спуск точно подберет значения комбинации в нашей матрице. В коде вы увидите, что это довольно просто, поскольку мы позволяем tabular_learnner FastAI строить и обучать нашу нейронную сеть для нас:

learn = tabular_learner(dls, y_range=(8,12), layers=[500,250], n_out=1, loss_func=F.mse_loss)learn.fit_one_cycle(5, 1e-2)

И затем мы можем просто получить доступ к матрицам встраивания от учащегося, как показано ниже, где emb_idx выбирает вложение конкретных категориальных переменных, а атрибут веса получает доступ к тензору:

learn.model.embeds[emb_idx].weight

Создание набора данных для встраивания объектов

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

Сравнительный вывод категориальных данных с разными подходами: одно горячее кодирование / фиктивная переменная и встраивание сущностей.

Набор данных дисбаланса

После разработки набора данных мы определяем стратегию передискретизации с помощью:

oversample = RandomOverSampler(sampling_strategy='minority')

В случаях с набором данных Churn мы должны применять стратегию передискретизации, чтобы справиться с состоянием дисбаланса данных.

Тестирование различных моделей

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

Как мы видим, в некоторых случаях тестируемый набор данных внедрения сущности способствует повышению точности.

Заключение

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

Дальнейший шаг

  1. Анализ важности функции
  2. Генетическая селекция резюме
  3. Резервные функции
  4. Частичная зависимость
  5. Интерпретатор дерева

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

  1. https://medium.com/analytics-vidhya/neural-network-entity-embeddings-as-model-inputs-5b5f635af313
  2. https://towardsdatascience.com/churn-prediction-using-neural-networks-and-ml-models-c817aadb7057
  3. https://walkwithfastai.com/Ensembling
  4. Ченг Го, Феликс Берхан. Вложения сущностей категориальных переменных. 22 апреля 2016 г. https://doi.org/10.48550/arXiv.1604.06737
  5. https://andriyan-saputra78.medium.com/churn-analysis-with-feature-extraction-genetic-algorithm-988645d9f343
  6. https://docs.fast.ai/tabular.data.html

Заключительное замечание

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

  • * Пожалуйста, рассмотрите возможность связаться с писателем, используя контактную информацию в профиле. Я хотел бы обсудить и поделиться более подробно о теме. Спасибо.

С наилучшими пожеланиями,

Андриян Сапутра