在Scikit Learn

时间:2019-07-11 00:22:18

标签: python machine-learning scikit-learn pipeline

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如前所述,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传递给您的transform版本。所以:

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