如何克隆包括其数据的 scikit-learn 估计器?

Posted

技术标签:

【中文标题】如何克隆包括其数据的 scikit-learn 估计器?【英文标题】:How to clone an scikit-learn estimator including its data? 【发布时间】:2016-02-08 03:28:50 【问题描述】:

我正在尝试对朴素贝叶斯估计器执行部分拟合,但也在部分拟合之前保留估计器的副本。 sklearn.base.clone 仅克隆估计器参数,而不是数据,因此在这种情况下没有用。对克隆执行部分拟合仅使用在部分拟合期间添加的数据,因为克隆实际上是空的。

from sklearn.naive_bayes import MultinomialNB

model = MultinomialNB()
fit_model = model.fit(np.array(X),np.array(y))
fit_model2 = model.partial_fit = (np.array(Z),np.array(w)),np.unique(y))

在上面的例子中 fit_model 和 fit_model2 将是相同的,因为它们都指向同一个对象。我想保留原件不变。我的解决方法是腌制原件并将其加载到一个新对象中以执行部分​​拟合。像这样:

model = MultinomialNB()
fit_model = model.fit(np.array(X),np.array(y))

import pickle
with open('saved_model', 'wb') as f:
    pickle.dump([model], f)

with open('saved_model', 'rb') as f:
    [model2] = pickle.load(f) 

fit_model2 = model2.partial_fit(np.array(Z),np.array(w)),np.unique(y))

我也可以每次都完全用新数据重新调整,但由于我需要执行数千次,所以我试图找到更有效的方法。

【问题讨论】:

你试过copydeepcopy吗? 【参考方案1】:

    model.fit() 返回模型本身(同一个对象)。所以你不必将它分配给不同的变量,因为它只是别名。

    您可以使用deepcopy 以类似于加载腌制对象的方式复制对象。

因此,如果您执行以下操作:

from copy import deepcopy

model = MultinomialNB()
model.fit(np.array(X), np.array(y))

model2 = deepcopy(model)

model2.partial_fit(np.array(Z),np.array(w)), np.unique(y))
# ...

model2 将是一个不同的对象,具有 model 的复制参数,包括“训练”参数。

【讨论】:

谢谢,我试试 在model2.partial_fit()之后,模型也会反映更新。使用 deepcopy 代替复制【参考方案2】:
from copy import deepcopy

model = MultinomialNB()
model.fit(np.array(X), np.array(y))

model2 = deepcopy(model)

weight_vector_model = array(model.coef_[0])
weight_vector_model2 = array(model2.coef_[0])

model2.partial_fit(np.array(Z),np.array(w)), np.unique(y))

weight_vector_model = array(model.coef_[0])
weight_vector_model2 = array(model2.coef_[0])

model 和 model2 现在是完全不同的对象。 model2 上的 partial_fit() 对模型没有影响。两个权重向量在 deepcopy 后相同,但在 model2 上的 partial_fit() 后不同

【讨论】:

【参考方案3】:

我尝试了 deepcopy,但在删除变量时出现内存泄漏。我在文档中发现建议使用 clone 代替 sklearn.base.clone

from sklearn.base import clone
model2 = clone(model)

【讨论】:

请注意,在文档中,它声明 sklearn.base.clone 不会复制数据,因此会产生未拟合的模型。

以上是关于如何克隆包括其数据的 scikit-learn 估计器?的主要内容,如果未能解决你的问题,请参考以下文章

SciKit 学习 ColumnTransformer TypeError:无法克隆对象。您应该提供一个 scikit-learn 估计器的实例而不是一个类

子集的编程安全版本 - 在从另一个函数调用时评估其条件

如何通过 Rails 迁移克隆数据库表?

黑客/克隆 sklearn 以支持修剪决策树?

如何使用 scikit-learn 为机器学习准备文本数据

scikit-learn 中的 LassoCV 如何分区数据?