Scikit-learn: LabelBinarizer и LabelEncoder подбирают и преобразуют подписи, несовместимые с Pipeline

Созданный на 26 апр. 2014  ·  6Комментарии  ·  Источник: scikit-learn/scikit-learn

Я получаю эту ошибку, когда пытаюсь использовать LabelBinarizer и LabelEncoder в конвейере:

sklearn/pipeline.pyc in fit_transform(self, X, y, **fit_params)
    141         Xt, fit_params = self._pre_transform(X, y, **fit_params)
    142         if hasattr(self.steps[-1][-1], 'fit_transform'):
--> 143             return self.steps[-1][-1].fit_transform(Xt, y, **fit_params)
    144         else:
    145             return self.steps[-1][-1].fit(Xt, y, **fit_params).transform(Xt)

TypeError: fit_transform() takes exactly 2 arguments (3 given)

Похоже, это связано с тем, что сигнатуры классов

Я думаю, что это довольно простое исправление (просто измените подпись на def(self, X, y=None) ), для которого я был бы рад отправить запрос на перенос, но я хотел проверить, есть ли другие причины, по которым подписи являются они такие, о которых я не думал.

Самый полезный комментарий

Я вижу, что на этой странице было много негативных отзывов. Я думаю, что цель LabelBinarizer и LabelEncoder долгое время не понимали. Это для целей, а не для функций. Хотя надо признать, что они были разработаны (и плохо названы) до меня.

Хотя я думаю, что пользователи могли использовать CountVectorizer (или DictVectorizer с dataframe.to_dict(orient='records') если вы переходите из фрейма данных) для этой цели в течение длительного времени, мы недавно объединили CategoricalEncoder (# 9151 ) в мастер, хотя это может быть добавлено в OneHotEncoer и новый OrdinalEncoder перед выпуском (# 10521).

Я надеюсь, что это удовлетворит потребности явно недовольного населения.

Я должен сказать, что как человек, который на протяжении почти пяти лет жертвовал огромное количество свободного времени на разработку этого проекта (и недавно был нанят для работы над ним), видя масштабы негативных реакций, а не конструктивных вкладов. в библиотеку довольно печально. Хотя, по общему признанию, мой ответ выше, что вы должны написать новую вещь, похожую на конвейер, а не новый преобразователь для категориальных входов, был недоразумением с моей стороны (и должен / мог быть исправлен другими), что, я надеюсь, можно понять во время проработки огромная рабочая нагрузка, связанная с поддержанием этого проекта.

Все 6 Комментарий

Я думаю, вы правы, что исправили это.

26 апреля 2014 г., 19:37, hxu [email protected] написал:

Я получаю эту ошибку, когда пытаюсь использовать LabelBinarizer и LabelEncoder в
Трубопровод:

sklearn / pipeline.pyc в fit_transform (self, X, y, * _fit_params)
141 Xt, fit_params = self._pre_transform (X, y, * _fit_params)
142 if hasattr (self.steps [-1] [- 1], 'fit_transform'): -> 143 return self.steps [-1] [- 1] .fit_transform (Xt, y, * _fit_params)
144 еще:
145 вернуть self.steps [-1] [- 1] .fit (Xt, y, * _fit_params) .transform (Xt)
TypeError: fit_transform () принимает ровно 2 аргумента (3 задано)

Похоже, это связано с тем, что классы подходят и преобразуют подпись https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/label.py#L85, отличаются от большинства других оценщиков и принимают только единственный аргумент.

Я думаю, что это довольно простое решение (просто измените подпись на def (self,
X, y = None)), для которого я был бы рад отправить запрос на перенос, но я хотел
проверьте, были ли другие причины того, что подписи такие, как они
это то, о чем я не думал.

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHub https://github.com/scikit-learn/scikit-learn/issues/3112
.

В # 3113 мы решили, что это не должно быть исправлено, потому что кодировка метки на самом деле не принадлежит Pipeline .

@jnothman , просто чтобы знать: что мне делать вместо этого, если мне нужно векторизовать категориальную функцию в конвейере?

Возможно, вам лучше написать свой собственный код Pipeline-like (возможно, унаследованный от существующего) для обработки вашего конкретного случая.

Вместо использования LabelBinarizer в конвейере я просто реализовал свой собственный преобразователь:

class CustomBinarizer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None,**fit_params):
        return self
    def transform(self, X):
        return LabelBinarizer().fit(X).transform(X)

Кажется, свое дело!

редактировать:

это лучшее решение:
https://github.com/scikit-learn/scikit-learn/pull/7375/files#diff -1e175ddb0d84aad0a578d34553f6f9c6

Я вижу, что на этой странице было много негативных отзывов. Я думаю, что цель LabelBinarizer и LabelEncoder долгое время не понимали. Это для целей, а не для функций. Хотя надо признать, что они были разработаны (и плохо названы) до меня.

Хотя я думаю, что пользователи могли использовать CountVectorizer (или DictVectorizer с dataframe.to_dict(orient='records') если вы переходите из фрейма данных) для этой цели в течение длительного времени, мы недавно объединили CategoricalEncoder (# 9151 ) в мастер, хотя это может быть добавлено в OneHotEncoer и новый OrdinalEncoder перед выпуском (# 10521).

Я надеюсь, что это удовлетворит потребности явно недовольного населения.

Я должен сказать, что как человек, который на протяжении почти пяти лет жертвовал огромное количество свободного времени на разработку этого проекта (и недавно был нанят для работы над ним), видя масштабы негативных реакций, а не конструктивных вкладов. в библиотеку довольно печально. Хотя, по общему признанию, мой ответ выше, что вы должны написать новую вещь, похожую на конвейер, а не новый преобразователь для категориальных входов, был недоразумением с моей стороны (и должен / мог быть исправлен другими), что, я надеюсь, можно понять во время проработки огромная рабочая нагрузка, связанная с поддержанием этого проекта.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги