web-dev-qa-db-ja.com

Python scikit-learn:訓練された分類子をエクスポートする

私は nolearn からのscikit-learnに基づくDBN(深い信念ネットワーク)を使用しています。

データを非常にうまく分類できるネットワークをすでに構築しているため、展開用にモデルをエクスポートすることに興味がありますが、その方法がわかりません(何かを予測するたびにDBNをトレーニングしています)。 matlabでは、重み行列をエクスポートして別のマシンにインポートします。

モデル全体を再度トレーニングする必要なく、インポートするモデル/重量マトリックスをエクスポートする方法を誰かが知っていますか?

42
jcdmb

次を使用できます。

>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'my_model.pkl', compress=9)

その後、予測サーバーで:

>>> from sklearn.externals import joblib
>>> model_clone = joblib.load('my_model.pkl')

これは基本的にPython大きなnumpy配列の処理を最適化したpickleです。通常のpickle wrtコードの変更と同じ制限があります:pickleオブジェクトのクラス構造が変更された場合、 nolearnまたはscikit-learnの新しいバージョンでオブジェクトのピクルスを外すことができます。

モデルパラメータを長期にわたって堅牢に保存する方法が必要な場合は、独自のIOレイヤを作成する必要があります(たとえば、プロトコルバッファやavroなどのバイナリ形式のシリアル化ツールまたは非効率的でポータブルなテキストを使用/ json/xml表現 [〜#〜] pmml [〜#〜] )など。

61
ogrisel

Pickling/unpicklingには、一致するpythonバージョン(メジャーバージョン、場合によってはマイナーバージョン)およびsklearn、joblibライブラリバージョンでのみ機能するという欠点があります。

予測モデルマークアップ言語(PMML)や分析用のポータブル形式(PFA)など、 Data Mining Group によって開発された機械学習モデルの代替の記述的出力形式があります。 2つのうち、PMMLは はるかに優れたサポート です。

そのため、モデルをscikit-learnからPMMLに保存するオプションがあり(たとえば sklearn2pmml を使用)、その後 jpmml を使用してJava、spark、またはHiveでモデルをデプロイして実行します=(もちろん、より多くの選択肢があります)。

9
ben26941

Scikit-learnのドキュメントのセクション .4。Model persistence はほとんどすべてをカバーしています。

に加えて sklearn.externals.joblib ogriselは、通常のpickleパッケージの使用方法を示しています。

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf.fit(X, y)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0])
array([0])
>>> y[0]
0

scikit-learnのあるバージョンで保存されたモデルが別のバージョンでロードされない可能性があるなど、いくつかの警告が表示されます。

3