如何保存受过训练的朴素贝叶斯分类器的磁盘 ,并用它来预测数据?
我从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的更换的pickle
( joblib.dump
& joblib.load
),这是更有效的对内部进行大numpy的阵列对象作为往往是嵌合scikit-的情况下学会估计,但只能泡菜到磁盘,而不是一个字符串:
文章来源: Save classifier to disk in scikit-learn