Pondération des données plus récentes dans le modèle de forêt aléatoire

14

J'entraîne un modèle de classification avec Random Forest pour faire la distinction entre 6 catégories. Mes données transactionnelles ont environ 60k + observations et 35 variables. Voici un exemple de son apparence approximative.

 _________________________________________________
|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 |

Une fois le modèle créé, j'aimerais noter les observations de la dernière semaine. Comme il y a eu des changements dans le système, les observations les plus récentes ressembleront davantage à l'environnement des observations actuelles que j'aimerais prévoir. Par conséquent, je veux créer une variable de poids afin que la forêt aléatoire accorde plus d'importance aux observations récentes.

Est-ce que quelqu'un sait si le package randomForest dans R est capable de gérer les poids par observation?

Pouvez-vous également suggérer une bonne méthode pour créer la variable de poids? Par exemple, comme mes données datent de 2013, je pensais pouvoir prendre le nombre de mois de la date comme poids. Quelqu'un voit-il un problème avec cette méthode?

Merci d'avance!

Nikolay Nenov
la source
Vous pourriez envisager de poster une question sur le débordement de pile. Ils vous aideront davantage avec les problèmes de mise en œuvre. L'objectif de ce site est davantage basé sur la théorie.
Alex Williams
Je ne suis probablement pas assez clair dans mes écrits, mais mes questions ne concernent pas le problème de mise en œuvre. Par exemple, dans la partie où je pose des questions sur la création de la variable de poids, je ne veux pas demander quelle commande dans R peut m'aider à le faire. Je me demandais simplement si, par là, je violerais l'une des hypothèses de la forêt aléatoire.
Nikolay Nenov
1
La réponse est non, je crois. Vous pouvez attribuer des poids à différents groupes comme je l'ai expliqué dans ma réponse ci-dessous. Je comprends que ce n'est pas ce qui vous intéresse, mais c'est une idée similaire. Vous pouvez essayer d'utiliser des observations en double comme je le suggère.
Alex Williams

Réponses:

5

Le rangerpackage en R ( pdf ), qui est relativement nouveau, le fera. L'implémentation de ranger de forêts aléatoires a un case.weightsargument qui prend un vecteur avec des cas individuels / poids d'observation.

GrantRWHumphries
la source
Soigné! Des coutures comme la solution que je cherchais. Avez-vous un lien vers les détails sur la façon dont la probabilité est calculée cas.poids?
Nikolay Nenov
1
Je ne suis pas sûr à 100% de la façon dont ils calculent les probabilités - mais je pense que si vous voulez commencer, jetez un œil à cet article: Malley, JD, Kruppa, J., Dasgupta, A., Malley, KG et Ziegler , A. (2012). Machines de probabilité: estimation de probabilité cohérente à l'aide de machines d'apprentissage non paramétriques. Méthodes Inf Med 51: 74-81. dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries
7

Vous pouvez rééchantillonner les données pour qu'elles représentent plus les points de données les plus récents. Rf implique de toute façon une étape de sampelage avec remplacement et un «ensachage à peu près équilibré» pour les classes non équilibrées utilise l'échantillonnage pour surreprésenter la classe minoritaire et produit des résultats aussi bons ou meilleurs que la forêt aléatoire pondérée par classe selon mon expérience.

Vous pouvez rééchantillonner au niveau de la construction de votre matrice de formation ( référence ) au lieu de l'ensachage pour garder la mise en œuvre facile, mais je suggère de faire de nombreuses répétitions dans ce cas.

En interne, certaines implémentations de forêt aléatoire, y compris scikit-learn, utilisent en fait des poids d'échantillon pour garder une trace du nombre de fois que chaque échantillon est dans le sac et cela devrait être équivalent à un suréchantillonnage au niveau de l'ensachage et proche d'un suréchantillonnage au niveau de la formation lors de la validation croisée.

Ryan Bressler
la source
4

Vous devriez regarder dans le paramètre "classwt". Cela ne semble pas être ce qui vous intéresse directement, mais cela peut vous donner une idée de ce que vous voulez faire.

Voir ici: Stack Exchange question # 1

Et ici: Stack Exchange question # 2

Article sur les forêts aléatoires pondérées: PDF

L'idée de base est de pondérer les classes de telle sorte que les groupes / classifications rarement observés sont plus susceptibles d'être sélectionnés dans vos échantillons de bootstrap. Cela est utile pour les données déséquilibrées (lorsque les probabilités antérieures de différentes classes sont très différentes).

Il me semble que vous voulez faire quelque chose de similaire, mais pour des événements récents (pas pour certains groupes / classifications). Un moyen simple de le faire serait de créer des observations en double (c'est-à-dire de les mettre en lignes répétées et identiques) pour des observations plus récentes. Cependant, cela pourrait être potentiellement inefficace. Je ne connais pas de moyen de pondérer directement chaque observation dans R, mais je pourrais l'ignorer.

Vous pouvez essayer de chercher des implémentations alternatives, par exemple en C - au pire, elles pourraient être personnalisées avec un peu de codage.

Alex Williams
la source
1
Merci beaucoup pour les liens, Alex. Le document donne de bons exemples de cas dans lesquels vous souhaitez pondérer vos classificateurs. Je crains cependant que cela ne fonctionne pas pour moi, car on ne peut pas utiliser le paramètre "classwt" pour autre chose que la pondération des classificateurs - c'est-à-dire que vous avez besoin d'un poids par classe, sinon randomForest retournerait une erreur.
Nikolay Nenov
1
Oui, je ne pense pas que vous puissiez utiliser directement "classwt". Vous voulez un paramètre comme "poids d'observation" mais je ne pense pas qu'il existe.
Alex Williams