Wie für Unterschiede in OrdinalEncoder
und LabelEncoder
Implementierung , die akzeptierte Antwort , die Form der Daten erwähnt: ( OrdinalEncoder
für 2D - Daten, Form (n_samples, n_features)
, LabelEncoder
ist für 1D - Daten: für Form (n_samples,)
)
Deshalb OrdinalEncoder
wü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 LabelEncoder
vs OrdinalEncoder
und 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, OneHotEncoder
verwenden 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 sklearn
Klassen / 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 LabelEncoder
und OrdinalEncoder
haben 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
?