Сохранение и загрузка моделей в Sklearn
В машинном обучении процесс обучения модели обычно занимает много времени. Чтобы не переобучать модель каждый раз, мы можем сохранить обученную модель для последующей загрузки и предсказания.
scikit-learnСуществует два распространённых способа сохранения и загрузки моделей:joblibиpickle。
1. ИспользованиеjoblibСохранение и загрузка моделей
joblibявляется эффективным инструментом сериализации Python, особенно подходящим для сохранения объектов, содержащих большое количество числовых массивов (таких как массивы numpy, модели scikit-learn и т. д.). По сравнению сpickle,joblibон более эффективен при обработке крупномасштабных данных.
joblib — это внешняя библиотека Python, которую можно установить следующей командой:
pip install joblib
Сохранение модели
joblib предоставляет простой API для сохранения и загрузки объектов.
Мы можем использовать метод joblib.dump() для сохранения модели в файл.
Пример
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 для сохранения и загрузки объектов.
Код для сохранения модели выглядит следующим образом:
Пример
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() для загрузки модели:
Пример
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.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. Управление версиями модели
В реальных приложениях машинного обучения обновление моделей и управление версиями имеют решающее значение. Каждый раз, когда вы обучаете и сохраняете модель, лучше добавлять временную метку или номер версии в имя файла модели, чтобы различать разные версии модели. Например:
Пример
# Создать временную метку
timestamp = time.strftime("%Y%m%d-%H%M%S")
# Сохранить модель с временной меткой
joblib.dump(model, f'svm_model_{timestamp}.joblib')
Таким образом, мы можем управлять разными версиями моделей на основе временных меток, что упрощает откат и обновление моделей.
6. Использование модели для сохранения
После того как модель обучена и сохранена, мы можем загружать её в последующих практических приложениях для выполнения предсказаний без повторного обучения.
Например, мы можем интегрировать сохранённую модель с веб-сервисами, пакетными заданиями или другими приложениями, чтобы модель можно было повторно использовать без повторного обучения.
Использование загруженных моделей в веб-сервисах
Например, предположим, что мы используем Flask для создания простого веб-сервиса, который предоставляет сервисы предсказаний модели через API. В этом случае мы можем загрузить сохранённую модель для предсказаний в реальном времени.
Пример
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)