如何将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.baseclone

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(浅拷贝)。我假设管道可以并且通常包含浅拷贝将引用的可变对象,它可能导致不可见的冲突和/或不引发警告或异常的错误...... @nlhnt deepcopy 的原因正是您提到的由于可变的原因。在浅拷贝的上下文中,您可以修改可变的状态(例如,调用 fit 可能会对某些可变的内部对象执行此操作)并且它也会影响复制的管道,因为您指向的是相同的对象。

以上是关于如何将sklearn Pipeline结构的结构和数据深度复制到新变量中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SHAP 与 sklearn 中的线性 SVC 模型一起使用 Pipeline?

Sklearn Pipeline ValueError:无法将字符串转换为浮点数

如何使用 sklearn.pipeline 转换新数据

Sklearn Pipeline:将参数传递给自定义变压器?

如何使用 GridSearchCV 和 sklearn Pipeline 用训练数据的估算值估算测试数据

使用 sklearn Pipeline 和 MultiOutputRegressor 访问属性