Ich habe ein Klassifizierungsproblem beim maschinellen Lernen mit 80% kategorialen Variablen. Muss ich eine Hot-Codierung verwenden, wenn ich einen Klassifizierer für die Klassifizierung verwenden möchte? Kann ich die Daten ohne Codierung an einen Klassifizierer übergeben?
Ich versuche Folgendes für die Funktionsauswahl zu tun:
Ich habe die Zugakte gelesen:
num_rows_to_read = 10000 train_small = pd.read_csv("../../dataset/train.csv", nrows=num_rows_to_read)
Ich ändere den Typ der kategorialen Features in "Kategorie":
non_categorial_features = ['orig_destination_distance', 'srch_adults_cnt', 'srch_children_cnt', 'srch_rm_cnt', 'cnt'] for categorical_feature in list(train_small.columns): if categorical_feature not in non_categorial_features: train_small[categorical_feature] = train_small[categorical_feature].astype('category')
Ich benutze eine Hot-Codierung:
train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
Das Problem ist, dass der 3. Teil oft stecken bleibt, obwohl ich eine starke Maschine benutze.
Daher kann ich ohne die einzige Hot-Codierung keine Feature-Auswahl treffen, um die Wichtigkeit der Features zu bestimmen.
Was empfehlen Sie?
drop_first=True
mitget_dummies
beseitigt die Notwendigkeit, die ursprüngliche Spalte separat zuEs ist viel einfacher, Pandas für die einfache One-Hot-Codierung zu verwenden. Wenn Sie nach mehr Optionen suchen, können Sie diese verwenden
scikit-learn
.Für die einfache One-Hot-Codierung mit Pandas übergeben Sie einfach Ihren Datenrahmen an die Datenrahmen an die Funktion get_dummies .
Wenn ich zum Beispiel einen Datenrahmen namens imdb_movies habe :
... und ich möchte die Spalte "Rated" mit einem Hot-Coding codieren. Ich mache einfach Folgendes:
Dies gibt eine neue
dataframe
mit einer Spalte für jede „ Ebene “ der Bewertung , die, zusammen mit entweder 1 oder 0 Angabe der Anwesenheit dieser Bewertung für eine gegebene Beobachtung existiert.Normalerweise möchten wir, dass dies Teil des Originals ist
dataframe
. In diesem Fall befestigen wir einfach unseren neuen Dummy-codierten Rahmen mit " Spaltenbindung " am Originalrahmen .Wir können mithilfe von Pandas Spalten binden Concat- Funktion :
Wir können jetzt eine vollständige Analyse durchführen
dataframe
.EINFACHE NUTZFUNKTION
Ich würde empfehlen, sich eine zu machen Utility-Funktion zu machen, um dies schnell zu erledigen:
Verwendung :
Ergebnis :
Auch gemäß @ pmalbu Kommentar, wenn Sie die Funktion möchten den ursprünglichen feature_to_encode entfernt, verwenden Sie diese Version:
Sie können mehrere Funktionen gleichzeitig wie folgt codieren:
quelle
Sie können dies mit
numpy.eye
und unter Verwendung des Auswahlmechanismus für Array-Elemente tun :Der Rückgabewert von
indices_to_one_hot(nb_classes, data)
ist jetztDas
.reshape(-1)
ist da, um sicherzustellen, dass Sie das richtige Etikettenformat haben (möglicherweise auch[[2], [3], [4], [0]]
).quelle
Erstens, der einfachste Weg zu einer Hot-Codierung: Verwenden Sie Sklearn.
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
Zweitens denke ich nicht, dass die Verwendung von Pandas für eine Hot-Codierung so einfach ist (allerdings nicht bestätigt).
Erstellen von Dummy-Variablen in Pandas für Python
Ist es für Sie schließlich notwendig, eine Hot-Codierung durchzuführen? Eine Hot-Codierung erhöht die Anzahl der Features exponentiell und erhöht die Laufzeit eines Klassifikators oder anderer Elemente, die Sie ausführen möchten, drastisch. Besonders wenn jedes kategoriale Merkmal viele Ebenen hat. Stattdessen können Sie Dummy-Codierung durchführen.
Die Verwendung der Dummy-Codierung funktioniert normalerweise gut, bei viel weniger Laufzeit und Komplexität. Ein weiser Professor sagte mir einmal: "Weniger ist mehr".
Hier ist der Code für meine benutzerdefinierte Codierungsfunktion, wenn Sie möchten.
EDIT: Vergleich um klarer zu sein:
One-Hot-Codierung: Konvertieren Sie n Ebenen in n-1 Spalten.
Sie können sehen, wie dies Ihr Gedächtnis explodieren lässt, wenn Ihre kategoriale Funktion viele verschiedene Typen (oder Ebenen) enthält. Denken Sie daran, dies ist nur eine Spalte.
Dummy-Codierung:
Konvertieren Sie stattdessen in numerische Darstellungen. Spart viel Platz für Funktionen, was ein wenig Genauigkeit kostet.
quelle
mouse > cat > dog
dies nicht der Fall ist.get_dummies
ist der einfachste Weg, kategoriale Variablen aus meiner Erfahrung in modellfreundliche Daten zu übertragen (wenn auch sehr begrenzt)Eine Hot-Codierung mit Pandas ist sehr einfach:
BEARBEITEN:
Ein anderer Weg zu one_hot mit sklearn's
LabelBinarizer
:quelle
Sie können die Funktion numpy.eye verwenden.
Ergebnis
quelle
pandas as hat die eingebaute Funktion "get_dummies", um eine Hot-Codierung dieser bestimmten Spalte (n) zu erhalten.
Einzeilencode für One-Hot-Codierung:
quelle
Hier ist eine Lösung mit
DictVectorizer
und der Pandas-DataFrame.to_dict('records')
Methode.quelle
One-Hot-Codierung erfordert etwas mehr als die Konvertierung der Werte in Indikatorvariablen. In der Regel müssen Sie beim ML-Prozess diese Codierung mehrmals auf Validierungs- oder Testdatensätze anwenden und das von Ihnen erstellte Modell auf beobachtete Echtzeitdaten anwenden. Sie sollten die Zuordnung (Transformation) speichern, die zum Erstellen des Modells verwendet wurde. Eine gute Lösung wäre das
DictVectorizer
oderLabelEncoder
(gefolgt vonget_dummies
. Hier ist eine Funktion, die Sie verwenden können:Dies funktioniert bei einem Pandas-Datenrahmen und für jede Spalte des Datenrahmens wird eine Zuordnung erstellt und zurückgegeben. Sie würden es also so nennen:
Bei den Testdaten erfolgt der Anruf dann, indem das vom Training zurückgegebene Wörterbuch zurückgegeben wird:
Eine äquivalente Methode ist zu verwenden
DictVectorizer
. Ein verwandter Beitrag dazu befindet sich in meinem Blog. Ich erwähne es hier, da es einige Gründe für diesen Ansatz liefert, einfach den Beitrag get_dummies zu verwenden (Offenlegung: Dies ist mein eigener Blog).quelle
Sie können die Daten ohne Codierung an den Catboost-Klassifizierer übergeben. Catboost verarbeitet kategoriale Variablen selbst, indem es eine One-Hot- und Target-Expanding-Mean-Codierung durchführt.
quelle
Sie können auch Folgendes tun. Hinweis für das Folgende müssen Sie nicht verwenden
pd.concat
.Sie können explizite Spalten auch in kategorial ändern. Zum Beispiel ändere ich hier das
Color
undGroup
quelle
Ich weiß, dass ich zu spät zu dieser Party komme, aber der einfachste Weg, einen Datenrahmen automatisch heiß zu codieren, ist die Verwendung dieser Funktion:
quelle
Ich habe dies in meinem akustischen Modell verwendet: wahrscheinlich hilft dies in Ihrem Modell.
quelle
Um weitere Fragen zu ergänzen, möchte ich erläutern, wie ich es mit einer Python 2.0-Funktion unter Verwendung von Numpy gemacht habe:
Die Linie
n_values = np.max(y_) + 1
könnte für Sie fest codiert sein, um die gute Anzahl von Neuronen zu verwenden, falls Sie beispielsweise Mini-Batches verwenden.Demo-Projekt / Tutorial, in dem diese Funktion verwendet wurde: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition
quelle
Das funktioniert bei mir:
Ausgabe:
quelle
Es kann und sollte einfach sein als:
Verwendung :
quelle
Erweitern der Antwort von @Martin Thoma
quelle
Kurze Antwort
Hier ist eine Funktion zum Ausführen einer One-Hot-Codierung ohne Verwendung von Numpy, Pandas oder anderen Paketen. Es wird eine Liste von Ganzzahlen, Booleschen Werten oder Zeichenfolgen (und möglicherweise auch anderen Typen) benötigt.
Beispiel:
Lange Antwort
Ich weiß, dass es bereits viele Antworten auf diese Frage gibt, aber ich habe zwei Dinge bemerkt. Erstens verwenden die meisten Antworten Pakete wie Numpy und / oder Pandas. Und das ist gut so. Wenn Sie Produktionscode schreiben, sollten Sie wahrscheinlich robuste, schnelle Algorithmen verwenden, wie sie in den numpy / pandas-Paketen enthalten sind. Aus Gründen der Bildung denke ich jedoch, dass jemand eine Antwort geben sollte, die einen transparenten Algorithmus und nicht nur eine Implementierung des Algorithmus eines anderen hat. Zweitens habe ich festgestellt, dass viele der Antworten keine robuste Implementierung der One-Hot-Codierung bieten, da sie eine der folgenden Anforderungen nicht erfüllen. Im Folgenden sind einige der Anforderungen (wie ich sie sehe) für eine nützliche, genaue und robuste One-Hot-Codierungsfunktion aufgeführt:
Eine One-Hot-Codierungsfunktion muss:
Ich habe viele der Antworten auf diese Frage getestet und die meisten scheitern an einer der oben genannten Anforderungen.
quelle
Versuche dies:
df_encoded.head ()
Der resultierende Datenrahmen
df_train_encoded
ist derselbe wie das Original, aber die kategorialen Funktionen werden jetzt durch ihre One-Hot-codierten Versionen ersetzt.Weitere Informationen
category_encoders
hier .quelle
Hier habe ich mit diesem Ansatz versucht:
quelle