如何克隆包含其数据的scikitlearn估计器?

2024-05-20 18:22:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对朴素bayes估计量执行部分拟合,但在部分拟合之前保留估计量的副本。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))

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


Tags: 数据对象方法importmodelnparraypartial
2条回答
  1. model.fit()返回模型本身(相同的对象)。所以你不必把它赋给另一个变量,因为它只是一个别名。

  2. 可以使用deepcopy以与加载pickled对象类似的方式复制对象。

所以如果你做了如下的事情:

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现在是完全不同的对象。模型2上的partial_fit()对模型没有影响。deepcopy之后的两个权重向量相同,但在model2的partial_fit()之后不同

相关问题 更多 >