Per quanto riguarda le differenze OrdinalEncodere l' LabelEncoder implementazione , la risposta accettata menziona la forma dei dati: ( OrdinalEncoderper dati 2D; forma (n_samples, n_features), LabelEncoderè per dati 1D: per forma (n_samples,))
Ecco perché OrdinalEncodersi otterrebbe un errore:
ValueError: Expected 2D array, got 1D array instead:
... se si cerca di adattarsi ai dati 1D: OrdinalEncoder().fit(['a','b'])
Tuttavia, un'altra differenza tra gli encoder è il nome del loro parametro appreso ;
LabelEncoder impara classes_
OrdinalEncoder impara categories_
Notare le differenze nell'adattamento LabelEncodervs OrdinalEncodere le differenze nei valori di questi parametri appresi. LabelEncoder.classes_è 1D, mentre OrdinalEncoder.categories_è 2D.
LabelEncoder().fit(['a','b']).classes_
# >>> array(['a', 'b'], dtype='<U1')
OrdinalEncoder().fit([['a'], ['b']]).categories_
# >>> [array(['a', 'b'], dtype=object)]
Anche altri codificatori che funzionano in 2D, incluso OneHotEncoder, usano la proprietàcategories_
Maggiori informazioni qui sul dtype <U1(little-endian, Unicode, 1 byte; cioè una stringa con lunghezza 1)
MODIFICARE
Nei commenti alla mia risposta, Piotr non è d'accordo ; Piotr sottolinea la differenza tra la codifica ordinale e la codifica dell'etichetta più in generale.
- Codifica ordinale sono buoni per le variabili ordinali (dove le questioni di ordine, come
cold, warm, hot);
- vs una variabile non ordinale (aka nominale ) (dove l'ordine non ha importanza, come
blonde, brunette)
Questo è un ottimo concetto, ma questa domanda fa domande sulle sklearnclassi / implementazione. È interessante vedere come l'implementazione non corrisponda ai concetti; soprattutto OrdinalEncoder; nello specifico come devi eseguire tu stesso la codifica ordinale .
Per quanto riguarda la realizzazione sembra che LabelEncodere OrdinalEncoderavere un comportamento coerente per quanto riguarda i numeri interi scelti . Hanno entrambi numeri interi assegnare sulla base di ordine alfabetico . Per esempio:
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)
Notare come entrambi gli encoder hanno assegnato numeri interi in ordine alfabetico 'c' <'h' <'w'.
Ma questa parte è importante: notate come nessuno dei due encoder abbia corretto l' ordine "reale" (cioè l'ordine reale dovrebbe riflettere la temperatura, dove l'ordine è 'freddo' <'caldo' <'caldo'); in base all'ordine "reale", al valore 'warm'sarebbe stato assegnato l'intero 1.
Nel post del blog a cui fa riferimento Piotr , l'autore non lo usa nemmenoOrdinalEncoder() . Per ottenere la codifica ordinale l'autore lo fa manualmente: mappa ogni temperatura su un numero intero "reale", usando un dizionario come{'cold':0, 'warm':1, 'hot':2}:
Fare riferimento a questo codice usando Panda, dove per prima cosa dobbiamo assegnare l'ordine reale della variabile attraverso un dizionario ... Anche se è molto semplice ma richiede una codifica per dire i valori ordinali e qual è la mappatura effettiva dal testo all'intero secondo l'ordine.
In altre parole, se ti stai chiedendo se utilizzare OrdinalEncoder, ti preghiamo di notare che in OrdinalEncoder realtà non è possibile fornire la "codifica ordinale" come ti aspetti !
OrdinalEncoder?