Differenza tra OrdinalEncoder e LabelEncoder


21

Stavo esaminando la documentazione ufficiale di scikit-learn learn dopo aver letto un libro su ML e mi sono imbattuto nella seguente cosa:

Nella Documentazione è data sklearn.preprocessing.OrdinalEncoder()mentre mentre nel libro è stata data sklearn.preprocessing.LabelEncoder(), quando ho verificato la loro funzionalità mi è sembrato lo stesso. Qualcuno può dirmi la differenza tra i due, per favore?

Risposte:


15

Dopo tutto, entrambi hanno la stessa funzionalità. Una piccola differenza è l'idea alla base. OrdinalEncoderè per la conversione di funzionalità, mentre LabelEncoderper la conversione della variabile di destinazione.

Ecco perché OrdinalEncoderpossono adattarsi a dati che hanno la forma di (n_samples, n_features)while LabelEncoderpossono solo adattarsi a dati che hanno la forma di (n_samples,)(anche se in passato uno usato LabelEncodernel ciclo per gestire ciò che è diventato il lavoro di OrdinalEncoderoggi)


Quando usare OrdinalEncoder?
Stackunderflow


Secondo la documentazione citata a quel link, "[ LabelEncodernon] è destinato a essere utilizzato su funzionalità, ma solo su obiettivi di apprendimento supervisionato".
Yehuda,

5

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 !


2
Sono fortemente in disaccordo. I concetti alla base di queste tecniche di codifica differiscono sostanzialmente. Non si tratta solo dell'implementazione in una libreria.
Piotr Rarus - Ripristina Monica il

1

Si utilizza la codifica ordinale per preservare l'ordine dei dati categorici, ovvero freddo, caldo, caldo; basso medio alto. Si utilizza la codifica dell'etichetta o una hot per i dati categorici, in cui non vi è alcun ordine nei dati, ad esempio cane, gatto, balena. Controlla questo post su supporto. Spiega bene questi concetti.


1
Forse c'è un'incoerenza nella terminologia, ma questo sembra errato rispetto alla domanda del PO su LabelEncoder di sklearn; codifica come numeri interi da 0 a n_classes-1, lo stesso di OrdinalEncoder.
Ben Reiniger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.