Используйте конвейер с пользовательским трансформатором в Scikit Learn - PullRequest
0 голосов
/ 11 июля 2019

Я пытался преобразовать столбец 'X', используя значения в столбце 'y' (это игрушечный пример, просто для демонстрации использования 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), похоже, что у None.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Как указывалось ранее, метод 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.

Edit: я должен отметить, что вы можете передать y к вашей версии преобразования. Итак:

def fit_transform(self, X, y=None):
    return self.fit(X, y).transform(X, y)
0 голосов
/ 11 июля 2019

Следующая инструкция в TransformerMixin будет выполнена. Мы видим, что для функции преобразования нужен только параметр X

self.fit(X, y, **fit_params).transform(X)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...