コンテンツにスキップ

Exporterノード

Exporterノードは学習済みモデルをデプロイや後で使用するために様々な形式でディスクに保存します。

プロパティ
タイプ終端ノード
入力学習済みモデル(Trainerから)
出力ディスク上のモデルファイル
形式joblib、pickle、ONNX、CoreML

モデルファイルを保存する場所。

~/Desktop/my_model.joblib
/path/to/models/classifier_v1.pkl

最適な用途: Pythonアプリケーション

  • NumPy配列に効率的
  • 大きなモデルでも小さいファイルサイズ
  • 高速な読み込み
import joblib
model = joblib.load("model.joblib")

有効時、以下を含む.jsonファイルを一緒に保存:

{
"model_type": "RandomForestClassifier",
"sklearn_version": "1.3.0",
"feature_names": ["sepal_length", "sepal_width", "petal_length", "petal_width"],
"target_names": ["setosa", "versicolor", "virginica"],
"n_features": 4,
"n_classes": 3,
"training_date": "2024-01-15T10:30:00Z",
"metrics": {
"accuracy": 0.967,
"f1_weighted": 0.965
},
"hyperparameters": {
"n_estimators": 100,
"max_depth": 10
}
}

model.joblibをメタデータ付きでエクスポートした場合:

ファイル内容
model.joblib学習済みモデル
model_meta.jsonメタデータ(特徴量、メトリクスなど)

エクスポートしたモデルの読み込み

Section titled “エクスポートしたモデルの読み込み”
import joblib
import json
# モデルを読み込み
model = joblib.load("model.joblib")
# メタデータを読み込み
with open("model_meta.json") as f:
meta = json.load(f)
# 入力を検証
expected_features = meta["feature_names"]
print(f"モデルは{len(expected_features)}個の特徴量を期待: {expected_features}")
# 予測を実行
import numpy as np
X_new = np.array([[5.1, 3.5, 1.4, 0.2]])
prediction = model.predict(X_new)
print(f"予測: {meta['target_names'][prediction[0]]}")
from flask import Flask, request, jsonify
import joblib
import numpy as np
app = Flask(__name__)
model = joblib.load("model.joblib")
@app.route("/predict", methods=["POST"])
def predict():
data = request.json
X = np.array(data["features"])
predictions = model.predict(X)
return jsonify({"predictions": predictions.tolist()})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)

モデルバージョン管理のベストプラクティス:

{model_name}_v{version}_{algorithm}_{date}.joblib

例:

  • churn_model_v1_rf_2024-01-15.joblib
  • churn_model_v2_gb_tuned_2024-01-20.joblib
models/
├── production/
│ └── churn_model_current.joblib -> ../v2/churn_model.joblib
├── v1/
│ ├── churn_model.joblib
│ └── churn_model_meta.json
└── v2/
├── churn_model.joblib
└── churn_model_meta.json

100MBを超えるモデルにはGit LFSを使用:

Terminal window
git lfs install
git lfs track "*.joblib"
git add .gitattributes
git add models/
git commit -m "Add trained model"

「互換性のないsklearnバージョン」

Section titled “「互換性のないsklearnバージョン」”

あるscikit-learnバージョンで保存したモデルは、別のバージョンで読み込めない場合があります。

解決策: メタデータのsklearn_versionを確認し、一致するバージョンをインストール:

Terminal window
pip install scikit-learn==1.3.0

大きなモデル(特に多くの木を持つRandom Forest)は大きくなります。

解決策:

  • n_estimatorsを減らす
  • 圧縮を使用:joblib.dump(model, "model.joblib", compress=3)
  • より小さいファイル用にONNXにエクスポート

読み込み時に「ModuleNotFoundError」

Section titled “読み込み時に「ModuleNotFoundError」”

読み込み環境は学習環境と同じパッケージを持つ必要があります。

解決策: requirements.txtを含める:

scikit-learn==1.3.0
pandas==2.0.0
numpy==1.24.0

セキュリティに関する考慮事項

Section titled “セキュリティに関する考慮事項”

ベストプラクティス:

  • 自分が作成または信頼するモデルのみ読み込む
  • チェックサムでファイル整合性を確認
  • モデルを公開共有する場合はONNXを使用(より安全な形式)
import joblib
import json
from datetime import datetime
# モデルを保存
joblib.dump(model, "/path/to/model.joblib")
# メタデータを保存
metadata = {
"model_type": type(model).__name__,
"feature_names": list(X.columns),
"training_date": datetime.now().isoformat(),
"metrics": {
"accuracy": accuracy,
"f1_score": f1
}
}
with open("/path/to/model_meta.json", "w") as f:
json.dump(metadata, f, indent=2)
print(f"Model saved to /path/to/model.joblib")
  • Trainer — エクスポートするモデルを学習
  • Evaluator — エクスポート前に評価