Ich trainiere ein Klassifizierungsmodell mit Random Forest, um zwischen 6 Kategorien zu unterscheiden. Meine Transaktionsdaten umfassen ungefähr 60.000 Beobachtungen und 35 Variablen. Hier ist ein Beispiel, wie es ungefähr aussieht.
_________________________________________________
|user_id|acquisition_date|x_var_1|x_var_2| y_vay |
|-------|----------------|-------|-------|--------|
|111 | 2013-04-01 | 12 | US | group1 |
|222 | 2013-04-12 | 6 | PNG | group1 |
|333 | 2013-05-05 | 30 | DE | group2 |
|444 | 2013-05-10 | 78 | US | group3 |
|555 | 2013-06-15 | 15 | BR | group1 |
|666 | 2013-06-15 | 237 | FR | group6 |
Sobald das Modell erstellt ist, möchte ich die Beobachtungen der letzten Woche notieren. Da das System geändert wurde, ähneln die neueren Beobachtungen eher der Umgebung der aktuellen Beobachtungen, die ich vorhersagen möchte. Daher möchte ich eine Gewichtsvariable erstellen, damit der Zufalls-Wald den jüngsten Beobachtungen mehr Bedeutung beimisst.
Weiß jemand, ob das randomForest-Paket in R Gewichte pro Beobachtung verarbeiten kann?
Können Sie auch eine gute Methode zum Erstellen der Gewichtsvariablen vorschlagen? Da meine Daten zum Beispiel aus dem Jahr 2013 stammen, dachte ich, dass ich die Monatszahl vom Datum als Gewicht nehmen kann. Hat jemand ein Problem mit dieser Methode?
Vielen Dank im Voraus!
quelle
Antworten:
Das relativ neue
ranger
Paket in R ( pdf ) wird dies tun. Die Ranger-Implementierung von zufälligen Wäldern hat eincase.weights
Argument, das einen Vektor mit individuellen Fall- / Beobachtungsgewichten verwendet.quelle
Sie können die Daten erneut abtasten, um die neueren Datenpunkte zu repräsentieren. Rf beinhaltet sowieso einen Sampel-with-Replacement-Schritt und "grob ausbalanciertes Absacken" für unausgeglichene Klassen verwendet Stichproben, um die Minderheitenklasse zu überrepräsentieren und liefert meiner Erfahrung nach Ergebnisse, die mindestens so gut sind, wie der klassengewichtete Zufallswald.
Sie können die Stichprobe auf der Ebene der Erstellung Ihrer Schulungsmatrix ( Referenz ) anstatt während des Absackens neu berechnen , um die Implementierung zu vereinfachen, obwohl ich in diesem Fall viele Wiederholungen vorschlagen würde.
Intern verwenden einige Implementierungen von Random Forest, einschließlich Scikit-Learn, tatsächlich Stichprobengewichte, um zu verfolgen, wie oft sich jede Stichprobe im Beutel befindet, und dies sollte einer Überabtastung auf der Beutelebene und einer Überabtastung auf der Trainingsebene bei der Kreuzvalidierung nahe kommen.
quelle
Sie sollten sich den Parameter "classwt" ansehen. Dies scheint nicht das zu sein, woran Sie direkt interessiert sind, aber es könnte Ihnen ein Gefühl dafür geben, was Sie tun möchten .
Siehe hier: Stapelaustausch-Frage Nr. 1
Und hier: Stapelaustauschfrage Nr. 2
Artikel über gewichtete Zufallswälder: PDF
Die Grundidee besteht darin, Klassen so zu gewichten, dass selten beobachtete Gruppen / Klassifizierungen mit größerer Wahrscheinlichkeit in Ihren Bootstrap-Beispielen ausgewählt werden. Dies ist hilfreich für unausgeglichene Daten (wenn die vorherigen Wahrscheinlichkeiten verschiedener Klassen stark voneinander abweichen).
Es scheint mir, dass Sie etwas Ähnliches tun möchten, aber für aktuelle Ereignisse (nicht für bestimmte Gruppen / Klassifikationen). Ein einfacher Weg, dies zu tun, wäre, doppelte Beobachtungen (dh in wiederholten, identischen Reihen) für neuere Beobachtungen zu erstellen. Dies könnte jedoch möglicherweise ineffizient sein. Ich kenne keinen Weg, um jede Beobachtung in R direkt zu gewichten, aber ich könnte es nicht wissen.
Sie können sich nach alternativen Implementierungen umsehen, z. B. in C - im schlimmsten Fall können diese mit ein wenig Code angepasst werden.
quelle