Использование глубокого обучения для табличных данных

В этом блоге я расскажу вам, как создать встраивание категориальных переменных с использованием сети глубокого обучения поверх keras. Первоначально эта концепция была представлена ​​Джереми Ховардом в его курсе fastai. Пожалуйста, перейдите по ссылке для более подробной информации.

Традиционное вложение

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

  1. Непрерывные переменные. Обычно это целые или десятичные числа, которые имеют бесконечное количество возможных значений, например Блоки памяти компьютера, например 1 ГБ, 2 ГБ и т. Д.
  2. Категориальные переменные. Это дискретные переменные, которые используются для разделения данных на основе определенных характеристик. например Типы компьютерной памяти, то есть RAM-память, внутренний жесткий диск, внешний жесткий диск и т. Д.

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

Быстрое кодирование: здесь мы преобразуем значение каждой категории в новый столбец и присваиваем и присваиваем столбцу значение 1 или 0 (Истина / Ложь).

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

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

Данные

Чтобы продемонстрировать применение глубокого встраивания, возьмем пример данных велопроката от Kaggle. Также здесь ссылка на репозиторий git.

Как мы видим, в наборе данных есть несколько столбцов. Чтобы продемонстрировать эту концепцию, мы будем использовать только столбцы date_dt, cnt и mnth из данных .

Традиционное быстрое кодирование приводит к появлению 12 столбцов, по одному каждого месяца. Однако в этом типе встраивания равное значение придается каждому дню недели, и нет никакой связи между каждым из месяцев.

На графике ниже мы можем увидеть сезонную структуру каждого месяца. Как мы видим, месяцы с 4 по 9 являются пиковыми. Месяцы 0, 1, 10,11 - это месяцы низкого спроса на прокат велосипедов.

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

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

Глубокое кодирование

Код показан ниже. Мы построим сеть персептронов с плотной сетью слоев и функцией активации relu.

В качестве входных данных для сети, то есть переменной «x», используется номер месяца. Это числовое представление каждого месяца в году в диапазоне от 0 до 11. Следовательно, input_dim установлено на 12.

Выходные данные для сети, т. Е. «y», представляют собой масштабированный столбец «cnt». Однако «y» можно увеличить, чтобы включить другие непрерывные переменные. Здесь, поскольку мы используем одну непрерывную переменную, мы установим последнее число выходного плотного слоя равным 1. Мы обучим модель 50 итерациям или эпохам.

embedding_size = 3
model = models.Sequential()
model.add(Embedding(input_dim = 12, output_dim = embedding_size, input_length = 1, name="embedding"))
model.add(Flatten())
model.add(Dense(50, activation="relu"))
model.add(Dense(15, activation="relu"))
model.add(Dense(1))
model.compile(loss = "mse", optimizer = "adam", metrics=["accuracy"])
model.fit(x = data_small_df['mnth'].as_matrix(), y=data_small_df['cnt_Scaled'].as_matrix() , epochs = 50, batch_size = 4)

Параметры сети

Уровень внедрения: Здесь мы указываем размер встраивания для нашей категориальной переменной. Я использовал 3, в этом случае , если бы мы увеличили это значение, это позволит получить более подробную информацию о взаимосвязи между категориальными переменными. Джереми Ховард предлагает следующее решение для выбора размеров вложения:

# m is the no of categories per feature
embedding_size = min(50, m+1/ 2)

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

Результаты

Окончательные результирующие вложения для каждого месяца выглядят следующим образом. Здесь «0» означает январь, а «11» - декабрь.

Когда мы визуализируем это с помощью трехмерного графика, мы можем видеть четкую взаимосвязь между месяцами. Месяцы с похожими «cnt» сгруппированы ближе друг к другу, например месяцев с 4 по 9 очень похожи друг на друга.

Заключение

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

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