Добрый день, уважаемые читатели. Сатирический заголовок говорит о том, что сегодняшней темой станут нейронные сети, а точнее «алгоритм» их обучения. Ведь обучить нейросеть не значит создать класс модели и вызвать метод fit (sklearn) или заполнить её слоями (keras). Это значит предобработать данные, подобрать гиперпараметры, сохранить её для дальнейшего использования и многое другое. Сегодня мы и сделаем это, исключив подбор гиперпараметров модели, это я доверяю вам, чтобы добавить интерактива.

Будет полезным:

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.

А на моем YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!

Импорт

В качестве примера мы будем использовать обычную реализацию нейросети из sklearn.

Команды для установки пакетов:

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

Предобработка (preprocessing) данных

Загрузим данные с помощью pandas, в частности функции read_csv.

Нам необходимо получше «узнать» датасет, чтобы продолжить с ним работу. В этом нам поможет профилирование.

Мы создали отчет по нашей таблице и загрузили его в отдельный файл. Не буду раскрывать карты и демонстрировать, что находится в нём, но могу сказать, что вы будете приятно удивлены, если ранее не сталкивались с pandas_profiling.

У нас довольно много категориальных данных, которые мы будем кодировать с помощью One-Hot encoding.

Однако столбец education-num является кодированием меток из столбца education, потому он нам не нужен.

Также нам необходимо закодировать наш target — столбец salary. Для этого воспользуемся методом map класса Series. Он принимает словарь типа:

<value : coding>

Метод возвращает новый объект Series, потому следующая наша команда выглядит так:

По привычке, в качестве Out в Jupyter Notebook я выдаю первые 5 строк таблицы, дабы посмотреть, корректно ли сработала та или иная конструкция.

Далее нам необходимо закодировать категориальные переменные. Мы не будем делать это вручную: за нас это сделает функция get_dummies из библиотеки pandas.

Итого у нас получилось 108 столбцов — не так много, как могло казаться ранее. Теперь проверим информацию о таблице, чтобы точно убедиться, что всё верно.

Отлично, мы имеем все столбцы в числовом виде, однако это ещё не всё.

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

Отделим нашу цель и образцы из общего набора:

Теперь же разделим данные на тренировочные и тестовые с помощью train_test_split:

26 тысячи тренировочных образцов мы получили в итоге. Теперь начнём создавать наш классификатор.

Нейросеть (neural network)

100 скрытых слоёв, сигмоидальная функция активации, штраф L2-регуляризации в 0.0001, перемешивание и т.д. указываем при создании экземпляра класса. Далее обучаем модель:

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

Недавно от меня была статья про консервацию объектов Python с помощью pickle и json. Однако сегодня мы будем использовать joblib — подмодуль sklearn для сохранения модели в бинарный файл и её загрузки в объект Python.

Программный интерфейс joblib, который нам необходим, такой же, как и у pickle:

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

Отлично, всё сходится.

Заключение

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

Документ .ipynb для полного его разбора вы можете найти здесь.

Также рекомендую прочитать статью Начальные функции NumPy. Подпишитесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для разработчиков.