Это быстрый и полный пост о том, как нейронные сети вписываются в табличные данные. Я использую библиотеку 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)
Всегда есть место для дополнительных исследований, и нейронные сети для табличных данных - очень большой источник исследований. Но по сути это то, как мы используем нейронные сети для табличных данных.