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!
la source
Réponses:
Le
ranger
package en R ( pdf ), qui est relativement nouveau, le fera. L'implémentation de ranger de forêts aléatoires a uncase.weights
argument qui prend un vecteur avec des cas individuels / poids d'observation.la source
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.
la source
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.
la source