【问题标题】:Use pipeline with custom transformer in Scikit Learn在 Scikit Learn 中使用带有自定义转换器的管道
【发布时间】:2019-11-20 15:20:19
【问题描述】:

在最后一个线性回归估计器拟合之前,我尝试使用“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

【问题讨论】:

    标签: python machine-learning scikit-learn pipeline


    【解决方案1】:

    如前所述,fit_transform方法不会将y传输到变换。我以前所做的事情是实现自己的fit_transform。不是你的代码,但这是我最近写的一个例子:

    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传递给您的变换版本。所以:

    def fit_transform(self, X, y=None):
        return self.fit(X, y).transform(X, y)
    

    【讨论】:

    • 所以基本上只使用python的鸭键入绕过变换,并且一切都应该好,右? span>
    • 您还可以扩展变换程序,但不必。如果你这样做,你会得到fit_transform方法。如果您确实扩展了它,关键真的只是覆盖它。以下是Sklearn中该方法的来源,BTW:github.com/scikit-learn/scikit-learn/blob/… span>
    【解决方案2】:

    会执行TransformerMixin下面的语句,我们可以看到transform函数只需要X参数

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

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 2016-04-16
      • 1970-01-01
      • 2020-02-04
      • 2021-10-25
      • 2020-06-24
      • 2020-02-03
      • 2017-06-12
      • 2012-10-14
      相关资源
      最近更新 更多