python – 如何克隆scikit-learn估算器,包括其数据?

我试图在naive-bayes估计器上进行部分拟合,但在部分拟合之前还保留估计量的副本. 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))

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

最佳答案
> model.fit()返回模型本身(同一个对象).因此,您不必将其分配给不同的变量,因为它只是别名.
>您可以使用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将是一个独特的对象,具有复制的模型参数,包括“训练”参数.

转载注明原文:python – 如何克隆scikit-learn估算器,包括其数据? - 代码日志