Sklearn モデルの保存と読み込み

機械学習では、モデルのトレーニングプロセスは通常時間がかかります。毎回モデルを再トレーニングすることを避けるために、トレーニング済みのモデルを保存しておき、後で読み込んで予測できるようにすることができます。

scikit-learnモデルを保存および読み込むための一般的な方法が2つあります: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("Predictions:", 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("Predictions:", y_pred)

3、joblib vs pickle

joblib と pickle は、モデルを保存および読み込むための一般的な2つの方法です。

joblib は大規模なデータオブジェクトの保存に適しており、pickle は Python の標準シリアライゼーションツールとして一般的な状況に適しています。

  • joblib:通常、大量の数値データ(numpy配列など)を含むオブジェクトの保存に適しています。joblib大規模データの処理において、pickleより効率的です。
  • pickle:小さなオブジェクトや通常の Python オブジェクトの保存に適しています。これは Python の組み込みライブラリであり、使用時に追加インストールは不要です。

モデルに大量の数値配列や行列(サポートベクターマシン、ランダムフォレストなど)が含まれる場合は、joblib を使用することをお勧めします。pickle よりも効率的です。小さなモデルや大量の数値データを含まないモデルには、pickle で十分です。


4、パイプライン(Pipeline)の保存と読み込み

実際のアプリケーションでは、モデルは単一のモデルではなく、複数の処理ステップ(データ前処理、特徴選択、モデルトレーニングなど)を組み合わせることがあります。これらの処理ステップは scikit-learn の Pipeline を使用して実行できます。Pipeline も joblib または pickle を使用して保存および読み込みが可能です。

パイプラインの保存:

例

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

# 创建一个管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC(kernel='linear'))
])

# 训练管道
pipeline.fit(X_train, y_train)

# 保存管道到文件
joblib.dump(pipeline, 'pipeline_model.joblib')

パイプラインの読み込み:

例

# 加载管道
loaded_pipeline = joblib.load('pipeline_model.joblib')

# 読み込んだパイプラインを使用して予測する
y_pred = loaded_pipeline.predict(X_test)

# 打印预测结果
print("Predictions:", y_pred)

パイプラインの保存と読み込みのプロセスは単一モデルと同じです。パイプラインオブジェクト全体を保存および読み込みするだけで問題ありません。


5、モデルのバージョン管理

機械学習の実際の応用では、モデルの更新とバージョン管理が非常に重要です。モデルをトレーニングして保存するたびに、モデルファイルの名前にタイムスタンプやバージョン番号を付けて、異なるバージョンのモデルを区別できるようにすることをお勧めします。例:

例

import time

# 创建时间戳
timestamp = time.strftime("%Y%m%d-%H%M%S")

# タイムスタンプ付きモデルを保存する
joblib.dump(model, f'svm_model_{timestamp}.joblib')

これにより、タイムスタンプに基づいて異なるバージョンのモデルを管理でき、モデルのロールバックや更新が容易になります。


6、モデルを使用した永続化

モデルのトレーニングが完了して保存されると、後続の実際のアプリケーションでそのモデルを読み込んで予測を行うことができ、再トレーニングは不要です。

例えば、保存したモデルを Web サービス、バッチジョブ、その他のアプリケーションと統合して、再トレーニングなしでモデルを繰り返し使用できます。

Web サービスでの読み込み済みモデルの使用

例えば、Flask を使用してシンプルな Web サービスを作成し、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)
その他の拡張