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 .
OrdinalEncoder?