scikitlearn管道_transform()接受“x”位置参数,但给出了“y”

2024-10-01 07:46:18 发布

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

问题:

我正在使用scikit learn的管道设计一个自定义转换器,但存在位置参数不匹配的问题。我定义的类是:

class DataSubsetGenerator(BaseEstimator, TransformerMixin):
    def __init__(self, sub_percentage, random_state = 42):
        self.sub_percentage = sub_percentage
        self.random_state = random_state
    def fit(self):
        return self
    def transform(self, X_train, X_test, y_train, y_test):
        # Do data processing stuff here, removed to simplify example here...
        return X_train_sub, X_test_sub, y_train_sub, y_test_sub

然后我将其放入一个1步定制管道中进行测试:

reduce_pipeline = Pipeline([
    ('Prototype dataset', DataSubsetGenerator(0.5, random_state = random_state))
])

X_train, X_test, y_train, y_test = reduce_pipeline.transform(X_train, X_test, y_train, y_test)

我收到了错误信息:

TypeError                                 Traceback (most recent call last)
<ipython-input-42-4b2a20eb8b63> in <module>()
      3 ])
      4 
----> 5 X_train, X_test, y_train, y_test = reduce_pipeline.transform(X_train, X_test, y_train, y_test)

TypeError: _transform() takes 2 positional arguments but 5 were given

这没有任何意义,因为我已经定义了DataSubGenerator类的transform()函数来接受4个参数

我的测试:

我通过实例化DataSubGenerator并调用transform()来测试这一点,但没有使用sklearn的管道,它的功能符合设计:

dsg = DataSubsetGenerator(0.5, random_state = random_state)
X_train, X_test, y_train, y_test = dsg.transform(X_train, X_test, y_train, y_test)

我的问题是:transform()函数在sklearn管道中使用时为什么不能识别这4个参数

相关问答;答:

我试过研究,最近的问题和;一个线程是:_transform() takes 2 positional arguments but 3 were given。但是,我无法理解解决方案以及它如何应用于我的场景


Tags: testselfreduce参数return管道pipeline定义
2条回答

我已经通过修改transformer类来解决这个问题,并返回一个单个列表(包含多个数据帧):

class DataSubsetGenerator(BaseEstimator, TransformerMixin):
    def __init__(self, sub_percentage, random_state = 42):
        self.sub_percentage = sub_percentage
        self.random_state = random_state
    def fit(self):
        return self
    def transform(self, dataframes):
        X_train, X_test, y_train, y_test = dataframes
        # Do data processing stuff here, removed to simplify example here...
        return [X_train_sub, X_test_sub, y_train_sub, y_test_sub]

如果有更好的解决方案或普遍接受的模式,请随时告诉我

此错误是由line引起的。这里的期望是,当管道的最后一步有transform方法时,您将只提供X,这意味着它是从RegressionOrmixin或classifierMixin继承的

首先,我们需要了解sklearn的估计器遵循(X, y)的API设计。这也是管道API设计的原因

因此,在将数据送入管道之前,需要进行数据拆分或采样

相关问题 更多 >