Per quanto riguarda le differenze OrdinalEncoder
e l' LabelEncoder
implementazione , la risposta accettata menziona la forma dei dati: ( OrdinalEncoder
per dati 2D; forma (n_samples, n_features)
, LabelEncoder
è per dati 1D: per forma (n_samples,)
)
Ecco perché OrdinalEncoder
si 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 LabelEncoder
vs OrdinalEncoder
e 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 sklearn
classi / 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 LabelEncoder
e OrdinalEncoder
avere 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
?