Unterschied zwischen OrdinalEncoder und LabelEncoder


20

Nachdem ich ein Buch über ML durchgesehen hatte, ging ich die offizielle Dokumentation von scikit-learn learn durch und stieß auf Folgendes:

In der Dokumentation wird darüber berichtet, sklearn.preprocessing.OrdinalEncoder()während es in dem Buch, über das es gegeben wurde sklearn.preprocessing.LabelEncoder(), für mich gleich aussah, als ich ihre Funktionalität überprüfte. Kann mir bitte jemand den Unterschied zwischen den beiden sagen?

Antworten:


15

Afaik, beide haben die gleiche Funktionalität. Ein kleiner Unterschied ist die Idee dahinter. OrdinalEncoderdient zum Konvertieren von Features und LabelEncoderzum Konvertieren von Zielvariablen.

Aus diesem Grund OrdinalEncoderkönnen Daten, die die Form von (n_samples, n_features)while haben, LabelEncodernur Daten angepasst werden, die die Form von haben (n_samples,)(obwohl sie in der Vergangenheit LabelEncoderinnerhalb der Schleife verwendet wurden, um das zu handhaben, was OrdinalEncoderjetzt zur Aufgabe geworden ist ).


Wann verwenden OrdinalEncoder?
Stackunderflow


Gemäß der unter diesem Link zitierten Dokumentation "soll [[ LabelEncoder] nicht für Funktionen verwendet werden, sondern nur für überwachte Lernziele."
Yehuda

4

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 !


2
Ich bin absolut anderer Meinung. Die Konzepte hinter diesen Codierungstechniken unterscheiden sich grundlegend. Es geht nicht nur um die Implementierung in einer Bibliothek.
Piotr Rarus - Stellen Sie Monica

1

Sie verwenden die Ordnungscodierung, um die Reihenfolge der kategorialen Daten beizubehalten, z. B. kalt, warm, heiß. Niedrig Mittel Hoch. Sie verwenden die Etikettencodierung oder eine Hot-Codierung für kategoriale Daten, bei denen die Daten keine Reihenfolge haben, z. B. Hund, Katze, Wal. Überprüfen Sie diesen Beitrag auf Medium. Es erklärt diese Konzepte gut.


1
Vielleicht gibt es eine Inkonsistenz in der Terminologie, aber dies scheint in Bezug auf die Frage des OP zu sklearns LabelEncoder falsch zu sein. Es codiert als Ganzzahlen von 0 bis n_classes-1, genau wie OrdinalEncoder.
Ben Reiniger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.