Wie für Unterschiede in OrdinalEncoderund LabelEncoder Implementierung , die akzeptierte Antwort , die Form der Daten erwähnt: ( OrdinalEncoderfür 2D - Daten, Form (n_samples, n_features), LabelEncoderist für 1D - Daten: für Form (n_samples,))
Deshalb OrdinalEncoderwürde a einen Fehler bekommen:
ValueError: Expected 2D array, got 1D array instead:
... wenn Sie versuchen, auf 1D-Daten zu passen: OrdinalEncoder().fit(['a','b'])
Ein weiterer Unterschied zwischen den Encodern ist jedoch der Name ihres gelernten Parameters .
LabelEncoder lernt classes_
OrdinalEncoder lernt categories_
Beachten Sie die Unterschiede in der Anpassung LabelEncodervs OrdinalEncoderund die Unterschiede in den Werten dieser gelernten Parameter. LabelEncoder.classes_ist 1D, während OrdinalEncoder.categories_2D ist.
LabelEncoder().fit(['a','b']).classes_
# >>> array(['a', 'b'], dtype='<U1')
OrdinalEncoder().fit([['a'], ['b']]).categories_
# >>> [array(['a', 'b'], dtype=object)]
Andere Encoder, die in 2D arbeiten, OneHotEncoderverwenden die Eigenschaft ebenfallscategories_
Weitere Informationen hier zum dtype <U1(Little-Endian, Unicode, 1 Byte; dh eine Zeichenfolge mit der Länge 1)
BEARBEITEN
In den Kommentaren zu meiner Antwort ist Piotr anderer Meinung ; Piotr weist darauf hin , den Unterschied zwischen ordinal Codierung und Etiketten kodieren allgemeiner.
- Ordinal - Kodierung ist gut für die Ordnungsvariablen (wobei um Angelegenheiten, wie
cold, warm, hot);
- vs einem nicht-Ordnungs (aka nominal ) Variable (wo Reihenfolge spielt keine Rolle, wie
blonde, brunette)
Dies ist ein großartiges Konzept, aber diese Frage fragt nach den sklearnKlassen / Implementierungen. Es ist interessant zu sehen, wie die Implementierung nicht zu den Konzepten passt. besonders OrdinalEncoder; speziell, wie Sie die Ordnungscodierung selbst durchführen müssen .
Wie für die Umsetzung scheint es , wie LabelEncoderund OrdinalEncoderhaben ein einheitliches Verhalten bis zu den gewählten Zahlen . Sie beide assign ganzen Zahlen basierend auf alphabetischer Reihenfolge . Zum Beispiel:
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)
Beachten Sie, wie beide Encoder Ganzzahlen in alphabetischer Reihenfolge 'c' <'h' <'w' zugewiesen haben .
Dieser Teil ist jedoch wichtig: Beachten Sie, dass keiner der Encoder die "echte" Reihenfolge korrekt erhalten hat (dh die tatsächliche Reihenfolge sollte die Temperatur widerspiegeln, wobei die Reihenfolge "kalt" <"warm" <"heiß" ist). basierend auf der "realen" Reihenfolge hätte der Wert 'warm'die ganze Zahl 1 erhalten.
In dem von Piotr referenzierten Blog-Beitrag verwendet der Autor nicht einmalOrdinalEncoder() . Um eine ordinale Codierung zu erreichen , führt der Autor dies manuell durch: Ordnet jede Temperatur einer "echten" Ordnungszahl zu, wobei ein Wörterbuch wie das folgende verwendet wird{'cold':0, 'warm':1, 'hot':2}:
Beziehen Sie sich auf diesen Code mit Pandas, wo wir zuerst die tatsächliche Reihenfolge der Variablen durch ein Wörterbuch zuweisen müssen ... Obwohl es sehr einfach ist, erfordert es eine Codierung, um Ordnungswerte und die tatsächliche Zuordnung von Text zu Ganzzahl gemäß zu bestimmen die Bestellung.
Mit anderen Worten, wenn Sie sich fragen, ob Sie es verwenden sollen OrdinalEncoder, beachten Sie bitteOrdinalEncoder dass die "Ordnungscodierung" möglicherweise nicht so ist, wie Sie es erwarten !
OrdinalEncoder?