Может ли нейросеть превзойти классические методы?

Выпущенная в 2019 году программа Google Research TabNet, как заявлено в препринте, превосходит существующие методы в отношении табличных данных. Как это работает и как это попробовать?

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

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

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

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

TabNet использует своего рода мягкий выбор функций, чтобы сосредоточиться только на функциях, которые важны для данного примера. Это достигается с помощью последовательного многоэтапного механизма принятия решений. То есть вводимая информация обрабатывается сверху вниз в несколько этапов. Как сказано в рукописи: «Идея нисходящего внимания в последовательной форме вдохновлена ​​ее приложениями для обработки визуальных и языковых данных, таких как визуальный ответ на вопросы (Hudson & Manning, 2018) или обучение с подкреплением (Mott et al., 2019) при поиске небольшого подмножества релевантной информации в многоразмерных входных данных. »

Строительные блоки для выполнения этого последовательного внимания называются трансформаторными блоками, хотя они немного отличаются от трансформаторов, используемых в популярных моделях НЛП, таких как BERT. Эти трансформеры используют самовнимание и стремятся смоделировать зависимости между разными словами в предложении. Используемый здесь тип преобразователя пытается шаг за шагом устранить те особенности, которые не имеют отношения к рассматриваемому примеру, с помощью мягкого выбора функций, который осуществляется с помощью функции sparsemax.

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

Одним из хороших свойств TabNet является то, что он не требует предварительной обработки функций (в отличие, например, от NODE). Еще одна проблема заключается в том, что в него встроена возможность интерпретации бесплатно в том смысле, что для каждого примера выбираются наиболее релевантные функции. Это означает, что вам не нужно применять внешний модуль объяснения, такой как shap или LIME.

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

Как я могу его использовать?

Дополнение от 2020-03-09:

Теперь существуют более совершенные интерфейсы для TabNet, чем описанный ниже: один для PyTorch, который имеет интерфейс, похожий на scikit-learn, и один для FastAI.

Исходный код TabNet и мои модификации

Как уже упоминалось, код доступен, и авторы показывают, как его использовать вместе с набором данных о типах лесного покрова. Чтобы облегчить это, они предоставили три файла для конкретных наборов данных: один файл, который загружает и подготавливает данные (download_prepare_covertype.py), другой, который определяет соответствующие столбцы функций Tensorflow и функцию ввода для чтения CSV (data_helper_covertype.py ), и файл, содержащий цикл обучения (Experiment_covertype.py).

README репо гласит:

Чтобы изменить эксперимент на другие наборы табличных данных:

- Подставьте файлы train.csv, val.csv и test.csv в каталог «data /»,

- Измените функцию data_helper с числовыми и категориальными характеристиками нового набора данных,

- Повторно оптимизировать гиперпараметры TabNet для нового набора данных.

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

Что касается пунктов README выше:

  1. Вместо того, чтобы создавать новые файлы train.csv, val.csv и test.csv для каждого набора данных, я предпочел прочитать весь набор данных и выполнить разделение в памяти (если, конечно, это возможно), поэтому я написал новая функция ввода для Pandas в моем коде.
  2. Для изменения файла data_helper.py может потребоваться небольшая работа, по крайней мере, на начальном этапе, когда вы не совсем уверены, что он делает и как должны определяться столбцы функций (это определенно было в случае со мной). Есть также много параметров, которые необходимо изменить, но которые находятся в основном файле цикла обучения, а не во вспомогательном файле данных. Ввиду этого я также попытался обобщить и упростить этот процесс в своем коде.
  3. Я добавил немного грубого кода для оптимизации гиперпараметров, но пока только для классификации.
  4. Также стоит упомянуть, что пример кода от авторов показывает только, как проводить классификацию, а не регрессию, так что дополнительный код также должен быть написан пользователем. Я добавил функцию регрессии с простой среднеквадратичной ошибкой потери.

Использование интерфейса командной строки

Выполните такую ​​команду, как:

python train_tabnet.py \
  --csv-path data/adult.csv \
  --target-name "<=50K" \
  --categorical-features workclass,education,marital.status,\
occupation,relationship,race,sex,native.country\
  --feature_dim 16 \
  --output_dim 16 \
  --batch-size 4096 \
  --virtual-batch-size 128 \
  --batch-momentum 0.98 \
  --gamma 1.5 \
  --n_steps 5 \
  --decay-every 2500 \
  --lambda-sparsity 0.0001 \
  --max-steps 7700

Обязательными параметрами являются — -csv-path (указывающий на расположение файла CSV), _ 2_ (имя столбца с целью прогнозирования) и--categorical-featues (разделенный запятыми список функций, которые следует рассматривать как категориальные). Остальные входные параметры - это гиперпараметры, которые необходимо оптимизировать для каждой конкретной задачи. Однако значения, показанные выше, взяты непосредственно из рукописи TabNet, поэтому они уже были оптимизированы авторами для набора данных Adult Census.

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

tensorboard --logdir tflog

и укажите в браузере localhost:6006.

Если у вас нет графического процессора…

… Вы можете попробовать эту коллаборационную тетрадь. Обратите внимание: если вы хотите просмотреть журналы Tensorboard, лучше всего, вероятно, создать корзину Google Storage и попросить скрипт записывать журналы туда. Это достигается с помощью параметра tb-log-location. Например. если бы ваша корзина называлась camembert-skyscrape, вы могли бы добавить--tb-log-location gs://camembert-skyscraper к вызову скрипта. (Однако обратите внимание, что вы должны правильно установить разрешения для корзины хранилища. Это может быть немного хлопотно.)

Затем вы можете указать tenorboard со своего локального компьютера на эту корзину:

tensorboard --logdir gs://camembert-skyscraper

Оптимизация гиперпараметров

Также существует быстрый скрипт для оптимизации гиперпараметров в репо (opt_tabnet.py). Опять же, пример приведен в Коллаборационной тетради. Скрипт пока работает только для классификации, и стоит отметить, что некоторые параметры обучения по-прежнему жестко запрограммированы, хотя на самом деле они не должны быть (например, параметр терпения для ранней остановки [сколько шагов вы продолжаете, пока лучше всего точность проверки не улучшается].)

В сценарии оптимизации меняются следующие параметры: N_steps, feature_dim, batch-momentum, gamma, lambda-sparsity. (output_dim устанавливается равным feature_dim, как предлагается в советах по оптимизации чуть ниже.)

В статье приведены следующие советы по оптимизации гиперпараметров:

Большинство наборов данных дают наилучшие результаты для N_steps ∈ [3, 10]. Как правило, для больших наборов данных и более сложных задач требуется больше N_steps. Очень высокое значение N_steps может страдать от переобучения и плохого обобщения.

Регулировка значений Nd [feature_dim] и Na [output_dim] является наиболее эффективным способом достижения компромисса между производительностью и сложностью. Nd = Na - разумный выбор для большинства наборов данных. Очень высокое значение Nd и Na может привести к переобучению и плохому обобщению.

Оптимальный выбор γ может иметь большое значение для общей производительности. Обычно большее значение N_steps способствует большему значению γ.

Большой размер пакета полезен для производительности - если позволяют ограничения памяти, рекомендуется до 1–10% от общего размера набора обучающих данных. Размер виртуального пакета обычно намного меньше размера пакета.

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

Полученные результаты

Я пробовал использовать TabNet через этот интерфейс командной строки для нескольких наборов данных, включая Набор данных переписи взрослых, который я использовал в сообщении о NODE и CatBoost по причинам, которые можно найти в этом сообщении. Удобно, что этот набор данных также использовался в рукописи TabNet, и авторы представляют лучшие настройки параметров, которые они там нашли. При повторных запусках с использованием этих настроек я заметил, что лучшая ошибка проверки (и ошибка теста), как правило, составляет около 86%, аналогично CatBoost без настройки гиперпараметров. Авторы сообщают о производительности тестового набора в рукописи 85,7%. Когда я выполнял оптимизацию гиперпараметров с помощью hyperopt, неудивительно, что я достиг аналогичной производительности около 86%, хотя и с другой настройкой параметров.

Для других наборов данных, таких как набор данных Poker Hand, TabNet, как утверждается, значительно превосходит другие методы. Я еще не уделял этому много времени, но каждый, конечно, приглашается попробовать TabNet с оптимизацией гиперпараметров на различных наборах данных для себя!

Выводы

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

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

Пожалуйста, попробуйте его на своих наборах данных и / или отправьте запросы на вытягивание и помогите мне улучшить интерфейс, если вам интересно!