Categories: Python

Сериализация объектов в Python

Всем доброго времени суток! Сегодня многие умеют создавать свои модели машинного обучения с помощью таких библиотек как TensorFlow, Keras или SkLearn. И эти модели имеют хорошую обобщающую способность! Однако как нам сохранить наши результаты, не обучать ведь модель каждый раз при запуске программы (некоторые модели обучаются по несколько дней даже на видеокартах)? К нам на помощь приходит сериализация (или «консервация«) объектов.

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

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

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

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

Построение задачи

Перед нами стоит задача — сохранить данные из датасета «Ирис» в обычный текстовый документ и в .csv файл (сам датасет предоставит нам sklearn), а также сохранить все параметры модели в json и pickle файлы.

Начало работы

Сегодня в качестве среды разработки я буду использовать IntelJ IDEA со стандартным расширением для Python от JetBrains.

Импортируем все модули:

Согласно РЕР8, в начале файла мы импортируем только модули стандартной библиотеки. NumPy, Pandas и SkLearn вам придется установить с помощью пакетного менеджера pip/pip3.

Из подмодуля sklearn.datasets мы импортируем сам датасет, функцию разделения тренировочные/тестовые данные, а также сам класс модели логистической регрессии.

Различные инструменты сериализации

Начнём работу с составления таблицы DataFrame, предварительно «выгрузив» данные в объект Python.

Мы провели работу над заголовками, а также метками классов в наборе. С помощью атрибута values, мы указываем переменной data ссылку на np.dnarray, который является двухмерным. Также сохраним форму массива с помощью поля shape, ведь NumPy записывает массив в файл как одномерный.

Примечание. Вам не обязательно открывать файл с помощью конструкции with/as, можно просто оставить путь к файлу в виде строки.

Сериализация NumPy

Загрузка массива в текстовый файл осуществляется с помощью метода np.ndarray.tolist().

Мы можем указать разделитель (sep), именно указанный символ будет разделять числа в текстовом формате (обычно используется запятая).

Чтение из файла осуществляется немного иначе. Используется функция fromfile(), которая принимает такие же аргументы. В конце меняем размерность массива на необходимую.

Сам текстовый файл будет выглядеть так:

Сериализация Pandas

Как не удивительно, pandas использует очень схожий интерфейс, однако с чуть более расширенным функционалом. Записью в файл занимается метод pd.DataFrame.to_csv(), а чтением функция pd.read_csv().

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

В Excel часть документа выглядит так:

Немного машинного обучения

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

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

Как вы могли заметить, мы использовали метод get_params(), чтобы получить полный словарь параметров модели. Советую реализовывать такое в своих классах, это очень удобно.

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

Сериализация JSON

JSON (JavaScript Object Notation) — формат хранения информации, основанный на JavaScript. Легко читается людьми, т.к. представляет собой «обычный» словарь.

Модуль json стандартной библиотеки Python очень обширный, но сейчас нам необходимы только две его функции: load и dump.

Ссылка на официальную документацию присутствует.

Также изначально я затруднился в указании сепараторов в функции dump (а именно неправильно указал их порядок). Сначала запятая, потом двоеточие :).

Первые четыре строки полученного файла:

Здесь мы заново обучаем модель, ведь не сохраняли веса модели, иначе мы бы избавились от обучения модели.

Проверка модели после сериализации JSON

Тут всё просто: создаём новую модель, загружаем в неё параметры и сравниваем правильность на тестовом наборе. Чтобы загрузить параметры в модель, используем метод set_params().

Как мы могли заметить, я не использую функцию print, и даже здесь в качестве теста использовать assertion. Делаю это я для того, чтобы дать вам возможность самостоятельно провести отладку кода и разобраться с «подводными камнями».

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

Сериализация Pickle

Pickle — тоже пакет стандартной библиотеки, на что указывает очень похожий на json интерфейс.

Обратите внимание, используя открытие файла через open(), необходимо указать бинарный режим (‘wb’ / ‘rb’).

Проверка модели

Здесь всё то же самое:

В конце добавим вывод «радостного» сообщения, что скажет нам о удачном завершении сценария.

Заключение

Сериализация объектов — очень важная штука в машинном обучении. Сегодня мы разобрали сохранение массивов NumPy, таблиц Pandas, а также параметров модели с помощью json и pickle. Как мы обнаружили, даже стандартная библиотека Python даёт много возможностей в этом плане.

Ссылочка на исходный код здесь.

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

shwan @shwanoff

Программист .NET

Recent Posts

  • Python
  • Нейронные сети

Анализ настроения с помощью Keras и Python

Добрый день, уважаемые читатели. Сегодня мы реализуем анализ настроения, а именно определим, является ли комментарий на русском языке "токсичным". Мы…

16 часов ago
  • Python
  • Нейронные сети

Ансамбль с мажоритарным голосованием на Python

Добрый день, уважаемые читатели! Мы продолжаем экспериментировать с объединением моделей sklearn ради большей обобщающей способности. Сегодня мы реализуем ансамбль с…

6 дней ago
  • Python
  • Нейронные сети

Пошаговый классификатор на Python

Добрый день, уважаемые читатели! Темой нашей сегодняшней статьи стал пошаговый классификатор, реализованный на чистом Python, использующий в качестве основы модель…

1 неделя ago
  • Python
  • Нейронные сети

Нейросеть за пять минут! Is it real?!

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

2 недели ago
  • Информационная безопасность и хакинг

Как хакеры с помощью вашего IP, взламывают компьютер? Как избежать сканирование портов?

Мы рассмотрим что такое сканирование портов и как избежать подобной атаки. Ваш IP (англ. Internet Protocol — межсетевой протокол) является вашим…

2 недели ago
  • C#

Публикация .NET Core приложение? Настройка Docker на VPS

Давай представим ситуацию, ты создал крутое веб-приложение, которое должно перевернуть всю IT-индустрию с ног на голову. Но никто не сможет…

3 недели ago