9.1. Python конкретные сериализации

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

Можно сохранить модель в scikit-learn, используя встроенную модель сохраняемости Python, а именно pickle :

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> X, y= datasets.load_iris(return_X_y=True)
>>> clf.fit(X, y)
SVC()

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0:1])
array([0])
>>> y[0]
0

В конкретном случае scikit-learn может быть лучше использовать замену pickle ( dumpload) в joblib , которая более эффективна для объектов, которые несут большие массивы numpy внутри, как это часто бывает для встроенных оценщиков scikit-learn, но может только рассол на диск, а не на строку:

>>> from joblib import dump, load
>>> dump(clf, 'filename.joblib') 

Позже вы можете загрузить обратно маринованную модель (возможно, в другом процессе Python) с помощью:

>>> clf = load('filename.joblib') 

Примечание

dumpи loadфункции также принимают файловые объекты вместо имен файлов. Более подробную информацию о сохранении данных с помощью Joblib можно найти здесь .

9.1.1. Ограничения безопасности и ремонтопригодности

pickle (и с расширением joblib) имеет некоторые проблемы, связанные с ремонтопригодностью и безопасностью. Из-за этого,

  • Никогда не извлекайте ненадежные данные, так как это может привести к запуску вредоносного кода при загрузке.
  • Хотя модели, сохраненные с использованием одной версии scikit-learn, могут загружаться в других версиях, это полностью не поддерживается и не рекомендуется. Также следует иметь в виду, что операции, выполняемые с такими данными, могут давать разные и неожиданные результаты.

Чтобы перестроить аналогичную модель с будущими версиями scikit-learn, необходимо сохранить дополнительные метаданные вместе с маринованной моделью:

  • Обучающие данные, например ссылка на неизменяемый снимок
  • Исходный код Python, используемый для создания модели
  • Версии scikit-learn и их зависимости
  • Оценка перекрестной проверки, полученная на данных обучения

Это должно позволить проверить, что оценка перекрестной проверки находится в том же диапазоне, что и раньше.

За некоторыми исключениями, маринованные модели должны быть переносимы между архитектурами, предполагая, что используются одни и те же версии зависимостей и Python. Если вы столкнулись с непереносимым оценщиком, откройте вопрос на GitHub. Готовые модели часто развертываются в производственной среде с использованием контейнеров, таких как Docker, чтобы заморозить среду и зависимости.

Если вы хотите узнать больше об этих проблемах и изучить другие возможные методы сериализации, обратитесь к докладу Алекса Гейнора .