Diferencia entre OrdinalEncoder y LabelEncoder

21

Estaba revisando la documentación oficial de scikit-learn learn después de leer un libro sobre ML y encontré lo siguiente:

En la Documentación se trata, sklearn.preprocessing.OrdinalEncoder()mientras que en el libro se trata sklearn.preprocessing.LabelEncoder(), cuando verifiqué su funcionalidad, me pareció lo mismo. ¿Puede alguien decirme la diferencia entre los dos por favor?

Saurabh Singh
fuente

Respuestas:

15

Afaik, ambos tienen la misma funcionalidad. Una pequeña diferencia es la idea detrás. OrdinalEncoderes para convertir características, mientras que LabelEncoderes para convertir variables objetivo.

Es por eso que OrdinalEncoderpuede ajustar datos que tienen la forma de (n_samples, n_features)while LabelEncoder, pero solo puede ajustar datos que tienen la forma de (n_samples,)(aunque en el pasado se usaba LabelEncoderdentro del bucle para manejar lo que se ha convertido en el trabajo de OrdinalEncoderahora)

bakka
fuente
Cuándo utilizar OrdinalEncoder?
stackunderflow
Según la documentación citada en ese enlace, "[ LabelEncoderno] está destinado a ser utilizado en funciones, solo en objetivos de aprendizaje supervisados".
Yehuda
5

En cuanto a las diferencias OrdinalEncodery la LabelEncoder implementación , la respuesta aceptada menciona la forma de los datos: ( OrdinalEncoderpara datos 2D; forma (n_samples, n_features), LabelEncoderes para datos 1D: para forma (n_samples,))

Es por eso OrdinalEncoderque a obtendría un error:

ValueError: Expected 2D array, got 1D array instead:

... si intenta encajar en datos 1D: OrdinalEncoder().fit(['a','b'])

Sin embargo, otra diferencia entre los codificadores es el nombre de su parámetro aprendido ;

  • LabelEncoder aprende classes_
  • OrdinalEncoder aprende categories_

Observe las diferencias en el ajuste LabelEncodervs OrdinalEncoder, y las diferencias en los valores de estos parámetros aprendidos. LabelEncoder.classes_es 1D, mientras que OrdinalEncoder.categories_es 2D.

LabelEncoder().fit(['a','b']).classes_
# >>> array(['a', 'b'], dtype='<U1')

OrdinalEncoder().fit([['a'], ['b']]).categories_
# >>> [array(['a', 'b'], dtype=object)]

Otros codificadores que funcionan en 2D, incluido OneHotEncoder, también usan la propiedadcategories_

Más información aquí sobre el dtype <U1(little-endian, Unicode, 1 byte; es decir, una cadena con longitud 1)

EDITAR

En los comentarios a mi respuesta, Piotr no está de acuerdo ; Piotr señala la diferencia entre la codificación ordinal y la codificación de etiquetas de manera más general.

  • Codificación ordinal son buenos para variables ordinales (donde las cuestiones de orden, como cold, warm, hot);
  • vs una variable no ordinal (también conocida como nominal ) (donde el orden no importa, como blonde, brunette)

Este es un gran concepto, pero esta pregunta se refiere a las sklearnclases / implementación. Es interesante ver cómo la implementación no coincide con los conceptos; en especial OrdinalEncoder; específicamente cómo debes hacer la codificación ordinal tú mismo .

En cuanto a la aplicación parece que LabelEncodery OrdinalEncodertienen un comportamiento coherente en cuanto a los números enteros elegidos . Ellos ambos números enteros asignar basados en orden alfabético . Por ejemplo:

OrdinalEncoder().fit_transform([['cold'],['warm'],['hot']]).reshape((1,3))
# >>> array([[0., 2., 1.]])

LabelEncoder().fit_transform(['cold','warm','hot'])
# >>> array([0, 2, 1], dtype=int64)

Observe cómo ambos codificadores asignaron enteros en orden alfabético 'c' <'h' <'w'.

Pero esta parte es importante: observe cómo ninguno de los codificadores obtuvo el orden "real" correcto (es decir, el orden real debe reflejar la temperatura, donde el orden es 'frío' <'cálido' <'caliente'); basado en el orden "real", al valor se 'warm'le habría asignado el entero 1.

En la publicación de blog a la que hace referencia Piotr , el autor ni siquiera lo usaOrdinalEncoder() . Para lograr la codificación ordinal, el autor lo hace manualmente: asigna cada temperatura a un entero de orden "real", usando un diccionario como{'cold':0, 'warm':1, 'hot':2}:

Consulte este código usando Pandas, donde primero debemos asignar el orden real de la variable a través de un diccionario ... Aunque es muy sencillo, pero requiere codificación para indicar los valores ordinales y cuál es la asignación real del texto al entero según el orden.

En otras palabras, si se pregunta si usarlo OrdinalEncoder, tenga en cuenta OrdinalEncoder que en realidad no puede proporcionar la "codificación ordinal" de la manera que espera .

El guisante rojo
fuente
2
Estoy totalmente en desacuerdo. Los conceptos detrás de estas técnicas de codificación difieren fundamentalmente. No se trata solo de implementación en una biblioteca.
Piotr Rarus - Restablece a Mónica el
1

Utiliza la codificación ordinal para preservar el orden de los datos categóricos, es decir, frío, cálido, caliente; bajo medio alto. Utiliza la codificación de etiquetas o un hot para datos categóricos, donde no hay orden en los datos, es decir, perro, gato, ballena. Mira esta publicación en medio. Explica bien estos conceptos.

Piotr Rarus - Restablece a Monica
fuente
1
Quizás haya una inconsistencia en la terminología, pero esto parece incorrecto con respecto a la pregunta del OP sobre LabelEncoder de sklearn; codifica como enteros de 0 a n_classes-1, lo mismo que OrdinalEncoder.
Ben Reiniger