トレーニング済みのNaive Bayes分類器をディスクに保存し、それを予測データに使用するにはどうすればよいですか?
Scikit-learn Webサイトから次のサンプルプログラムを入手しています。
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print "Number of mislabeled points : %d" % (iris.target != y_pred).sum()
分類子は、他のオブジェクトと同様にピクルスおよびダンプできるオブジェクトです。例を続けるには:
import cPickle
# save the classifier
with open('my_dumped_classifier.pkl', 'wb') as fid:
cPickle.dump(gnb, fid)
# load it again
with open('my_dumped_classifier.pkl', 'rb') as fid:
gnb_loaded = cPickle.load(fid)
joblib.dump および joblib.load を使用することもできます。これは、デフォルトのpython picklerよりも数値配列の処理がはるかに効率的です。
Joblibはscikit-learnに含まれています:
>>> from sklearn.externals import joblib
>>> from sklearn.datasets import load_digits
>>> from sklearn.linear_model import SGDClassifier
>>> digits = load_digits()
>>> clf = SGDClassifier().fit(digits.data, digits.target)
>>> clf.score(digits.data, digits.target) # evaluate training error
0.9526989426822482
>>> filename = '/tmp/digits_classifier.joblib.pkl'
>>> _ = joblib.dump(clf, filename, compress=9)
>>> clf2 = joblib.load(filename)
>>> clf2
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,
fit_intercept=True, learning_rate='optimal', loss='hinge', n_iter=5,
n_jobs=1, penalty='l2', power_t=0.5, rho=0.85, seed=0,
shuffle=False, verbose=0, warm_start=False)
>>> clf2.score(digits.data, digits.target)
0.9526989426822482
あなたが探しているのはsklearn単語でモデルの永続性と呼ばれ、 紹介 と model persistence セクション。
したがって、分類器を初期化し、長い間それを訓練しました
clf = some.classifier()
clf.fit(X, y)
この後、2つのオプションがあります。
1)Pickleの使用
import pickle
# now you can save it to a file
with open('filename.pkl', 'wb') as f:
pickle.dump(clf, f)
# and later you can load it
with open('filename.pkl', 'rb') as f:
clf = pickle.load(f)
2)Joblibの使用
from sklearn.externals import joblib
# now you can save it to a file
joblib.dump(clf, 'filename.pkl')
# and later you can load it
clf = joblib.load('filename.pkl')
もう一度、上記のリンクを読むと役に立ちます
多くの場合、特にテキスト分類では、分類子を格納するだけでは十分ではありませんが、今後入力をベクトル化できるように、ベクトル化ツールも格納する必要があります。
import pickle
with open('model.pkl', 'wb') as fout:
pickle.dump((vectorizer, clf), fout)
将来のユースケース:
with open('model.pkl', 'rb') as fin:
vectorizer, clf = pickle.load(fin)
X_new = vectorizer.transform(new_samples)
X_new_preds = clf.predict(X_new)
ベクトライザーをダンプする前に、次の方法でベクトライザーのstop_words_プロパティを削除できます。
vectorizer.stop_words_ = None
ダンプをより効率的にするため。 (ほとんどのテキスト分類例のように)分類パラメータがスパースの場合、パラメータを密からスパースに変換できます。これにより、メモリ消費、ロード、およびダンプの点で大きな違いが生じます。 スパース化 :
clf.sparsify()
これは SGDClassifier で自動的に動作しますが、モデルがスパースであることがわかっている場合(clf.coef_にゼロがたくさんある場合)、clf.coef_を手動で変換できます csr scipyスパース行列 へ:
clf.coef_ = scipy.sparse.csr_matrix(clf.coef_)
さらに効率的に保存できます。
sklearn
推定器は、推定器の関連トレーニング済みプロパティを簡単に保存できるようにするメソッドを実装します。一部の推定器は__getstate__
メソッド自体を実装しますが、GMM
のような他の推定器は base implementation を使用するだけで、オブジェクトの内部ディクショナリを単純に保存します。
def __getstate__(self):
try:
state = super(BaseEstimator, self).__getstate__()
except AttributeError:
state = self.__dict__.copy()
if type(self).__module__.startswith('sklearn.'):
return dict(state.items(), _sklearn_version=__version__)
else:
return state
モデルをディスクに保存する推奨方法は、 pickle
モジュールを使用することです:
from sklearn import datasets
from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris.data[:100, :2]
y = iris.target[:100]
model = SVC()
model.fit(X,y)
import pickle
with open('mymodel','wb') as f:
pickle.dump(model,f)
ただし、将来モデルを再訓練したり、悲惨な結果(sklearnの古いバージョンにロックされているなど)に陥る可能性があるため、追加のデータを保存する必要があります。
documentation から:
Scikit-learnの将来のバージョンで同様のモデルを再構築するには、追加のメタデータをpickleモデルに沿って保存する必要があります。
トレーニングデータ、たとえば不変のスナップショットへの参照
モデルの生成に使用されるpythonソースコード
Scikit-learnのバージョンとその依存関係
トレーニングデータで取得した相互検証スコア
これは、Cythonで記述された(IsolationForest
などの) tree.pyx
モジュールに依存するEnsembleエスティメータに特に当てはまります)、実装へのカップリングを作成するため、sklearnのバージョン間で安定していることは保証されません。過去に後方互換性のない変更が発生しています。
モデルが非常に大きくなり、ロードが面倒になる場合は、より効率的なjoblib
を使用することもできます。ドキュメントから:
Scikitの特定のケースでは、joblibの
pickle
(joblib.dump
&joblib.load
)の置換を使用する方が興味深い場合があります。文字列ではなくディスクにのみピクルできます: