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

Теоретическая проницательность

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

  • Возобновить просмотр
  • Системы рекомендаций
  • Ценообразование на продукцию

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

Fastai упростил анализ табличных данных с помощью нейронных сетей. В библиотеке fastai.tabular есть модуль, созданный исключительно для этой цели.

Практическое ноу-хау

Давайте импортируем библиотеку, как показано ниже:

from fastai.tabular import *

Помимо fastai, библиотека pandas удобна для анализа табличных данных. Pandas DataFrame - это стандартный формат табличных данных в Python.

Развернем данные. Данные доступны в виде одного из академических наборов данных fastai. А затем мы будем использовать панды для доступа к базе данных.

path = untar_data(URLs.ADULT_SAMPLE)
df = pd.read_csv(path/'adult.csv'); df

После того, как мы загрузили наши данные, нам нужно определить зависимую переменную, непрерывные переменные и категориальные переменные.

❓ Что подразумевается под зависимой переменной, непрерывными переменными и категориальными переменными

  • Зависимая переменная - переменная, значение которой мы должны найти, переменная, значение которой зависит от независимых переменных.
  • Непрерывные переменные - переменные, которые могут принимать любое значение.
  • Категориальные переменные - переменные, у которых есть определенный набор значений. Значения ограничены и представляют разные категории, такие как мужчина / женщина, вид транспорта и т. Д.
  • Для категориальных переменных мы будем использовать так называемые вложения. Что касается непрерывных переменных, их можно просто отправить в нейронную сеть, как пиксели в нейронную сеть.

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

  • FillMissing - он заполнит отсутствующие значения в наборе данных средним значением значений, присутствующих в столбце. Также может быть другой способ заполнить пустые значения.
  • Категоризация - преобразование категориальных переменных в категории, то есть в категории Pandas.
  • Нормализовать - наконец, нормализуйте наши данные, чтобы средние значения были равны 0, а стандартное отклонение - 1.

Давайте определим процессы, как указано выше, как показано ниже:

dep_var = 'salary'
cat_names = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race']
cont_names = ['age', 'fnlwgt', 'education-num']
procs = [FillMissing, Categorify, Normalize]

Создадим связку данных с помощью fastai data block API.

data = (TabularList
                   .from_df(df, path=path, cat_names=cat_names, cont_names=cont_names, procs=procs)
                   .split_by_idx(list(range(800,1000)))
                   .label_from_df(cols=dep_var)
                   .databunch())
  • В приведенном выше случае мы пытаемся создать табличный список в зависимости от типа ввода. Поскольку наш ввод находится в табличном формате, мы будем использовать TabularList для создания группы данных.
  • from_df - мы хотим получить список входов, определенных df как фрейм данных. Нам также необходимо определить наш путь, в котором определены наши данные. Наряду с этим нам нужно определить категориальные и непрерывные переменные. Наконец, нам нужно передать процессы и для наших данных.
  • split_by_idx - мы хотим извлечь 200 строк из данных в наш набор данных для проверки.
  • label_from_df - мы хотим пометить наши данные с помощью зависимой переменной.

Если вы хотите увидеть пакет данных:

data.show_batch(rows=10)

Ученик

Для набора табличных данных у нас есть табличный обучающийся.

learn = tabular_learner(data, layers=[200,100], metrics=accuracy)
learn.fit(5, 1e-2)

layers= - здесь мы определяем нашу архитектуру точно так же, как когда мы выбрали ResNet 34 или что-то еще для сверточных сетей. Это относится к размерам скрытых полностью связанных слоев между входом (после встраивания) и перед слоем классификации. Количество скрытых слоев определяет длину списка.

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

Выводы

row = df.iloc[801]
df.iloc[801]

learn.predict(row)

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