使用Scikit Learn中的自定义转换器管道

2024-09-28 22:19:03 发布

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

我试图在最后一个线性回归估计器拟合之前,使用列“y”中的值来转换列“X”(这是一个玩具示例,只是为了演示如何使用y进行转换)。但是为什么df['y']没有传递给MyTransformer?在

from sklearn.base import TransformerMixin
class MyTransformer(TransformerMixin):
    def __init__(self):
        pass
    def fit(self, X, y=None):
        return self
    def transform(self, X, y=None):
        print(y)
        return X + np.sum(y)

df = pd.DataFrame(np.array([[2, 3], [1, 5], [1, 1], [5, 6], [1, 2]]), columns=['X', 'y'])
pip =  Pipeline([('my_transformer', MyTransformer()), 
             ('sqrt', FunctionTransformer(np.sqrt, validate=False)),
             ('lr', LinearRegression())])
pip.fit(df[['X']], df['y'])

运行此脚本将在return X + np.sum(y)行引发一个错误,看起来y是None。在


Tags: pipselfnonedfreturndefnp线性
2条回答

如前所述,fit_变换方法不会将y传递给变换。我之前所做的是实现我自己的fit_转换。不是你的代码,但下面是我最近写的一个例子:

class MultiColumnLabelEncoder:
    def __init__(self, *args, **kwargs):
        self.encoder = StandardLabelEncoder(*args, **kwargs)
    def fit(self, X, y=None):
        return self
    def transform(self,X):
        data = X.copy()
        for i in range(data.shape[1]):
            data[:, i] = LabelEncoder().fit_transform(data[:, i])
        return data
    def fit_transform(self, X, y=None):
        return self.fit(X, y).transform(X)

还有其他方法。可以将y作为类参数,并在transform方法中访问它。在

编辑:我要注意的是,你可以把y传递给你的转换版本。所以:

^{pr2}$

transformerMini中的以下语句将执行,我们可以看到transform函数只需要X参数

self.fit(X, y, **fit_params).transform(X)

相关问题 更多 >