Советы по глубокому обучению (2): как сохранить и восстановить модель, обученную scikit-learn

глубокое обучение

Советы по глубокому обучению (1): как сохранять и восстанавливать обученные модели TensorFlow

Во многих случаях с помощьюнаучное обучениеВ то же время, что и библиотека, вам нужно сохранять прогностические модели в файл, а затем восстанавливать их при использовании, чтобы вы могли повторно использовать свою предыдущую работу. Например, протестируйте модель на новых данных и сравните плюсы и минусы нескольких моделей. Этот процесс сохранения также известен как сериализация объекта — представление объекта потоком байтов, чтобы его можно было сохранить на диске, отправить по сети или сохранить в базу данных, а процесс его восстановления называется десериализацией. В этой статье мы рассмотрим три возможных подхода в Python и scikit-learn, каждый со своими преимуществами и недостатками.

1.Инструменты для сохранения и восстановления моделей

Первый инструмент, который мы представляем, этоPickle, стандартный инструмент Python для (де)сериализации объектов. После этого мы представимJoblibбиблиотека, которая предоставляет простые методы (де)сериализации для объектов, содержащих большие массивы данных, и, наконец, мы представляем ручной метод сохранения и восстановленияJSONОбъект (обозначение объекта JavaScript). Ни один из этих подходов не является лучшим решением, но правильный можно выбрать в зависимости от потребностей проекта.

2.Инициализация модели

Во-первых, мы собираемся создать модель scikit-learn. В нашем примере мы будем использоватьЛогистическая регрессиямодель иНабор данных ириса. Мы импортируем необходимые библиотеки, загружаем данные и разбиваем их на обучающие и тестовые наборы.


Теперь давайте создадим модель с некоторыми параметрами, отличными от значений по умолчанию, и «накормим» ее обучающими данными. Мы предполагаем, что вы предварительно нашли оптимальные параметры модели, параметры, дающие наибольшую точность оценки.


Вот наша результирующая модель:


Используя метод подгонки, модель изучила коэффициенты, хранящиеся в model.coef_. Цель состоит в том, чтобы сохранить параметры и коэффициенты модели в файл, чтобы вам не нужно было снова повторять этапы обучения модели и оптимизации параметров на новых данных.

3.Pickleмодуль

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


Запуск этого кода должен дать ваши оценки прогноза и сохранить модель через Pickle:


Преимущество использования Pickle для сохранения и восстановления изученных моделей заключается в том, что это быстро, и вы можете сделать это в две строки кода. Это полезно, если вы уже оптимизировали параметры модели на обучающих данных, поэтому вам не нужно повторять этот шаг. В любом случае, он не сохраняет результаты тестов и какие-либо данные. Но по-прежнему можно сохранить кортеж или список из нескольких объектов (и запомнить, где какой объект находится) следующим образом:


3.Joblibмодуль

Библиотека Joblib предназначена в качестве альтернативы Pickle для объектов, содержащих большие данные. Мы повторим тот же процесс сохранения и восстановления, что и с Pickle.


Как видно из примеров, библиотека Joblib обеспечивает более простой рабочий процесс по сравнению с Pickle. В то время как Pickle требует передачи файлового объекта в качестве аргумента, Joblib может использоваться с файловыми объектами и строковыми именами файлов. Если ваша модель содержит много данных, каждый массив будет храниться в отдельном файле, но общий процесс сохранения и восстановления останется прежним. Joblib также позволяет использовать различные методы сжатия, такие как «zlib», «gzip», «bz2» и различные уровни сжатия.

4.Вручную сохранить и восстановить в JSON

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

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

Поскольку мы хотим хранить все эти данные в одном объекте, одним из возможных подходов является создание нового класса LogisticRegression, который наследует класс модели в нашем примере. Этот новый класс вызывается MyLogReg, а затем реализует методы save_json и load_json соответственно для сохранения и восстановления файлов JSON.

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


Теперь давайте попробуем MyLogReg. Сначала мы создаем объект mylogreg, передаем ему обучающие данные и сохраняем их в файл. Затем мы создаем новый объект json_mylogreg и вызываем метод load_json для загрузки данных из файла.


Распечатав новый объект, мы можем просмотреть наши параметры и данные обучения по мере необходимости.


Поскольку сериализация данных с помощью JSON фактически сохраняет объект в формате строки, а не потока байтов, файл mylogreg.json можно открыть и изменить с помощью текстового редактора. Хотя этот метод удобен для разработчиков, он менее безопасен, поскольку злоумышленники могут просматривать и изменять содержимое файла JSON. Кроме того, этот подход больше подходит для объектов с небольшим количеством переменных экземпляра, таких как модели scikit-learn, поскольку любое добавление новых переменных требует изменений в методах сохранения и восстановления.

5.Проблемы совместимости

Хотя до сих пор были представлены преимущества и недостатки каждого инструмента, самым большим недостатком инструментов Pickle и Joblib, вероятно, является их совместимость с различными моделями версий Python.

5.1: совместимость версии Python- В документации к обоим инструментам указано, что сериализация объектов между разными версиями Python не рекомендуется (de), хотя это может работать при низкоуровневых изменениях версий.

5.2: Совместимость моделей— Одна из самых распространенных ошибок — сохранение модели с помощью Pickle или Joblib и последующее изменение модели перед попыткой восстановления из файла. Внутренняя структура модели должна оставаться неизменной между сохранениями и перезагрузками.

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

6.в заключении

В этом посте мы опишем три инструмента для сохранения и восстановления моделей scikit-learn. Библиотеки Pickle и Joblib быстры и просты в использовании, но в разных версиях Python есть проблемы с совместимостью и изменения в моделях обучения. С другой стороны, ручной метод более сложен в реализации и требует модификации при любом изменении структуры модели, но, с другой стороны, его можно легко адаптировать под различные нужды без каких-либо проблем с совместимостью.

Информация об авторе

автор:Mihajlo Pavloski, энтузиаст науки о данных и машинного обучения, аспирант.

Эта статья написанаСообщество Alibaba Cloud YunqiОрганизация переводов.

Оригинальное название статьи «TensorFlow: сохранение и восстановление моделей».

автор:Mihajlo PavloskiПереводчик: Тигр говорит о восьми путях

Статья является упрощенным переводом, для более подробной информации, пожалуйста, проверьтеоригинальный