Différence entre le modèle statistique OLS et la régression linéaire scikit

14

J'ai une question sur deux méthodes différentes de bibliothèques différentes qui semblent faire le même travail. J'essaie de faire un modèle de régression linéaire.

Voici le code que j'utilise la bibliothèque statsmodel avec OLS:

X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.3, random_state=1)

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()

print "GFT + Wiki / GT  R-squared", results.rsquared

Cette impression GFT + Wiki / GT R-squared 0.981434611923

et la seconde est la méthode de modèle linéaire de la bibliothèque d'apprentissage scikit:

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)

print 'GFT + Wiki / GT R-squared: %.4f' % model.score(X_test, y_test)

Cette impression GFT + Wiki / GT R-carré: 0,8543

Donc ma question est que les deux méthodes impriment notre résultat R ^ 2 mais l'une est imprimée 0,98 et l'autre est 0,85.

D'après ma compréhension, OLS fonctionne avec un ensemble de données de formation. Alors mes questions,

  • Existe-t-il un moyen de travailler avec l'ensemble de données de test avec OLS?
  • Le score de l'ensemble de données de formation nous donne-t-il un sens (dans OLS, nous n'avons pas utilisé l'ensemble de données de test)? D'après mes connaissances passées, nous devons travailler avec des données de test.
  • Quelle est la différence entre l'OLS et la régression linéaire scikit. Lequel nous utilisons pour calculer le score du modèle?

Merci pour toute aide.

Batuhan Bardak
la source

Réponses:

14

D'abord en termes d'utilisation. Vous pouvez obtenir la prédiction dans les modèles de statistiques d'une manière très similaire à celle de scikit-learn, sauf que nous utilisons l'instance de résultats renvoyée parfit

predictions = results.predict(X_test)

Compte tenu des prédictions, nous pouvons calculer des statistiques basées sur l'erreur de prédiction

prediction_error = y_test - predictions

Il y a une liste séparée de fonctions pour calculer la qualité des statistiques de prédiction avec elle, mais elle n'est pas intégrée dans les modèles, ni n'inclut R au carré. (Je n'ai jamais entendu parler de R au carré utilisé pour des données hors échantillon.) Le calcul de celles-ci nécessite un peu plus de travail de la part de l'utilisateur et les modèles de statistiques n'ont pas le même ensemble de statistiques, en particulier pas pour la classification ou les modèles avec une variable de réponse binaire.

Pour vos deux autres points:

La régression linéaire est dans sa forme de base la même dans les modèles de statistiques et dans Scikit-Learn. Cependant, l'implémentation diffère, ce qui pourrait produire des résultats différents dans les cas marginaux, et scikit learn a en général plus de support pour les modèles plus grands. Par exemple, les modèles de statistiques utilisent actuellement des matrices clairsemées en très peu de parties.

La différence la plus importante réside dans l'infrastructure environnante et les cas d'utilisation directement pris en charge.

Statsmodels suit en grande partie le modèle traditionnel où nous voulons savoir dans quelle mesure un modèle donné correspond aux données, et quelles variables "expliquent" ou affectent le résultat, ou quelle est la taille de l'effet. Scikit-learn suit la tradition d'apprentissage automatique où la tâche principale prise en charge est de choisir le «meilleur» modèle de prédiction.

Par conséquent, les fonctionnalités de support des modèles statistiques mettent l'accent sur l'analyse des données de formation, y compris les tests d'hypothèse et les mesures de qualité de l'ajustement, tandis que dans l'infrastructure de support de scikit-learn, l'accent est mis sur la sélection de modèles pour les prédiction d'échantillon et donc validation croisée sur "données de test".

Cela souligne la distinction, il y a encore beaucoup de chevauchement également dans l'utilisation. statsmodels effectue également des prévisions et des prévisions supplémentaires dans un contexte de séries chronologiques. Mais, lorsque nous voulons effectuer une validation croisée pour la prédiction dans les modèles de statistiques, il est actuellement encore plus facile de réutiliser la configuration de validation croisée de scikit-learn avec les modèles d'estimation des modèles de statistiques.

Josef
la source
Hmm, j'essaie d'utiliser un modèle ARMA de statsmodels.tsa, mais l'interface de prédire est complètement différente là-bas. Savez-vous comment lui fournir des données de test?
éphes
1
C'est une question différente, et vous devez regarder la documentation ou les exemples. La prédiction dans les modèles de séries chronologiques est assez différente en raison de la structure temporelle séquentielle et la prédiction prévoit les valeurs dans les prochaines périodes.
Josef
Vous avez raison, c'est une autre question, néanmoins merci pour l'explication. J'ai lu la documentation et je l'ai fait fonctionner d'une manière ou d'une autre. Mais je ne comprends toujours pas pourquoi l'interface est différente. Surtout pourquoi il n'est pas possible de fournir des vecteurs de fonctionnalités et d'obtenir des prédictions (prévisions).
éphes
ARMA et SARIMAX permettent d'inclure des variables explicatives exogdans l'estimation et la prévision.
Josef
Cette question sur Stackowerlow aborde la différence d'interfaces: stackoverflow.com/questions/41045752/…
David Dale
1

Dans le modèle OLS, vous utilisez les données d'entraînement pour ajuster et prévoir.

Avec le modèle LinearRegression, vous utilisez les données d'apprentissage pour ajuster et tester les données pour prédire, donc des résultats différents dans les scores R2.

Si vous preniez des données de test dans le modèle OLS, vous devriez avoir les mêmes résultats et une valeur inférieure

Vitali Mueller
la source
0

J'ai rencontré un problème similaire où l'OLS donne des valeurs Rsquared et Rsquared ajustées différentes par rapport au modèle Sklearn LinearRegression.

Raison: OLS ne prend pas en compte, par défaut, le coefficient d'interception et y construit le modèle sans lui et Sklearn le prend en compte dans la construction du modèle.

Solution: Ajoutez une colonne de 1 à l'ensemble de données et ajustez le modèle avec OLS et vous obtiendrez presque le même Rsquared et Adj. Valeurs Rsquared pour les deux modèles.

Praveen
la source