Je travaille sur un ensemble de données comprenant plus de 200 000 échantillons et environ 50 caractéristiques par échantillon: 10 variables continues et les 40 autres valeurs sont des variables catégorielles (pays, langues, domaines scientifiques, etc.). Pour ces variables catégorielles, vous avez par exemple 150 pays différents, 50 langues, 50 domaines scientifiques etc ...
Jusqu'ici, mon approche est la suivante:
Pour chaque variable catégorielle comportant de nombreuses valeurs possibles, prenons uniquement celle ayant plus de 10 000 échantillons prenant cette valeur. Cela réduit à 5-10 catégories au lieu de 150.
Construisez une variable muette pour chaque catégorie (si 10 pays ajoutez un vecteur binaire de taille 10 pour chaque échantillon).
Nourrir un classifieur de forêt aléatoire (valider les paramètres, etc.) avec ces données.
Actuellement, avec cette approche, je ne parviens qu'à obtenir une précision de 65% et j'estime qu'il est possible de faire plus. En particulier, je ne suis pas satisfait de mon 1) car j'estime que je ne devrais pas supprimer arbitrairement les "valeurs les moins pertinentes" en fonction du nombre d'échantillons dont ils disposent, car ces valeurs moins représentées pourraient être plus discriminantes. D'autre part, ma RAM ne peut pas permettre d'ajouter 500 colonnes * 200 000 lignes aux données en conservant toutes les valeurs possibles.
Auriez-vous une suggestion pour faire face à ces variables beaucoup plus catégoriques?
Réponses:
1) Les forêts aléatoires doivent être capables de gérer les valeurs catégorielles de manière native. Recherchez donc une implémentation différente afin d'éviter de coder toutes ces fonctionnalités et d'utiliser toute votre mémoire.
2) Le problème avec les caractéristiques catégorielles à haute cardinalité est qu’il est facile de trop les ajuster. Vous avez peut-être suffisamment de données pour que ce ne soit pas un problème, mais faites attention.
3) Je suggère d’examiner la sélection aléatoire des caractéristiques forestières en utilisant soit la méthode proposée par Brieman, soit les contrastes artificiels . La méthode des contrastes artificiels (ACE) est intéressante car elle compare l’importance de la fonction à l’importance d’une version mélangée de celle-ci qui combat certains problèmes de haute cardinalité. Il existe un nouveau document intitulé "Forêts aléatoires guidées par module" qui pourrait être intéressant si vous disposiez de beaucoup plus de fonctionnalités, car il utilise une méthode de sélection de fonctionnalité prenant en compte des groupes de fonctionnalités hautement corrélées.
4) Une autre option utilisée consiste à peaufiner l’algorithme afin qu’il utilise les valises out of bag pour effectuer la sélection finale des caractéristiques après avoir ajusté les divisions dans les valises in bag, ce qui permet parfois de lutter contre les surajustements.
Il y a une implémentation presque complète de l'as ici et j'ai une implémentation plus efficace de mémoire / rapide qui gère les variables catégorielles de manière native ici ... l'option -evaloob supporte l'option 4 Je travaille sur l'ajout de la prise en charge de ACE et de quelques autres basé sur les méthodes de sélection des fonctionnalités mais cela n’a pas encore été fait.
la source
pandas.get_dummies
fonction). L'implémentation de la forêt aléatoire par H2O a très bien fonctionné pour moi (voir 0xdata.com/docs/master/model/rf ).Au lieu de dummifier vos catégories, pourquoi ne pas simplement utiliser une seule variable numérique pour chacune? Dans le contexte des forêts aléatoires, je me suis souvent demandé quelles en seraient les conséquences (car je conviens qu'il semble suspect d'introduire de l'ordinalité dans des données catégorielles avec lesquelles, souvent, cela n'a pas de sens), mais en pratique (du moins avec l’application scikit-learn des RF que j’utilise), j’ai souvent observé que cela n’a aucune incidence sur les résultats (je ne sais pas pourquoi, cependant).
la source
Je pense que vous devriez envisager une / plusieurs technique (s) de réduction variable . Il se débarrasse des prédicteurs moins influents.
J'ai beaucoup lu sur le prétraitement des données et c'est une excellente solution pour réduire le n ° de vos variables.
Mes suggestions sont les suivantes:
'nzv'
fonction du'caret'
package. Cela réduira fortement votre dimension de données.Aussi, je suggérerais d'utiliser l' algorithme AdaBoost au lieu de RF. Personnellement, les recherches que j'ai effectuées m'ont donné des coefficients de Gini très similaires pour ces deux méthodes. La bonne partie de AdaBoost est que, dans R, il gère les observations manquantes. Donc, vous pouvez sauter la 1ère étape de cette liste
J'espère que ça a aidé un peu. Bonne chance
la source
Vous voudrez peut-être envisager des modèles à effets mixtes. Ils sont populaires en sciences sociales en raison de leurs performances sur les données catégorielles à haute cardinalité, et je les ai utilisés pour créer de grands modèles prédictifs surpassant les approches classiques d’apprentissage automatique telles que les arbres à gradient accéléré, les forêts aléatoires et la régression logistique régularisée sur réseau élastique. L'implémentation la plus connue est le paquetage lme4 de R; la fonction que vous utiliseriez pour la classification est glmer, qui implémente la régression logistique à effets mixtes. Vous pouvez avoir des problèmes avec la mise à l'échelle de votre jeu de données, mais j'ai réalisé 80 000 lignes avec 15 entités sans trop de difficulté.
la source
Quand vous dites "construire une variable factice pour chaque catégorie" , cela ressemble à de l’utilisation de Python et non de R? R randomforest peut gérer nativement les catégories, ainsi que la réduction conséquente de la mémoire. Essayez R.
Ensuite, vous n’avez pas besoin de supprimer / fusionner manuellement les niveaux de catégories, cela ressemble à une douleur majeure. Et même si vous le faisiez, vous n'êtes pas assuré que les catégories les plus peuplées sont les plus prévisibles. Contrôler la complexité de la forêt aléatoire avec le paramètre forêt aléatoire avec la taille de nœud de: commencez par une grande taille de nœud et réduisez-la progressivement (il s'agit de la recherche par hyperparamètre).
La sélection des variables sera utile. @lorelai donne de bonnes recommandations. Essayez d'éliminer les fonctionnalités inutiles (de faible importance ou hautement corrélées). La construction des arbres est quadratique par rapport au nombre de fonctionnalités, donc si vous en éliminez une troisième, cela vous rapportera des dividendes.
la source
Vous devriez regarder le paquet H2O.ai. Il gère les variables catégoriques prêtes à l'emploi sans avoir à coder (assurez-vous que les variables sont des facteurs).
J'aime particulièrement leur implémentation de Gradient Boosted Machine (GBM), car vous pouvez ensuite examiner l'importance variable après la construction du modèle. Les GBM ont également la particularité d'être résistants à la suralimentation.
Si vous voulez explorer d'autres modèles, ils ont: GLM, Random Forest, Naive Bayes, Deep Learning, etc.
Voir: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html
Il est également facile à installer (Windows, Linux, Mac) et à exécuter avec des API utilisant R, Python, Java et Scala.
Il peut utiliser plusieurs cœurs pour accélérer les choses.
Dans un proche avenir, ils prendront en charge les GPU.
Il est également open source et gratuit (il existe un support Enterprise).
la source