Я получаю эту ошибку, когда пытаюсь использовать 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)
), для которого я был бы рад отправить запрос на перенос, но я хотел проверить, есть ли другие причины, по которым подписи являются они такие, о которых я не думал.
Я думаю, вы правы, что исправили это.
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).
Я надеюсь, что это удовлетворит потребности явно недовольного населения.
Я должен сказать, что как человек, который на протяжении почти пяти лет жертвовал огромное количество свободного времени на разработку этого проекта (и недавно был нанят для работы над ним), видя масштабы негативных реакций, а не конструктивных вкладов. в библиотеку довольно печально. Хотя, по общему признанию, мой ответ выше, что вы должны написать новую вещь, похожую на конвейер, а не новый преобразователь для категориальных входов, был недоразумением с моей стороны (и должен / мог быть исправлен другими), что, я надеюсь, можно понять во время проработки огромная рабочая нагрузка, связанная с поддержанием этого проекта.
Самый полезный комментарий
Я вижу, что на этой странице было много негативных отзывов. Я думаю, что цель LabelBinarizer и LabelEncoder долгое время не понимали. Это для целей, а не для функций. Хотя надо признать, что они были разработаны (и плохо названы) до меня.
Хотя я думаю, что пользователи могли использовать CountVectorizer (или DictVectorizer с
dataframe.to_dict(orient='records')
если вы переходите из фрейма данных) для этой цели в течение длительного времени, мы недавно объединилиCategoricalEncoder
(# 9151 ) в мастер, хотя это может быть добавлено в OneHotEncoer и новый OrdinalEncoder перед выпуском (# 10521).Я надеюсь, что это удовлетворит потребности явно недовольного населения.
Я должен сказать, что как человек, который на протяжении почти пяти лет жертвовал огромное количество свободного времени на разработку этого проекта (и недавно был нанят для работы над ним), видя масштабы негативных реакций, а не конструктивных вкладов. в библиотеку довольно печально. Хотя, по общему признанию, мой ответ выше, что вы должны написать новую вещь, похожую на конвейер, а не новый преобразователь для категориальных входов, был недоразумением с моей стороны (и должен / мог быть исправлен другими), что, я надеюсь, можно понять во время проработки огромная рабочая нагрузка, связанная с поддержанием этого проекта.