如何将sklearn Pipeline结构的结构和数据深度复制到新变量中?
Posted
技术标签:
【中文标题】如何将sklearn Pipeline结构的结构和数据深度复制到新变量中?【英文标题】:How to deep copy structure and data of a sklearn Pipeline structure into a new variable? 【发布时间】:2020-04-09 21:27:21 【问题描述】:假设我已经定义了一个 sklearn Pipeline 结构。我需要将其结构和数据深度复制到另一个变量中,以便在重新安装原始变量时,新变量不会改变。我尝试以与以下代码类似的方式使用来自sklearn.base
的clone
:
temp_pipe = Pipeline([
('Scaler', StandardScaler()),
('LinearRegression', LinearRegression())]);
for i in iterations:
temp_pipe.fit(X,y);
....
if check_condition:
final = clone(temp_pipe);
但它似乎做了结构的深层复制,而不是here 所述的数据:
Clone
在估算器中对模型进行深层复制,但实际上并没有 复制附加数据
我知道可以这样做:
final = Pipeline([
('Scaler', StandardScaler()),
('LinearRegression', LinearRegression())]);
for i in iterations:
temp_pipe = clone(final)
temp_pipe.fit(X,y);
....
if check_condition:
final = temp_pipe;
但是有没有办法对拟合数据进行深度复制?
【问题讨论】:
为什么还要复制数据? 不,没有办法。你不应该那样做。这个函数的意思是保存任何带有一些参数的模型,这些参数以后可以用在相同的OR新数据上。 @doctorlove 我试图在我的代码中解释它:我在相同的数据上拟合不同的模型,我想存储最好的模型,因此我不得不以某种方式复制数据。只是为了避免在for
循环开始时重新初始化。
@makis 你的意思是clone
函数?还是哪一个?
是的clone
。你能发布整个代码吗?
【参考方案1】:
from copy import deepcopy
estimator_deep_copy = deepcopy(pipeline)
请注意,clone
的目的是获得一个不合适/干净的估算器。
【讨论】:
一个很好的指南将不胜感激,为什么我们应该在处理管道时使用 deepcopy 而不是 copy.copy(浅拷贝)。我假设管道可以并且通常包含浅拷贝将引用的可变对象,它可能导致不可见的冲突和/或不引发警告或异常的错误...... @nlhntdeepcopy
的原因正是您提到的由于可变的原因。在浅拷贝的上下文中,您可以修改可变的状态(例如,调用 fit
可能会对某些可变的内部对象执行此操作)并且它也会影响复制的管道,因为您指向的是相同的对象。
以上是关于如何将sklearn Pipeline结构的结构和数据深度复制到新变量中?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 SHAP 与 sklearn 中的线性 SVC 模型一起使用 Pipeline?
Sklearn Pipeline ValueError:无法将字符串转换为浮点数
Sklearn Pipeline:将参数传递给自定义变压器?