Régression logistique sur Big Data

9

J'ai un ensemble de données d'environ 5000 fonctionnalités. Pour ces données, j'ai d'abord utilisé le test du chi carré pour la sélection des fonctionnalités; après cela, j'ai obtenu environ 1500 variables qui ont montré une relation de signification avec la variable de réponse.

Maintenant, je dois ajuster la régression logistique là-dessus. J'utilise le package glmulti pour R (le package glmulti fournit une sélection de sous-ensemble efficace pour vlm) mais il ne peut utiliser que 30 fonctionnalités à la fois, sinon ses performances diminuent car le nombre de lignes de mon ensemble de données est d'environ 20000.

Existe-t-il une autre approche ou technique pour résoudre les problèmes ci-dessus? Si je passe par la méthode ci-dessus, cela prendra trop de temps pour s'adapter au modèle.

Vijay
la source
8
Si vous pouvez adapter votre jeu de données à la mémoire d'une seule machine, je n'appellerais pas cela un problème de "Big Data", spécialement si vous le faites dans le titre de votre question
logc
J'utilise sklearn's LogisticRegressionet il résout un problème de 4000 fonctionnalités, 20 000 lignes en environ une minute sur mon ordinateur portable.
Thomas Ahle

Réponses:

13

Il n'est pas approprié de faire un filtrage des fonctionnalités, puis d'introduire les fonctionnalités survivantes dans une méthode qui ne comprend pas la quantité de données torturée précédemment. Il est préférable d'utiliser une méthode capable de gérer toutes les fonctionnalités potentielles (par exemple, un filet élastique). D'autres suggestions sur l'utilisation de la réduction des données sont également d'excellentes idées.

Frank Harrell
la source
Y a-t-il des preuves de cela? O / w il semble tout autant d'une heuristique que le filtrage des fonctionnalités.
Zubin
2
L'estimation du maximum de vraisemblance pénalisée tient compte du contexte, par exemple, dans le lasso, l'estimation du coefficient de régression d'une variable sera plus petite si vous considérez 1000 variables non sélectionnées que si vous considérez 100 variables non sélectionnées. Sinon, les variables sont sélectionnées de manière biaisée et le réajustement de la variable dans une deuxième étape perd le contexte.
Frank Harrell
Pourriez-vous préciser ce que vous entendez par partialité ici? Je me demande, parce que dans un sens trivial le lasso est toujours biaisé, donc vous devez vous référer à un biais supplémentaire. En outre, il existe des approches en deux étapes avec des propriétés raisonnables, par exemple pdfs.semanticscholar.org/d90a/…
jmb
2
Le lasso biaise délibérément les coefficients vers zéro pour éviter le sur-ajustement. Des paramètres non pénalisés conduisent à des valeurs prédites trop extrêmes. L'ajustement de variables "sélectionnées" dans un modèle non pénalisé annulera le biais de lasso nécessaire , créant ainsi un sur-ajustement important des valeurs prédites.
Frank Harrell
10

Une première approche consiste à utiliser l'ACP afin de réduire la dimensionnalité de l'ensemble de données. Essayez de conserver ~ 97% de la variance totale, cela peut aider un peu.

Une autre option consiste à utiliser quelque chose comme la descente de gradient stochastique, cela peut être un algorithme beaucoup plus rapide et capable de s'insérer dans la mémoire de R.

EDIT: Un problème avec R est que vous ne pouvez utiliser que votre RAM, donc si vous n'avez que 8 Go de mémoire, c'est à cela que vous êtes limité. J'ai rencontré de nombreux problèmes avec cela et je suis depuis passé à utiliser scikit-learn de python qui semble gérer beaucoup mieux les plus grands ensembles de données.

Un très joli graphique qui donne une idée des endroits où commencer en fonction de la taille de votre ensemble de données peut être trouvé ici: http://3.bp.blogspot.com/-dofu6J0sZ8o/UrctKb69QdI/AAAAAAAADfg/79ewPecn5XU/s1600/scikit-learn-flow -chart.jpg

entrez la description de l'image ici

mike1886
la source
8
Une grande préoccupation avec l'utilisation de l'APC de cette façon est que toute la relation entre la variable de réponse et les variables indépendantes pourrait résider dans les 3% de la variance totale que vous négligez. Il ne semble pas non plus y avoir de moyen général de déterminer le nombre de composants principaux à utiliser, car le plus petit composant pourrait être proportionnel à la réponse elle-même et constituerait ainsi le choix optimal des variables à inclure.
whuber
1
Je pense qu'en effet, si vous êtes en mesure de charger l'ensemble de données dans la mémoire principale (ce qui, je suppose, est le cas compte tenu de ce que vous expliquez), la descente de gradient stochastique est la première étape que vous devez prendre avant d'essayer des techniques de réduction de dimensionnalité. Avec Scikit-learn sur python (ou R, mais je ne suis pas un utilisateur de ce langage), cela fonctionnerait très bien.
Bertrand R
Je pense que c'est une réponse utile, mais je pense que le PO pose des questions sur la régression logistique, et non sur la réduction des fonctionnalités. Peut-être pouvez-vous aborder cette partie de la question dans une édition?
logc
Je ne sais pas à quel point l'ACP est utile pour les problèmes de régression. Le problème est le suivant: PCA conserve les plus grandes valeurs singulières de la matrice d'entrée, mais le pseudo-inverse de la matrice inverse les valeurs singulières, vous voulez donc vraiment garder la plus petite des valeurs d'origine. Il serait peut-être préférable de simplement esquisser les données: arxiv.org/abs/1411.4357
Thomas Ahle
4

Comme @Frank Harrell l'a déjà mentionné, l'utilisation d'un filet élastique ou de LASSO pour effectuer une régression pénalisée avec toutes les 5000 fonctionnalités ( p ) serait un bon début pour la sélection des fonctionnalités (on ne peut pas simplement supprimer 3500 variables car elles ne sont pas "statistiquement significatives" avec le variable d’intérêt dépendante). Chacune de ces méthodes peut être effectuée en utilisant l'ensemble de R, glmnet.

Afin de prendre en compte les relations partagées entre les variables prédictives potentielles d'intérêt ( p = 5000), je recommanderais d'exécuter une forêt aléatoire en utilisant le randomForestpackage et / ou un boost de gradient en utilisant le gbmpackage pour évaluer l'importance relative des variables prédictives potentielles en ce qui concerne le résultat binaire. Avec ces informations, vous serez beaucoup plus préparé à construire un modèle de régression logistique plus parcimonieux.

Matt Reichenbach
la source
3
Oui
1

Je suppose que vous n'êtes pas limité à R, car c'est un problème de big data que vous ne devriez probablement pas être. Vous pouvez essayer MLlib , qui est la bibliothèque évolutive d'apprentissage automatique d'Apache Spark.

Apache Spark , quant à lui, est un moteur rapide et général pour le traitement de données à grande échelle en mémoire. Ceux-ci fonctionnent sur une infrastructure Hadoop qui permet le traitement distribué de grands ensembles de données sur des clusters d'ordinateurs à l'aide de modèles de programmation simples. Il est conçu pour passer de serveurs uniques à des milliers de machines, chacune offrant un calcul et un stockage locaux.

Notez que «des milliers de machines» est facultatif (!), Vous pouvez également le configurer sur votre bureau local / professionnel.

Pour en revenir à MLlib, il est livré avec les algorithmes ci-dessous prêts à l'emploi:

  • Clustering K-means avec K-means || initialisation.
  • Régression linéaire régularisée L1 et L2.
  • Régression logistique régularisée L1 et L2.
  • Filtrage collaboratif des moindres carrés alternés, avec notes explicites ou rétroaction implicite.
  • Classification multinomiale Naive Bayes.
  • Descente de gradient stochastique.

Si vous travaillez régulièrement avec des mégadonnées, vous devrez peut-être adopter une solution Hadoop.

Zhubarb
la source
0

Vous pouvez essayer Vowpal Wabbit: Vowpal Wabbit . Cela fonctionne bien avec de très grands ensembles de données et un très grand nombre de fonctionnalités.

selon le site:

Il s'agit d'un projet démarré chez Yahoo! Rechercher et poursuivre chez Microsoft Research pour concevoir un algorithme d'apprentissage rapide, évolutif et utile. VW est l'essence même de la vitesse dans l'apprentissage automatique, capable d'apprendre facilement des ensembles de données de térafonction. Grâce à l'apprentissage parallèle, il peut dépasser le débit de n'importe quelle interface réseau d'une seule machine lors de l'apprentissage linéaire, une première parmi les algorithmes d'apprentissage.

user765195
la source