2016-08-03 11 views
3

Ich bin passend ein Scikit-Learn LabelEncoder auf einer Säule in einem Pandas df.LabelEncoder Reihenfolge des Sitzes für eine Pandas df

Wie wird die Reihenfolge, in der die aufgetretenen Strings den ganzen Zahlen zugeordnet sind, bestimmt? Ist es deterministisch? wichtiger

Mehr kann ich diese Bestellung angeben?

import pandas as pd 
from sklearn import preprocessing 

df = pd.DataFrame(data=["first", "second", "third", "fourth"], columns=['x']) 
le = preprocessing.LabelEncoder() 
le.fit(df['x']) 
print list(le.classes_) 
### this prints ['first', 'fourth', 'second', 'third'] 
encoded = le.transform(["first", "second", "third", "fourth"]) 
print encoded 
### this prints [0 2 3 1] 

würde ich erwarten, le.classes_["first", "second", "third", "fourth"] und dann encoded sein [0 1 2 3] zu sein, da dies die Reihenfolge, in der die Zeichenfolge in der Spalte angezeigt. Kann das gemacht werden?

+0

ich auch mit dem LabelEncoder, codierte Zeichenfolge, auf ganzzahlige Labels arbeitete und mit einem Problem kommen, wo der Benutzer eine bestimmte Reihenfolge erscheinen die Nummernschilder will, ist, wie einfach beschreiben Sie. Finde heraus, wie es geht? Ich muss wahrscheinlich nur mein eigenes schreiben. –

+1

Rollen Sie entweder eine benutzerdefinierte Lösung wie Sie gesagt haben, oder reparieren Sie die scikit-learn Version und verlassen Sie sich auf die Sortierreihenfolge, wie in der Antwort von Mephy beschrieben. So sieht es für mich aus. – tkja

+1

yeah thanks Ich habe es gerade ein dict lookup gemacht, das sowieso ziemlich schnell ist. Danke –

Antwort

1

Es ist in Art Reihenfolge. Bei Strings erfolgt dies in alphabetischer Reihenfolge. Es gibt keine Dokumentation für diese, aber auf dem Quellcode der Suche nach LabelEncoder.transform wir die Arbeit sehen können, vor allem auf die Funktion delegiert numpy.setdiff1d mit folgenden Dokumentation:

Finden Sie die eingestellte Differenz von zwei Arrays.

Geben Sie die sortierten, eindeutige Werte in ar1 zurück, die nicht in ar2 sind.

(Schwerpunkt meiner).

Beachten Sie, dass da dies nicht dokumentiert ist, es definiert wahrscheinlich Implementierung und kann zwischen den Versionen geändert werden. Es könnte sein, dass nur die Version, die ich angeschaut habe, die Sortierreihenfolge verwendet, und andere Versionen von scikit-learn können dieses Verhalten ändern (indem numpy.setdiff1d nicht verwendet wird).

+0

Zumindest für die aktuelle Version ist klar, wie es gemacht wird, und es verhält sich deterministisch. – tkja

+0

@tkja Aber ich würde mich lieber nicht darauf verlassen. Wenn es für Ihre Anwendung wichtig ist, könnte die Verschlüsselung auch selbst implementiert werden. Wenn Sie sich darauf verlassen und es sich jemals ändert, wird es sehr schwierig sein, den Fehler zu verfolgen. – Mephy

Verwandte Themen