如何克隆包含其数据的 scikit-learn 估算器?
How to clone an scikit-learn estimator including its data?
我正在尝试对朴素贝叶斯估计器执行部分拟合,但也在部分拟合之前保留估计器的副本。 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))
此外,我每次都可以使用新数据完全重新调整,但由于我需要执行此操作数千次,所以我正在努力寻找更有效的方法。
model.fit()
returns 模型本身(同一个对象)。所以你不必将它分配给不同的变量,因为它只是别名。
您可以使用 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
的复制参数,包括 "trained" 参数。
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 现在是完全不同的对象。 partial_fit() on model2 对模型没有影响。这两个权重向量在 deepcopy 之后相同,但在 model2
上的 partial_fit() 之后不同
我尝试了deepcopy,但在删除变量时出现内存泄漏。我在文档中发现建议使用 clone
sklearn.base.clone
from sklearn.base import clone
model2 = clone(model)
我正在尝试对朴素贝叶斯估计器执行部分拟合,但也在部分拟合之前保留估计器的副本。 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))
此外,我每次都可以使用新数据完全重新调整,但由于我需要执行此操作数千次,所以我正在努力寻找更有效的方法。
model.fit()
returns 模型本身(同一个对象)。所以你不必将它分配给不同的变量,因为它只是别名。您可以使用
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
的复制参数,包括 "trained" 参数。
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 现在是完全不同的对象。 partial_fit() on model2 对模型没有影响。这两个权重向量在 deepcopy 之后相同,但在 model2
上的 partial_fit() 之后不同我尝试了deepcopy,但在删除变量时出现内存泄漏。我在文档中发现建议使用 clone sklearn.base.clone
from sklearn.base import clone
model2 = clone(model)