Scikit-learn: LabelBinarizer y LabelEncoder ajustan y transforman firmas no compatibles con Pipeline

Creado en 26 abr. 2014  ·  6Comentarios  ·  Fuente: scikit-learn/scikit-learn

Recibo este error cuando intento usar LabelBinarizer y LabelEncoder en una canalización:

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)

Parece que esto se debe a que las firmas fit y transform las clases son diferentes de la mayoría de los otros estimadores y solo aceptan un único argumento.

Creo que esta es una solución bastante fácil (solo cambie la firma a def(self, X, y=None) ) para la que estaría feliz de enviar una solicitud de extracción, pero quería verificar si había otras razones por las que las firmas son las la forma en que son que no pensé.

API

Comentario más útil

Veo que ha habido muchas reacciones negativas en esta página. Creo que ha habido un malentendido durante mucho tiempo sobre el propósito de LabelBinarizer y LabelEncoder. Estos son para objetivos, no para funciones. Aunque es cierto que fueron diseñados (y mal nombrados) antes de mi época.

Aunque creo que los usuarios podrían haber estado usando CountVectorizer (o DictVectorizer con dataframe.to_dict(orient='records') si vienes de un marco de datos) para este propósito durante mucho tiempo, recientemente hemos combinado un CategoricalEncoder (# 9151 ) en el maestro, aunque esto puede integrarse en OneHotEncoer y un nuevo OrdinalEncoder antes del lanzamiento (# 10521).

Espero que esto satisfaga las necesidades de una población claramente descontenta.

Debo decir que como alguien que ha estado ofreciendo enormes cantidades de tiempo libre para el desarrollo de este proyecto durante casi cinco años (y recientemente se ha empleado para trabajar en él también), viendo la magnitud de las reacciones negativas, en lugar de las contribuciones constructivas. a la biblioteca es bastante triste. Aunque es cierto que mi respuesta anterior de que debería escribir una nueva cosa similar a Pipeline, en lugar de un nuevo transformador para entradas categóricas, fue un malentendido de mi parte (y debería / podría haber sido corregido por otros), que espero que sea comprensible mientras se trabaja en la enorme carga de trabajo que está manteniendo este proyecto.

Todos 6 comentarios

Creo que tienes razón al arreglar eso.

El 26 de abril de 2014 a las 19:37, hxu [email protected] escribió:

Recibo este error cuando intento usar LabelBinarizer y LabelEncoder en un
Tubería:

sklearn / pipeline.pyc en 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 más:
145 return self.steps [-1] [- 1] .fit (Xt, y, * _fit_params) .transform (Xt)
TypeError: fit_transform () toma exactamente 2 argumentos (3 dados)

Parece que esto se debe a que las firmas de ajuste y transformación de las clases son diferentes de la mayoría de los otros estimadores y solo aceptan un solo argumento.

Creo que esta es una solución bastante fácil (solo cambie la firma a def (self,
X, y = None)) para el que estaría feliz de enviar una solicitud de extracción, pero quería
compruebe si hubo otras razones por las que las firmas son la forma en que
son en las que no pensé.

-
Responda a este correo electrónico directamente o véalo en Gi
.

En # 3113 hemos decidido que esto no se va a arreglar porque la codificación de etiquetas no pertenece realmente a un Pipeline .

@jnothman , solo para saber: ¿qué debería hacer en su lugar si necesito vectorizar una característica categórica en una canalización?

Es mejor que escriba su propio código Pipeline-like (quizás heredando del existente) para manejar su caso específico.

En lugar de usar LabelBinarizer en una canalización, acabo de implementar mi propio transformador:

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

¡Parece funcionar!

editar:

esta es una mejor solución:
https://github.com/scikit-learn/scikit-learn/pull/7375/files#diff -1e175ddb0d84aad0a578d34553f6f9c6

Veo que ha habido muchas reacciones negativas en esta página. Creo que ha habido un malentendido durante mucho tiempo sobre el propósito de LabelBinarizer y LabelEncoder. Estos son para objetivos, no para funciones. Aunque es cierto que fueron diseñados (y mal nombrados) antes de mi época.

Aunque creo que los usuarios podrían haber estado usando CountVectorizer (o DictVectorizer con dataframe.to_dict(orient='records') si vienes de un marco de datos) para este propósito durante mucho tiempo, recientemente hemos combinado un CategoricalEncoder (# 9151 ) en el maestro, aunque esto puede integrarse en OneHotEncoer y un nuevo OrdinalEncoder antes del lanzamiento (# 10521).

Espero que esto satisfaga las necesidades de una población claramente descontenta.

Debo decir que como alguien que ha estado ofreciendo enormes cantidades de tiempo libre para el desarrollo de este proyecto durante casi cinco años (y recientemente se ha empleado para trabajar en él también), viendo la magnitud de las reacciones negativas, en lugar de las contribuciones constructivas. a la biblioteca es bastante triste. Aunque es cierto que mi respuesta anterior de que debería escribir una nueva cosa similar a Pipeline, en lugar de un nuevo transformador para entradas categóricas, fue un malentendido de mi parte (y debería / podría haber sido corregido por otros), que espero que sea comprensible mientras se trabaja en la enorme carga de trabajo que está manteniendo este proyecto.

¿Fue útil esta página
0 / 5 - 0 calificaciones