Ich mache einige Probleme bei der Anwendung von Decision Tree / Random Forest. Ich versuche, ein Problem zu lösen, bei dem sowohl Zahlen als auch Zeichenfolgen (z. B. der Name des Landes) als Merkmale verwendet werden. Jetzt nimmt die Bibliothek, scikit-learn, nur Zahlen als Parameter, aber ich möchte die Zeichenfolgen einschleusen, da sie eine erhebliche Menge an Wissen enthalten.
Wie gehe ich mit einem solchen Szenario um?
Ich kann einen String durch einen Mechanismus wie das Hashing in Python in Zahlen umwandeln. Ich würde aber gerne wissen, wie Zeichenfolgen in Entscheidungsbaumproblemen am besten gehandhabt werden.
machine-learning
python
scikit-learn
random-forest
decision-trees
user3001408
quelle
quelle
Antworten:
In den meisten etablierten maschinellen Lernsystemen werden kategoriale Variablen auf natürliche Weise behandelt. In R würden Sie beispielsweise Faktoren verwenden, in WEKA würden Sie nominelle Variablen verwenden. Dies ist beim Scikit-Lernen nicht der Fall. Die in scikit-learn implementierten Entscheidungsbäume verwenden nur numerische Merkmale und diese Merkmale werden immer als kontinuierliche numerische Variablen interpretiert .
Das einfache Ersetzen der Zeichenfolgen durch einen Hash-Code sollte daher vermieden werden, da jede Codierung, die Sie verwenden, als fortlaufendes numerisches Merkmal eine Reihenfolge hervorruft, die in Ihren Daten einfach nicht vorhanden ist.
Ein Beispiel ist, ['rot', 'grün', 'blau'] mit [1,2,3] zu codieren, was seltsame Dinge hervorbringt, wie 'rot' ist niedriger als 'blau', und wenn Sie einen Durchschnittswert von 'rot' haben und ein "blau" erhalten Sie ein "grün". Ein weiteres subtileres Beispiel könnte auftreten, wenn Sie ['niedrig', 'mittel', 'hoch'] mit [1,2,3] codieren. Im letzteren Fall kann es vorkommen, dass es eine sinnvolle Reihenfolge gibt. Es kann jedoch zu subtilen Inkonsistenzen kommen, wenn „mittel“ nicht zwischen „niedrig“ und „hoch“ liegt.
Schließlich besteht die Antwort auf Ihre Frage darin, das kategoriale Merkmal in mehrere binäre Merkmale zu codieren . Beispielsweise könnten Sie ['rot', 'grün', 'blau'] mit 3 Spalten codieren, eine für jede Kategorie, wobei die Kategorie mit 1 übereinstimmt und die andere mit 0. Dies wird One-Hot-Codierung , Binärcodierung, One-of-K-Codierung oder was auch immer genannt. In der Dokumentation finden Sie Informationen zum Codieren kategorialer Features und zum Extrahieren von Features - Hashing und Dicts . Offensichtlich erweitert One-Hot-Encoding Ihren Platzbedarf und beeinträchtigt manchmal auch die Leistung.
quelle
Sie müssen Ihre Zeichenfolgen als numerische Features codieren, die sci-kit für die ML-Algorithmen verwenden kann. Diese Funktionalität wird im Vorverarbeitungsmodul behandelt (siehe z. B. sklearn.preprocessing.LabelEncoder für ein Beispiel).
quelle
Normalerweise sollten Sie kategoriale Variablen für Scikit-Learn-Modelle, einschließlich zufälliger Gesamtstrukturen, einmalig codieren . Zufällige Gesamtstrukturen funktionieren häufig ohne One-Hot-Codierung, erzielen jedoch normalerweise eine bessere Leistung, wenn Sie One-Hot-Codierungen durchführen. One-Hot-Codierung und "Dummying" -Variablen bedeuten in diesem Zusammenhang dasselbe. Scikit-learn hat sklearn.preprocessing.OneHotEncoder und Pandas hat pandas.get_dummies , um dies zu erreichen.
Es gibt jedoch Alternativen. Der Artikel "Beyond One-Hot" bei KDnuggets liefert eine hervorragende Erklärung, warum Sie kategoriale Variablen und Alternativen zur One-Hot-Codierung codieren müssen.
Es gibt alternative Implementierungen von Zufallsgesamtstrukturen, die keine One-Hot-Codierung erfordern, z. B. R oder H2O. Die Implementierung in R ist rechenintensiv und funktioniert nicht, wenn Ihre Features viele Kategorien haben . H2O funktioniert mit einer großen Anzahl von Kategorien. Continuum hat H2O in Anaconda Python verfügbar gemacht.
Es wird ständig versucht, dass Scikit-Learn direkt mit kategorialen Funktionen umgeht .
Dieser Artikel enthält eine Erläuterung des in H2O verwendeten Algorithmus. Es verweist auf die wissenschaftliche Arbeit A Streaming Parallel Decision Tree Algorithm und eine längere Version derselben Arbeit.
quelle
2018 Update!
Sie können einen Einbettungsraum (dichten Vektorraum) für Ihre kategorialen Variablen erstellen. Viele von Ihnen sind mit word2vec und fastext vertraut, die Wörter in einen aussagekräftigen, dichten Vektorraum einbetten. Dieselbe Idee hier - Ihre kategorialen Variablen werden einem Vektor mit einer gewissen Bedeutung zugeordnet.
Aus dem Guo / Berkhahn-Papier :
Die Autoren stellten fest, dass die Darstellung kategorialer Variablen auf diese Weise die Wirksamkeit aller getesteten Algorithmen für maschinelles Lernen, einschließlich der Zufallsgesamtstruktur, verbesserte.
Das beste Beispiel könnte die Anwendung der Technik von Pinterest sein, um verwandte Pins zu gruppieren:
Die Leute bei fastai haben kategorische Einbettungen implementiert und einen sehr schönen Blog-Beitrag mit begleitendem Demo-Notizbuch erstellt .
Zusätzliche Details und Erläuterungen
Ein neuronales Netz wird verwendet, um die Einbettungen zu erstellen, dh jedem kategorialen Wert einen Vektor zuzuweisen. Sobald Sie die Vektoren haben, können Sie sie in jedem Modell verwenden, das numerische Werte akzeptiert. Jede Vektorkomponente wird zu einer Eingangsvariablen. Wenn Sie beispielsweise 3-D-Vektoren zum Einbetten Ihrer kategorialen Farbliste verwenden, erhalten Sie möglicherweise Folgendes: Rot = (0, 1,5, -2,3), Blau = (1, 1, 0) usw. Sie würden drei verwenden Eingabevariablen in Ihrer zufälligen Gesamtstruktur, die den drei Komponenten entsprechen. Für rote Dinge ist c1 = 0, c2 = 1,5 und c3 = -2,3. Für blaue Dinge ist c1 = 1, c2 = 1 und c3 = 0.
Sie nicht wirklich brauchen ein neuronales Netzwerk verwenden Einbettungen zu erstellen (obwohl ich nicht empfehlen shying von der Technik entfernt). Es steht Ihnen frei, Ihre eigenen Einbettungen von Hand oder auf andere Weise zu erstellen, wenn dies möglich ist. Einige Beispiele:
quelle
(0, 1.5, -2.3)
, Blau =(1, 1, 0)
usw. Sie würden drei Eingabevariablen in Ihrer zufälligen Gesamtstruktur verwenden, die den drei Komponenten entsprechen. Für rote Dinge ist c1 = 0, c2 = 1,5 und c3 = -2,3. Für blaue Dinge ist c1 = 1, c2 = 1 und c3 = 0.In solchen Szenarien können Sie Dummy-Variablen verwenden. Mit panda's können
panda.get_dummies
Sie Dummy-Variablen für Zeichenfolgen erstellen, die Sie in Decision Tree oder Random Forest einfügen möchten.Beispiel:
quelle
Verwandeln Sie sie in Zahlen, zum Beispiel für jedes Land, das eine eindeutige Nummer hat (wie 1,2,3 und ...).
auch Sie nicht verwenden müssen , um One-Hot - Codierung (auch bekannt als Dummy - Variablen) , wenn sie mit zufälligem Wald arbeiten, weil Bäume wie anderer Algorithmus nicht funktionieren (wie lineare / logistische Regression) und sie funktionieren nicht von ferne (sie Arbeiten Sie daran, eine gute Aufteilung für Ihre Funktionen zu finden. Sie brauchen also kein One-Hot-Encoding
quelle