Python 如何使用固定步骤定义自定义sklearn管道?

Python 如何使用固定步骤定义自定义sklearn管道?,python,scikit-learn,Python,Scikit Learn,我正在尝试创建一个具有固定步骤的scikit学习管道对象,即从管道继承的PipelineWithFixedSteps(管道)对象,这样我就可以通过一个简单的调用PipelineWithFixedSteps()来实例化它,并保持代码干净 我注意到,如果我创建几个PipelineWithFixedSteps()实例并设置其中一个实例的参数,那么所有实例的参数都会被修改 这是故意的行为还是我遗漏了什么?为具有固定步骤的管道定义快捷方式的替代方法是什么 我正在使用sklearn 0.22.1 from

我正在尝试创建一个具有固定步骤的scikit学习管道对象,即从管道继承的PipelineWithFixedSteps(管道)对象,这样我就可以通过一个简单的调用PipelineWithFixedSteps()来实例化它,并保持代码干净

我注意到,如果我创建几个PipelineWithFixedSteps()实例并设置其中一个实例的参数,那么所有实例的参数都会被修改

这是故意的行为还是我遗漏了什么?为具有固定步骤的管道定义快捷方式的替代方法是什么

我正在使用sklearn 0.22.1

from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

class PipelineWithFixedSteps(Pipeline):    
    def __init__(
        self,
        steps = [
            ('scaler', StandardScaler()),
            ('linear', LinearRegression()),
        ]
    ):
        super().__init__(steps=steps)

a = PipelineWithFixedSteps()
print(a.get_params())

a.set_params(scaler__with_std=False)
print(a.get_params())

# Create a new instance of PipelineWithFixedNames()
# The new instance has the same parameters as a
b = PipelineWithFixedSteps()
print(b.get_params())

# Set the parameters of b
# The parameters of a are also changed
b.set_params(scaler__with_mean=False)
print(a.get_params())

这实际上与sklearn无关,但归根结底是如何在Python中解释参数的默认值(参见示例),听起来好像您正在尝试做一些事情,达到

class PipelineWithFixedSteps(Pipeline):    
    def __init__(self, steps=None):
        if steps is None:
            steps = [('scaler', StandardScaler()), ('linear', LinearRegression())]
        super().__init__(steps=steps)

谢谢我明白了,你的解决方案原则上是可行的。不幸的是,如果我想让PipelineWithFixedSteps()与sklearn完全兼容,那么_init__;()不能包含任何逻辑(请参阅)。