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

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


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

Сегодня мы разберём запись и считывание массивов в текстовые файлы, работу с .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 даёт много возможностей в этом плане.

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




Report Page