【问题标题】:_transform() takes 2 positional arguments but 3 were given_transform() 接受 2 个位置参数,但给出了 3 个
【发布时间】:2017-03-14 19:17:03
【问题描述】:

我尝试使用变量转换构建管道 我按照以下方式进行操作

import numpy as np
import pandas as pd
import sklearn
from sklearn import linear_model
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline

数据框

df = pd.DataFrame({'y': [4,5,6], 'a':[3,2,3], 'b' : [2,3,4]})

我尝试为预测获取一个新变量

class Complex():
    def __init__(self, X1, X2):
        self.a = X1
        self.b = X2
    def transform(self, X1, X2): 
        age = pd.DataFrame(self.a - self.b)
        return age
    def fit_transform(self, X1, X2):
        self.fit( X1, X2)
        return self.transform(X1, X2)

    def fit(self, X1, X2):
        return self

然后我做一个管道

X = df[['a', 'b']]
y = df['y']
regressor = linear_model.SGDRegressor()
pipeline = Pipeline([
        ('transform', Complex(X['a'], X['b'])) ,
        ('model_fitting', regressor)
    ])
pipeline.fit(X, y)

我得到错误

pred = pipeline.predict(X)
pred
TypeError                                 Traceback (most recent call last)
<ipython-input-555-7a07ccb0c38a> in <module>()
----> 1 pred = pipeline.predict(X)
      2 pred

C:\Program Files\Anaconda3\lib\site-packages\sklearn\utils\metaestimators.py in <lambda>(*args, **kwargs)
     52 
     53         # lambda, but not partial, allows help() to work with update_wrapper
---> 54         out = lambda *args, **kwargs: self.fn(obj, *args, **kwargs)
     55         # update the docstring of the returned function
     56         update_wrapper(out, self.fn)

C:\Program Files\Anaconda3\lib\site-packages\sklearn\pipeline.py in predict(self, X)
    324         for name, transform in self.steps[:-1]:
    325             if transform is not None:
--> 326                 Xt = transform.transform(Xt)
    327         return self.steps[-1][-1].predict(Xt)
    328 

TypeError: transform() missing 1 required positional argument: 'X2'

我做错了什么?我看到错误在类 Complex() 中。如何解决?

【问题讨论】:

    标签: python class pipeline


    【解决方案1】:

    所以问题在于transform 需要一个形状为[n_samples, n_features]的数组的参数

    参见documentation of sklearn.pipeline.Pipeline 中的示例 部分,它使用sklearn.feature_selection.SelectKBest 作为转换,您可以看到它的source 它期望X 是一个数组而不是单独的X1 和 X2 等变量。

    简而言之,您的代码可以这样修复:


    import pandas as pd
    import sklearn
    from sklearn import linear_model
    from sklearn.pipeline import Pipeline
    
    df = pd.DataFrame({'y': [4,5,6], 'a':[3,2,3], 'b' : [2,3,4]})
    
    class Complex():
        def transform(self, Xt):
            return pd.DataFrame(Xt['a'] - Xt['b'])
    
        def fit_transform(self, X1, X2):
            return self.transform(X1)
    
    X = df[['a', 'b']]
    y = df['y']
    regressor = linear_model.SGDRegressor()
    pipeline = Pipeline([
            ('transform', Complex()) ,
            ('model_fitting', regressor)
        ])
    pipeline.fit(X, y)
    
    pred = pipeline.predict(X)
    print(pred)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2019-09-21
      • 2019-07-19
      • 2021-02-02
      • 2020-02-07
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多