Ich arbeite an einem Datensatz mit mehr als 200.000 Stichproben und ungefähr 50 Merkmalen pro Stichprobe: 10 kontinuierliche Variablen und die anderen ~ 40 sind kategoriale Variablen (Länder, Sprachen, wissenschaftliche Gebiete usw.). Für diese kategorialen Variablen haben Sie beispielsweise 150 verschiedene Länder, 50 Sprachen, 50 wissenschaftliche Bereiche usw.
Bisher ist mein Ansatz:
Nehmen Sie für jede kategoriale Variable mit vielen möglichen Werten nur die mit mehr als 10000 Stichproben, die diesen Wert annehmen. Dies reduziert sich auf 5-10 statt 150 Kategorien.
Erstellen Sie für jede Kategorie eine Dummy-Variable (wenn 10 Länder, dann fügen Sie für jede Stichprobe einen Binärvektor der Größe 10 hinzu).
Versorgen Sie einen zufälligen Gesamtstrukturklassifizierer (überprüfen Sie die Parameter usw.) mit diesen Daten.
Gegenwärtig schaffe ich es mit diesem Ansatz nur, eine Genauigkeit von 65% zu erreichen, und ich habe das Gefühl, dass mehr getan werden kann. Insbesondere bin ich mit meiner 1) nicht zufrieden, da ich der Meinung bin, dass ich die "am wenigsten relevanten Werte" nicht willkürlich entsprechend der Anzahl der Stichproben entfernen sollte, da diese weniger repräsentierten Werte diskriminierender sein könnten. Andererseits kann es sich mein RAM nicht leisten, 500 Spalten * 200000 Zeilen zu den Daten hinzuzufügen, indem alle möglichen Werte beibehalten werden.
Hätten Sie einen Vorschlag, mit diesen vielen kategorialen Variablen umzugehen?
Antworten:
1) Zufällige Gesamtstrukturen sollten in der Lage sein, kategoriale Werte nativ zu verarbeiten. Suchen Sie daher nach einer anderen Implementierung, damit Sie nicht alle diese Funktionen codieren und Ihren gesamten Speicher verbrauchen müssen.
2) Das Problem bei kategorialen Merkmalen mit hoher Kardinalität besteht darin, dass es leicht ist, sie zu stark anzupassen. Möglicherweise verfügen Sie über genügend Daten, sodass dies kein Problem darstellt. Achten Sie jedoch darauf.
3) Ich schlage vor, die zufällige Auswahl von forstbasierten Merkmalen entweder mit der von Brieman vorgeschlagenen Methode oder mit künstlichen Kontrasten zu untersuchen . Die künstliche Kontrastmethode (Artificial Contrasts Method, ACE) ist interessant, weil sie die Wichtigkeit des Features mit der Wichtigkeit einer gemischten Version von sich selbst vergleicht, die einige der Probleme mit hoher Kardinalität bekämpft. Es gibt eine neue Veröffentlichung "Module Guided Random Forests", die interessant sein könnte, wenn Sie über viel mehr Features verfügen, da sie eine Feature-Auswahlmethode verwendet, die Gruppen von stark korrelierten Features berücksichtigt.
4) Eine andere Option, die manchmal verwendet wird, besteht darin, den Algorithmus so zu optimieren, dass er die Out-of-Bag-Cases verwendet, um die endgültige Feature-Auswahl zu treffen, nachdem die Splits an den In-Bag-Cases angebracht wurden.
Es ist eine fast vollständige Ass Umsetzung hier und ich habe eine mehr Speicher effichent / schnell rf Implementierung dass Griffe kategorische Variablen nativ hier ... die -evaloob Option unterstützt die Option 4 Ich arbeite an dem Hinzufügen der Unterstützung für ACE und ein paar anderen rf Es ist noch nicht abgeschlossen.
quelle
pandas.get_dummies
Funktion). Die Implementierung von Random Forest in H2O hat sich für mich sehr gut bewährt (siehe 0xdata.com/docs/master/model/rf ).Warum sollten Sie nicht einfach eine einzige numerische Variable für jede Kategorie verwenden, anstatt Ihre Kategorien zu dummifizieren? Im Zusammenhang mit zufälligen Wäldern habe ich mich oft gefragt, welche Konsequenzen dies hat (da ich der Meinung bin, dass es verdächtig klingt, Ordinalitäten in kategoriale Daten einzuführen, mit denen, wenn auch oft, dies keinen Sinn ergibt), aber in der Praxis (zumindest) Bei der Implementierung von RFs, die ich bereits verwendet habe, habe ich oft festgestellt, dass dies keinen Einfluss auf die Ergebnisse hat (ich bin mir jedoch nicht sicher, warum).
quelle
Ich denke, Sie sollten eine / mehrere variable Reduktionstechnik (en) in Betracht ziehen . Es wird die nicht so einflussreichen Prädiktoren los.
Ich habe viel über Datenvorverarbeitung gelesen und es ist eine großartige Lösung, um die Anzahl Ihrer Variablen zu reduzieren.
Meine Vorschläge sind wie folgt:
'nzv'
Funktion aus dem'caret'
Paket verwenden. Dadurch wird Ihre Datendimension erheblich reduziert.Außerdem würde ich vorschlagen, den AdaBoost-Algorithmus anstelle des RF zu verwenden. Persönlich ergaben die von mir durchgeführten Untersuchungen für beide Methoden sehr ähnliche Gini-Koeffizienten. Das Gute an AdaBoost ist, dass in R fehlende Beobachtungen behandelt werden. Sie können also den ersten Schritt dieser Liste überspringen
Ich hoffe es hat ein wenig geholfen. Viel Glück
quelle
Möglicherweise möchten Sie Modelle mit gemischten Effekten in Betracht ziehen. Sie sind in den Sozialwissenschaften aufgrund ihrer Leistung bei kardinalitätsbezogenen kategorialen Daten beliebt. Ich habe sie verwendet, um großartige Vorhersagemodelle zu erstellen, die gängige Ansätze für maschinelles Lernen wie gradientenverstärkte Bäume, zufällige Wälder und regulierte logistische Regression mit elastischem Netz übertreffen. Die bekannteste Implementierung ist das lme4-Paket von R; Die Funktion, die Sie für die Klassifizierung verwenden würden, ist glmer, wodurch eine logistische Regression mit gemischten Effekten implementiert wird. Möglicherweise haben Sie Probleme mit der Skalierung Ihres Datasets, aber ich habe 80.000 Zeilen mit 15 Features ohne allzu große Schwierigkeiten erstellt.
quelle
Wenn Sie "Dummy-Variable für jede Kategorie erstellen" sagen , hört sich das so an, als würden Sie Python verwenden, nicht R? R randomforest kann nativ mit kategorialen Elementen umgehen, auch mit der daraus resultierenden Speicherreduzierung. Versuchen Sie R.
Als nächstes müssen Sie die kategorialen Ebenen nicht manuell beschneiden / zusammenführen, was sich nach einem großen Schmerz anhört. Und selbst wenn ja, kann nicht garantiert werden, dass die bevölkerungsreichsten Kategorien die aussagekräftigsten sind. Kontrollieren Sie die Komplexität des Zufallswalds mit Parameter Nodesize : Beginnen Sie mit einer großen Knotengröße und reduzieren Sie diese schrittweise (dies ist die Hyperparametersuche).
Variablenauswahl wird nützlich sein. @lorelai gibt gute Empfehlungen. Versuchen Sie, nutzlose (unwichtige oder stark korrelierte) Funktionen zu eliminieren. Die Baumkonstruktion ist im Verhältnis zur Anzahl der Features quadratisch. Wenn Sie also ein Drittel eliminieren, zahlt sich dies aus.
quelle
Sie sollten sich das Paket H2O.ai ansehen . Es behandelt kategoriale Variablen ohne Kodierung (stellen Sie sicher, dass die Variablen Faktoren sind).
Die Implementierung von Gradient Boosted Machine (GBM) gefällt mir besonders gut, da Sie die variable Wichtigkeit nach dem Erstellen des Modells betrachten können. GBMs haben auch die nette Eigenschaft, gegen Überanpassung beständig zu sein.
Wenn Sie andere Modelle erforschen möchten, haben sie: GLM, Random Forest, Naive Bayes, Deep Learning, etc.
Siehe: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html
Es ist auch einfach zu installieren (Windows, Linux, Mac) und mit APIs unter Verwendung von R, Python, Java und Scala einfach auszuführen.
Es kann mehrere Kerne verwenden, um die Dinge zu beschleunigen.
In naher Zukunft werden sie GPUs unterstützen.
Es ist auch Open Source und kostenlos (es gibt Enterprise-Support).
quelle