Сохранение и загрузка моделей в Sklearn

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

scikit-learnСуществует два распространённых способа сохранения и загрузки моделей:joblibиpickle。

1. ИспользованиеjoblibСохранение и загрузка моделей

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

joblib — это внешняя библиотека Python, которую можно установить следующей командой:

pip install joblib

Сохранение модели

joblib предоставляет простой API для сохранения и загрузки объектов.

Мы можем использовать метод joblib.dump() для сохранения модели в файл.

Пример

import joblib
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# Загрузить данные
data = load_iris()
X, y = data.data, data.target

# Разделение обучающей и тестовой выборок
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создание и обучение модели
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# Сохранить модель в файл
joblib.dump(model, 'svm_model.joblib')

Загрузка модели

Используйте метод joblib.load() для загрузки сохранённого объекта модели.

Пример

# Загрузить сохранённую модель
loaded_model = joblib.load('svm_model.joblib')

# Использовать загруженную модель для предсказания
y_pred = loaded_model.predict(X_test)

# Вывести результаты предсказания
print("Предсказания:", y_pred)

Благодаря описанным выше шагам мы успешно сохранили обученную модель в файл и можем загрузить модель и делать прогнозы в любое время в дальнейшем.


2. Сохранение и загрузка моделей с помощью pickle

pickle — это встроенный модуль Python, который позволяет сериализовать и десериализовать объекты Python.

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

Сохранение модели

Как и joblib, pickle также имеет простой API для сохранения и загрузки объектов.

Код для сохранения модели выглядит следующим образом:

Пример

import pickle
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# Загрузить данные
data = load_iris()
X, y = data.data, data.target

# Разделение обучающей и тестовой выборок
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создание и обучение модели
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# Сохранить модель с помощью pickle
with open('svm_model.pkl', 'wb') as f:
    pickle.dump(model, f)

Загрузка модели

Используйте pickle.load() для загрузки модели:

Пример

# Загрузить сохранённую модель с помощью pickle
with open('svm_model.pkl', 'rb') as f:
    loaded_model = pickle.load(f)

# Использовать загруженную модель для предсказания
y_pred = loaded_model.predict(X_test)

# Вывести результаты предсказания
print("Предсказания:", y_pred)

3、joblib против pickle

joblib и pickle — два распространённых метода сохранения и загрузки моделей.

joblib лучше подходит для сохранения больших объектов данных, тогда как pickle — стандартный инструмент сериализации Python, подходящий для общих случаев.

  • joblib: Обычно подходит для сохранения объектов, содержащих большое количество числовых данных (например, массивов numpy).joblibПри обработке крупномасштабных данных он более эффективен, чемpickleболее эффективна.
  • pickle: Подходит для сохранения небольших объектов или обычных объектов Python. Это встроенная библиотека Python, и она не требует дополнительной установки.

Если модель содержит большое количество числовых массивов или матриц (таких как машины опорных векторов, случайные леса и т. д.), рекомендуется joblib, поскольку он эффективнее, чем pickle. Для небольших моделей или моделей, не содержащих большого количества числовых данных, достаточно pickle.


4. Сохранение и загрузка Pipeline

В практических приложениях модель — это не просто отдельная модель; иногда она объединяет несколько этапов обработки (таких как предварительная обработка данных, отбор признаков, обучение модели и т. д.). Эти этапы обработки можно выполнить с помощью Pipeline из scikit-learn. Pipeline также можно сохранять и загружать с помощью joblib или pickle.

Сохранение Pipeline:

Пример

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
import joblib

# Создание pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC(kernel='linear'))
])

# Обучение конвейера
pipeline.fit(X_train, y_train)

# Сохранить pipeline в файл
joblib.dump(pipeline, 'pipeline_model.joblib')

Загрузка Pipeline:

Пример

# Загрузить конвейер
loaded_pipeline = joblib.load('pipeline_model.joblib')

# Использовать загруженный конвейер для предсказания
y_pred = loaded_pipeline.predict(X_test)

# Вывести результаты предсказания
print("Предсказания:", y_pred)

Процесс сохранения и загрузки конвейера такой же, как и для одной модели; нужно только убедиться, что весь объект конвейера сохранён и загружен.


5. Управление версиями модели

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

Пример

import time

# Создать временную метку
timestamp = time.strftime("%Y%m%d-%H%M%S")

# Сохранить модель с временной меткой
joblib.dump(model, f'svm_model_{timestamp}.joblib')

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


6. Использование модели для сохранения

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

Например, мы можем интегрировать сохранённую модель с веб-сервисами, пакетными заданиями или другими приложениями, чтобы модель можно было повторно использовать без повторного обучения.

Использование загруженных моделей в веб-сервисах

Например, предположим, что мы используем Flask для создания простого веб-сервиса, который предоставляет сервисы предсказаний модели через API. В этом случае мы можем загрузить сохранённую модель для предсказаний в реальном времени.

Пример

from flask import Flask, request, jsonify
import joblib
import numpy as np

app = Flask(__name__)

# Загрузить модель
model = joblib.load('svm_model.joblib')

@app.route('/predict', methods=['POST'])
def predict():
    data = request.get_json()  # Получить входные данные
    features = np.array(data['features']).reshape(1, -1)  # Преобразовать в формат, подходящий для предсказания
    prediction = model.predict(features)  # Использовать загруженную модель для предсказания
    return jsonify({'prediction': prediction.tolist()})  # Вернуть результат предсказания

if __name__ == '__main__':
    app.run(debug=True)
Другие расширения