9
votes

Obtenir 'ValueError: Formes non alignées' sur la régression linéaire SCIKIT

Tout nouveau nouveau à Scikit et en algèbre linéaire / apprentissage de la machine avec python en général, je ne peux donc pas sembler résoudre ce qui suit:

J'ai un ensemble de formation et un ensemble de données contenant à la fois continue et discrète / valeurs catégoriques. Les fichiers CSV sont chargés en dataframes de pandas et correspondent à la forme, étant (1460,81) et (1459,81). Cependant, après avoir utilisé Get_D_Dummies , les formes de Les DataFrames changent de (1460, 306) et (1459, 294). Donc, lorsque je fais une régression linéaire avec le Scikit Linéaire Regression Module, il construit un modèle pour 306 variables et il essaie de prédire l'une avec seulement 294 avec elle. Ceci alors, naturellement, conduit à l'erreur suivante: xxx

Comment pourrais-je aborder un tel problème? Puis-je remodeler en quelque sorte le (1459, 294) pour correspondre à l'autre?

Merci et j'espère que je me suis fait clairement :)


0 commentaires

3 Réponses :


8
votes

Il s'agit d'un problème extrêmement courant lorsqu'il s'agit de données catégoriques. Il existe des opinions différentes sur la meilleure façon de gérer cela.

Une approche possible consiste à appliquer une fonction aux caractéristiques catégoriques qui limitant l'ensemble des options possibles. Par exemple, si votre fonctionnalité contenait les lettres de l'alphabet, vous pouvez encoder des fonctions pour A, B, C, D et "Autre / Inconnu". De cette manière, vous pouvez appliquer la même fonction au moment de l'essai et en résumé de la question. Bien sûr, c'est que, en réduisant ainsi l'espace des fonctionnalités, vous risquez de perdre des informations significatives.

Une autre approche consiste à créer un modèle sur vos données de formation, lesquelles les mannequins sont naturellement créés et traitent que la ligne de base pour votre modèle. Lorsque vous prédisez avec le modèle au moment de l'essai, vous transformez vos données de test de la même manière que vos données de formation sont transformées. Par exemple, si votre jeu d'entraînement avait les lettres de l'alphabet dans une fonctionnalité, et la même fonctionnalité de l'ensemble de tests contenait une valeur de 'AA', vous ignorez cela pour faire une prédiction. C'est l'inverse de votre situation actuelle, mais la prémisse est la même. Vous devez créer les fonctionnalités manquantes à la volée. Cette approche a également des effectifs, bien sûr.

La deuxième approche est ce que vous mentionnez dans votre question, donc je vais y passer avec pandas .

En utilisant get_dummies Vous encodez les fonctionnalités catégoriques en plusieurs fonctionnalités codées à une fois. Ce que vous pouvez faire est de forcer vos données de test pour correspondre à vos données de formation en utilisant reindex , comme celui-ci: xxx

Ceci codera les données de test dans De la même manière que vos données de formation, remplissez 0 pour les fonctionnalités nominales qui n'étaient pas créées en codant sur les données de test, mais ont été créées lors du processus de formation.

Vous pouvez simplement envelopper cela dans une fonction, et Appliquez-le à vos données de test à la volée. Vous n'avez pas besoin des données d'entraînement codées en mémoire (que j'accède avec formation_columns ) Si vous créez une matrice ou une liste des noms de colonne.


0 commentaires

1
votes

Pour toute personne intéressée: j'ai fini par fusionner le train et le test de test, puis générant les mannequins, puis divisez les données à nouveau à la même fraction. De cette façon, il n'y avait plus de problème avec différentes formes, comme il a généré exactement les mêmes données factices.


0 commentaires

1
votes

cela fonctionne pour moi:

Initialement, je recevais ce message d'erreur:
XXX

J'ai découvert que, je créais un modèle utilisant des variables 3 dans mes données de train. Mais ce que j'ajoute x_train = sm.add_constant (x_train) la variable constante est automatiquement créée. Donc, au total, il y a maintenant 4 variables.
Et lorsque vous testez ce modèle par défaut, la variable de test a 3 variables. Ainsi, l'erreur se déclenche pour la correspondance de la dimension Miss.
Donc, j'ai utilisé l'astuce qui crée une variable factice pour Y_TEST aussi. xxx

Bien que cette variable inutile, mais cela résout tout le problème.


1 commentaires

Notez que ce n'est pas une variable inutile, mais le terme constant pour la régression. Encore plus, quelle que soit la transformation (dans ce cas, ajout d'une dimension constante) Vous postulez à vos données de train, vous devez également appliquer à vos données de test.