我已经训练了scikit学习模型,现在我想在我的python代码中使用它。有没有一种方法可以重用同一个模型实例?通过一种简单的方式,我可以在需要的时候再次加载模型,但由于我的需求更频繁,我想再次加载模型并重用它。
有没有一种方法可以在python中实现这一点?
以下是prediction.py:中一个线程的代码
clf = joblib.load('trainedsgdhuberclassifier.pkl')
clf.predict(userid)
现在,对于另一个用户,我不想再次启动prediction.py并花费时间加载模型。有没有办法,我可以简单地写。
new_recommendations = prediction(userid)
我应该在这里使用多处理吗?我不确定!!
根据Scikit学习文档,以下代码可能会帮助您:
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)
import pickle
s = pickle.dumps(clf)
clf2 = pickle.loads(s)
clf2.predict(X[0])
在scikit的特定情况下,使用joblib代替pickle(joblib.dump&joblib.load)可能更有趣,它对内部携带大型numpy数组的对象更有效,就像适用的scikit学习估计器通常的情况一样,但只能pickle到磁盘而不能pickle字符串:
from sklearn.externals import joblib
joblib.dump(clf, 'filename.pkl')
稍后,您可以使用(可能在另一个Python进程中)加载回pickle模型
clf = joblib.load('filename.pkl')
一旦你再次加载你的模型。你可以在不重新训练的情况下重复使用它。
clf.predict(X[0])
来源:http://scikit-learn.org/stable/modules/model_persistence.html
首先,您应该检查这是一个多大的瓶颈,以及是否真的值得避免IO。SGD分类器通常很小。您可以很容易地重用模型,但问题并不是如何重用模型,而是如何将新的用户实例添加到分类器中。
我想userid
是一个特征向量,而不是ID,对吧?
为了让模型对新数据进行预测,您需要某种基于事件的处理,当新输入到达时调用模型。到目前为止,我还不是这里的专家,但我认为一个简单的解决方案可能是使用http接口,并使用像flask这样的轻量级服务器。