конвейер scikit-learn _transform () принимает позиционные аргументы 'x', но задано 'y' - PullRequest
1 голос
/ 04 мая 2020

Проблема:

Я проектирую собственный преобразователь, используя конвейер scikit-learn, но у меня несоответствие позиционных аргументов. Класс, который я определил:

class DataSubsetGenerator(BaseEstimator, TransformerMixin):
    def __init__(self, sub_percentage, random_state = 42):
        self.sub_percentage = sub_percentage
        self.random_state = random_state
    def fit(self):
        return self
    def transform(self, X_train, X_test, y_train, y_test):
        # Do data processing stuff here, removed to simplify example here...
        return X_train_sub, X_test_sub, y_train_sub, y_test_sub

Затем я помещаю это в 1-шаговый пользовательский конвейер для проверки:

reduce_pipeline = Pipeline([
    ('Prototype dataset', DataSubsetGenerator(0.5, random_state = random_state))
])

X_train, X_test, y_train, y_test = reduce_pipeline.transform(X_train, X_test, y_train, y_test)

И я получаю ошибку:

TypeError                                 Traceback (most recent call last)
<ipython-input-42-4b2a20eb8b63> in <module>()
      3 ])
      4 
----> 5 X_train, X_test, y_train, y_test = reduce_pipeline.transform(X_train, X_test, y_train, y_test)

TypeError: _transform() takes 2 positional arguments but 5 were given

Это не имеет смысла, потому что я определил функцию transform() класса DataSubGenerator, которая будет принимать 4 аргумента.

Мое тестирование:

Я проверил это без использования конвейера sklearn, создав экземпляр DataSubGenerator и вызвав transform(), и он работает в соответствии с проектом:

dsg = DataSubsetGenerator(0.5, random_state = random_state)
X_train, X_test, y_train, y_test = dsg.transform(X_train, X_test, y_train, y_test)

Мой вопрос: почему нет Разве функция transform() распознает эти 4 аргумента при использовании в конвейере sklearn?

Связанные вопросы и ответы:

Я пробовал исследовать и ближайший поток вопросов и ответов таков: _transform () принимает 2 позиционных аргумента, но 3 получили . Однако я не могу понять решение и то, как оно применимо к моему сценарию.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Я исправил это, изменив класс преобразователя так, чтобы он принимал и возвращал список single (содержащий несколько фреймов данных):

class DataSubsetGenerator(BaseEstimator, TransformerMixin):
    def __init__(self, sub_percentage, random_state = 42):
        self.sub_percentage = sub_percentage
        self.random_state = random_state
    def fit(self):
        return self
    def transform(self, dataframes):
        X_train, X_test, y_train, y_test = dataframes
        # Do data processing stuff here, removed to simplify example here...
        return [X_train_sub, X_test_sub, y_train_sub, y_test_sub]

Не стесняйтесь сообщить мне, если есть лучшее решение или общепринятый шаблон.

1 голос
/ 04 мая 2020

Ошибка возникает из-за этой строки . Здесь ожидается, что вы будете кормить только X, когда на последнем шаге вашего конвейера будет использоваться метод transform, что означает, что он унаследован от regressorMixin или classifierMixin.

Во-первых, нам нужно понять, что sklearn's Оценщики соответствуют дизайну API (X, y). Это и является причиной разработки API конвейера.

Следовательно, вы выполняете разбиение или выборку данных перед подачей их в конвейер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...