如何克隆包括数据在内的scikit-learn估算器?

N.H*_*son 4 python python-3.x scikit-learn

我正在尝试对朴素贝叶斯估计量进行部分拟合,但也要在部分拟合前保留估计量的副本。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))
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,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))
Run Code Online (Sandbox Code Playgroud)

另外,我每次都可以完全适应新数据,但是由于我需要执行数千次,因此我试图找到更有效的方法。

ypr*_*rez 5

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

  2. 您可以使用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))
# ...
Run Code Online (Sandbox Code Playgroud)

model2将是一个独特的对象,其复制的参数为model,包括“训练后的”参数。

  • 在model2.partial_fit()之后,模型也将反映更新。代替复制,使用Deepcopy (2认同)