如何在Python中“保存”IsolationForest模型?

大家好,我正在使用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替换picklejoblib.dump & joblib.load)可能更有趣,它对内部携带大型numpy数组的对象(如已拟合的scikit-learn估计器)更有效,但只能将pickle保存到磁盘而不是字符串:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注