Gewichtung neuerer Daten im Random Forest-Modell

14

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!

Nikolay Nenov
quelle
Möglicherweise möchten Sie eine Frage zum Stapelüberlauf stellen. Sie werden Ihnen bei Implementierungsproblemen weiterhelfen. Der Schwerpunkt dieser Seite liegt eher auf der Theorie.
Alex Williams
Ich bin wahrscheinlich nicht klar genug in meinem Schreiben, aber meine Fragen beziehen sich nicht auf Implementierungsprobleme. In dem Teil, in dem ich nach der Erstellung der Gewichtungsvariablen frage, möchte ich nicht fragen, welcher Befehl in R mir dabei helfen kann. Ich habe mich nur gefragt, ob ich damit gegen eine der Annahmen des zufälligen Waldes verstoßen würde.
Nikolay Nenov
1
Die Antwort ist nein, glaube ich. Sie können verschiedenen Gruppen Gewichte zuweisen, wie ich in meiner Antwort unten erläutert habe. Ich verstehe, das interessiert Sie nicht, aber es ist eine ähnliche Idee. Sie könnten versuchen, doppelte Beobachtungen zu verwenden, wie ich vorschlage.
Alex Williams

Antworten:

5

Das relativ neue rangerPaket in R ( pdf ) wird dies tun. Die Ranger-Implementierung von zufälligen Wäldern hat ein case.weightsArgument, das einen Vektor mit individuellen Fall- / Beobachtungsgewichten verwendet.

GrantRWHumphries
quelle
Ordentlich! Nähte wie die Lösung, nach der ich gesucht habe. Haben Sie einen Link zu den Details, wie die Wahrscheinlichkeit bei Gewichten berechnet wird?
Nikolay Nenov
1
Ich bin mir nicht hundertprozentig sicher, wie sie die Wahrscheinlichkeiten berechnen - aber ich denke, wenn Sie anfangen wollen, schauen Sie sich dieses Papier an: Malley, JD, Kruppa, J., Dasgupta, A., Malley, KG und Ziegler A. (2012). Wahrscheinlichkeitsmaschinen: Konsistente Wahrscheinlichkeitsschätzung mit nichtparametrischen Lernmaschinen. Methods Inf Med 51: 74 & ndash; 81. dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries
7

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.

Ryan Bressler
quelle
4

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.

Alex Williams
quelle
1
Vielen Dank für die Links, Alex. Das Papier enthält gute Beispiele für Fälle, in denen Sie Ihre Klassifikatoren gewichten möchten. Ich befürchte, dass dies bei mir nicht funktioniert, da man den Parameter "classwt" nicht für etwas anderes als das Gewichten der Klassifikatoren verwenden kann - dh Sie benötigen ein Gewicht pro Klasse, sonst würde randomForest einen Fehler zurückgeben.
Nikolay Nenov
1
Ja, ich glaube nicht, dass Sie "classwt" direkt verwenden können. Sie wollen einige Parameter wie "Beobachtungsgewichte", aber ich glaube nicht, dass es existiert.
Alex Williams