Jusqu'à présent, j'ai supprimé les variables colinéaires dans le cadre du processus de préparation des données en examinant les tableaux de corrélation et en éliminant les variables qui dépassent un certain seuil. Existe-t-il une façon plus acceptée de procéder? De plus, je suis conscient que seule la corrélation entre 2 variables à la fois n'est pas idéale, des mesures comme VIF prennent en compte la corrélation potentielle entre plusieurs variables. Comment procéder pour choisir systématiquement des combinaisons de variables qui ne présentent pas de multicolinéarité?
J'ai mes données dans un cadre de données pandas et j'utilise les modèles de sklearn.
python
multicollinearity
scikit-learn
orange1
la source
la source
Réponses:
Merci SpanishBoy - C'est un bon morceau de code. @ilanman: Cela vérifie les valeurs VIF, puis supprime les variables dont le VIF est supérieur à 5. Par "performances", je pense qu'il veut dire temps d'exécution. Le code ci-dessus m'a pris environ 3 heures pour fonctionner sur environ 300 variables, 5000 lignes.
Soit dit en passant, je l'ai modifié pour supprimer certaines boucles supplémentaires. De plus, je l'ai rendu un peu plus propre et retourne la trame de données avec des variables réduites. Cette version a réduit de moitié mon temps d'exécution! Mon code est ci-dessous - j'espère que ça aide.
la source
usdm
méthode du packagevifstep
) pour VIF et le temps d'exécution était vraiment cool. Comme je l'ai déjà dit, la variante ci-dessus et la vôtre (optimisée de moitié) sont si lentes à comparer avec la R. D'autres idées comment optimiser encore?Vous pouvez essayer d'utiliser le code ci-dessous:
Cela fonctionne, mais je n'aime pas les performances de cette approche
la source
J'ai essayé la réponse de SpanishBoy et trouvé des erreurs de serval lors de son exécution pour une trame de données. Voici une solution déboguée.
Je n'ai également eu aucun problème de performance, mais je ne l'ai pas testé de manière approfondie.
la source
RuntimeWarning: divide by zero encountered in double_scalars