235

トレーニング済みの単純ベイズ分類器ディスクに保存し、それを使用してデータを予測するにはどうすればよいですか?

scikit-learnWebサイトから次のサンプルプログラムを入手しました。

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()
4

6 に答える 6

238

分類子は、他の分類子と同じようにピクルスにしてダンプできる単なるオブジェクトです。例を続けるには:

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)

編集: pickle(またはjoblib)でシリアル化できないカスタムトランスフォーマーがあるsklearnパイプラインを使用している場合、NeuraxleのカスタムMLパイプライン保存を使用すると、独自のカスタムステップセーバーを定義できます。ステップベース。保存時に定義されている場合は、ステップごとにセーバーが呼び出されます。それ以外の場合は、セーバーのないステップのデフォルトとしてjoblibが使用されます。

于 2012-05-15T01:41:50.943 に答える
231

また、デフォルトのPythonPicklerよりも数値配列の処理がはるかに効率的なjoblib.dumpjoblib.loadを使用することもできます。

Joblibはscikit-learnに含まれています:

>>> 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

編集:Python 3.8以降では、pickleプロトコル5(デフォルトではありません)を使用する場合、属性として大きな数値配列を持つオブジェクトを効率的にpickle化するためにpickleを使用できるようになりました。

于 2012-06-23T13:16:28.960 に答える
128

あなたが探しているのはsklearnワードのモデル永続性と呼ばれ、紹介モデル永続性のセクションで文書化されています。

これで、分類器が初期化され、長い間トレーニングされました。

clf = some.classifier()
clf.fit(X, y)

この後、2つのオプションがあります。

1)ピクルスを使用する

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')

もう一度、上記のリンクを読むと役に立ちます

于 2015-08-24T04:17:11.437 に答える
36

多くの場合、特にテキスト分類では、分類子を格納するだけでは不十分ですが、将来入力をベクトル化できるように、ベクトル化子も格納する必要があります。

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)

vectorizerをダンプする前に、次の方法でvectorizerのstop_words_プロパティを削除できます。

vectorizer.stop_words_ = None

ダンプをより効率的にするため。また、分類子パラメーターがスパースである場合(ほとんどのテキスト分類の例のように)、パラメーターを密からスパースに変換できます。これにより、メモリ消費、ロード、およびダンプの点で大きな違いが生じます。次の方法でモデルをスパース化します。

clf.sparsify()

これはSGDClassifierで自動的に機能しますが、モデルがスパース(clf.coef_にゼロがたくさんある)であることがわかっている場合は、次の方法でclf.coef_をcsrscipyスパース行列に手動で変換できます。

clf.coef_ = scipy.sparse.csr_matrix(clf.coef_)

そうすれば、より効率的に保存できます。

于 2016-11-23T03:24:22.207 に答える
5

sklearnEstimatorは、Estimatorの関連するトレーニング済みプロパティを簡単に保存できるようにするメソッドを実装します。一部の推定器は__getstate__それ自体でメソッドを実装しますが、他の推定器は、オブジェクトを内部ディクショナリに保存するだけの基本実装GMMを使用するようなものです。

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にロックされるなど)に苦しむことができるように、追加のデータを保存する必要があります。

ドキュメントから:

scikit-learnの将来のバージョンで同様のモデルを再構築するには、追加のメタデータをピクルスモデルに沿って保存する必要があります。

トレーニングデータ、たとえば不変のスナップショットへの参照

モデルの生成に使用されるPythonソースコード

scikit-learnのバージョンとその依存関係

トレーニングデータで得られた交差検定スコア

tree.pyxこれは、Cythonで記述されたモジュール(など)に依存するEnsemble推定器に特に当てはまりますIsolationForest。これは、実装への結合を作成し、sklearnのバージョン間での安定性が保証されないためです。過去に後方互換性のない変更が見られました。

モデルが非常に大きくなり、読み込みが煩わしい場合は、より効率的なを使用することもできますjoblib。ドキュメントから:

scikitの特定のケースでは、joblibのpicklejoblib.dumpjoblib.load)の置換を使用する方が興味深い場合があります。これは、フィットしたscikit-learn推定量の場合によくあるように、内部に大きなnumpy配列を運ぶオブジェクトでより効率的ですが、ピクルスしかできません。文字列ではなくディスクに:

于 2017-11-07T11:53:23.630 に答える
2

sklearn.externals.joblib以来非推奨になり0.21、で削除されv0.23ます:

/usr/local/lib/python3.7/site-packages/sklearn/externals/joblib/ init .py:15:FutureWarning:sklearn.externals.joblibは0.21で非推奨になり、0.23で削除されます。この機能をjoblibから直接インポートしてください。これは、pipinstalljoblibを使用してインストールできます。ピクルスモデルをロードするときにこの警告が発生した場合は、scikit-learn0.21+を使用してそれらのモデルを再シリアル化する必要がある場合があります。
warnings.warn(msg、category = FutureWarning)


したがって、インストールする必要がありますjoblib

pip install joblib

そして最後にモデルをディスクに書き込みます。

import joblib
from sklearn.datasets import load_digits
from sklearn.linear_model import SGDClassifier


digits = load_digits()
clf = SGDClassifier().fit(digits.data, digits.target)

with open('myClassifier.joblib.pkl', 'wb') as f:
    joblib.dump(clf, f, compress=9)

ダンプされたファイルを読み取るために実行する必要があるのは、次のとおりです。

with open('myClassifier.joblib.pkl', 'rb') as f:
    my_clf = joblib.load(f)
于 2020-02-21T16:51:23.277 に答える