分类保存到磁盘scikit学习分类保存到磁盘scikit学习(Save classifier to

2019-05-14 02:07发布

如何保存受过训练的朴素贝叶斯分类的磁盘 ,并用它来预测数据?

我从scikit学习网站下面的示例程序:

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

Answer 1:

分类只是可以腌制和倾倒像任何其他对象。 要继续例如:

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)


Answer 2:

您还可以使用joblib.dump和joblib.load这是在处理数字阵列比默认的Python Pickler会更有效。

JOBLIB包括在scikit学习:

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


Answer 3:

你在找什么叫模型的持久性 sklearn的话,它是在记录引进和模型的持久性部分。

所以,你必须初始化您的分类并训练了很长一段时间

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

在此之后,你有两个选择:

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

一个更多的时间是有帮助的阅读上述链接



Answer 4:

在许多情况下,尤其是文本分类是不足够的存储分类,但你需要存储的矢量化,以及让你可以在未来的矢量化输入。

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

使倾倒更有效。 此外,如果您的分类参数是稀疏的(因为在大多数文本分类的例子),你可以将参数从密集转换为疏,这将使内存消耗,加载和倾销方面的巨大差异。 Sparsify由模型:

clf.sparsify()

这将为自动工作SGDClassifier ,但如果你知道你的模型是稀疏(地段clf.coef_零),那么你可以手动转换clf.coef_成CSR SciPy的稀疏矩阵方式:

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

然后你就可以更有效地存储。



Answer 5:

sklearn估计实现方法,使您轻松保存一个估计的相关培训的性质。 一些估计实现__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学习未来的版本类似的模型,额外的元数据应沿腌制模型保存:

训练数据,例如一个不变的快照参考

所使用的Python源代码以产生所述模型

的scikit学习及其依赖的版本

在训练数据中获得的交叉验证得分

这尤其适用于那些依赖于合奏估计 tree.pyx写在用Cython(如模块IsolationForest ),因为它产生的耦合来实现,这是不能保证是sklearn版本之间的稳定。 它已经看到在过去的向后兼容的变化。

如果你的模型变得非常大,装载变得讨厌,你也可以使用更高效的joblib 。 从文档:

在scikit的特定情况下,它可能是更有趣使用JOBLIB的更换的picklejoblib.dumpjoblib.load ),这是更有效的对内部进行大numpy的阵列对象作为往往是嵌合scikit-的情况下学会估计,但只能泡菜到磁盘,而不是一个字符串:



文章来源: Save classifier to disk in scikit-learn