En cuanto a las diferencias OrdinalEncoder
y la LabelEncoder
implementación , la respuesta aceptada menciona la forma de los datos: ( OrdinalEncoder
para datos 2D; forma (n_samples, n_features)
, LabelEncoder
es para datos 1D: para forma (n_samples,)
)
Es por eso OrdinalEncoder
que 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 LabelEncoder
vs 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 sklearn
clases / 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 LabelEncoder
y OrdinalEncoder
tienen 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 .
OrdinalEncoder
?