如何克隆scikit学习估计器,包括其数据



我正试图对一个朴素贝叶斯估计器执行的部分拟合,但也在部分拟合之前保留该估计器的副本。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将是相同的,因为它们都指向同一个对象。我想原封不动地保留原件。我的解决方法是将原始对象pickle并加载到一个新对象中以执行部分拟合

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))

此外,我每次都可以使用新数据进行完全改装,但由于我需要执行数千次,我正在努力寻找更有效的方法。

  1. model.fit()返回模型本身(同一对象)。因此,您不必将其指定给其他变量,因为它只是混叠。

  2. 您可以使用deepcopy来复制对象,其方式与加载pickle对象的方式类似。

所以,如果你做了这样的事情:

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的复制参数,包括"训练"的参数。

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()不会对模型产生影响。两个权重向量在深度复制后相同,但在模型2 上的partial_fit()后不同

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

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

相关内容

最新更新