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 ( dump
& load
) в 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, чтобы заморозить среду и зависимости.
Если вы хотите узнать больше об этих проблемах и изучить другие возможные методы сериализации, обратитесь к докладу Алекса Гейнора .