大家好,我正在使用sklearn.ensemble.IsolationForest来预测数据中的异常值。
是否可以对我的干净数据训练(拟合)模型一次,然后保存它以便稍后使用?例如,保存模型的一些属性,这样下次就不需要再次调用fit函数来训练我的模型了。
例如,对于GMM
,我会保存每个组件的weights_
、means_
和covs_
,这样以后就不需要再次训练模型了。
为了说明清楚,我正在使用这个来进行在线欺诈检测,其中这个Python脚本会被多次调用用于同一“类别”的数据,我不希望每次需要进行预测或测试操作时都重新训练模型。
提前感谢。
回答:
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 datasetsfrom sklearn.svm import SVCiris = datasets.load_iris()X = iris.data[:100, :2]y = iris.target[:100]model = SVC()model.fit(X,y)import picklewith open('mymodel','wb') as f: pickle.dump(model,f)
但是,您应该保存额外的数据,以便将来可以重新训练您的模型,否则可能会面临严重后果(例如被锁定在旧版本的sklearn中)。
根据文档:
为了在未来的scikit-learn版本中重建相似的模型,应该连同pickle化的模型一起保存额外的元数据:
训练数据,例如对不可变快照的引用
生成模型所使用的Python源代码
scikit-learn及其依赖的版本
在训练数据上获得的交叉验证得分
这对于依赖于用Cython编写的tree.pyx
模块的Ensemble估计器(如IsolationForest
)尤其重要,因为它与实现之间建立了联系,而这种联系在sklearn的不同版本之间并不能保证稳定。在过去,它已经经历过向后不兼容的更改。
如果您的模型变得非常大并且加载变得麻烦,您还可以使用更高效的joblib
。根据文档:
在scikit的特定情况下,使用joblib替换
pickle
(joblib.dump
&joblib.load
)可能更有趣,它对内部携带大型numpy数组的对象(如已拟合的scikit-learn估计器)更有效,但只能将pickle保存到磁盘而不是字符串: