Всем доброго времени суток! Сегодня многие умеют создавать свои модели машинного обучения с помощью таких библиотек как 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-канал. Там еще больше полезного и интересного для разработчиков.