Exécuter une régression des moindres carrés ordinaires avec des Pandas bloc de Données
J'ai un pandas
bloc de données et je voudrais en mesure de prédire les valeurs de la colonne A de la valeurs dans les colonnes B et C. Voici un jouet exemple:
import pandas as pd
df = pd.DataFrame({"A": [10,20,30,40,50],
"B": [20, 30, 10, 40, 50],
"C": [32, 234, 23, 23, 42523]})
Idéalement, j'aurais quelque chose comme ols(A ~ B + C, data = df)
mais quand je regarde la exemples de l'algorithme de bibliothèques comme scikit-learn
il semble nourrir les données du modèle, avec une liste de lignes au lieu de colonnes. Cela m'obligerait à reformater les données dans les listes les listes, ce qui semble à l'encontre du but de l'utilisation de pandas géants dans la première place. Qu'est-ce que la plupart des pythonic façon d'exécuter une régression des moindres carrés ordinaires (ou de tout algorithme d'apprentissage automatique, plus généralement) sur les données dans une pandas bloc de données?
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez presque faire exactement ce que vous pensé que l'idéal serait, à l'aide de la statsmodels package qui a été l'un des
pandas
' dépendances optionnelles avantpandas
version 0.20.0 (il a été utilisé pour quelques choses danspandas.stats
.)formula
, j'ai accidentellement tapéformulas
et je l'ai erreur bizarre:TypeError: from_formula() takes at least 3 arguments (2 given)
print(result.params)
etprint(result.summary())
formula()
approche jette le type d'erreur TypeError: __init__() manquant 1 nécessaire de position argument: "endog', donc je suppose que c'est déconseillé. aussi,ols
est maintenantOLS
result = sm.OLS.from_formula(formula="A ~ B + C", data=df).fit()
Remarque:
pandas.stats
a été supprimé avec 0.20.0Il est possible de le faire avec
pandas.stats.ols
:Noter que vous devez avoir
statsmodels
paquet installé, il est utilisé en interne par lepandas.stats.ols
fonction.The pandas.stats.ols module is deprecated and will be removed in a future version. We refer to external packages like statsmodels, see some examples here: http://www.statsmodels.org/stable/regression.html
missing intercepts
. Le concepteur de l'équivalentR
forfait s'ajuste par la suppression de l'ajustement pour le dire: stats.stackexchange.com/a/36068/64552 . . Autres suggestions:you can use sm.add_constant to add an intercept to the exog array
et l'utilisation d'un dict:reg = ols("y ~ x", data=dict(y=y,x=x)).fit()
pandas.stats
Je ne sais pas si c'est nouveau dans
sklearn
oupandas
, mais je suis en mesure de passer le bloc de données directement àsklearn
sans conversion de la trame de données d'un tableau numpy ou de tout autres types de données..values.reshape(-1, 1)
pour le dataframe colonnes. Par exemple:x_data = df['x_data'].values.reshape(-1, 1)
et en passant lex_data
(et un créés de la même façony_data
) np tableaux dans le.fit()
méthode.Non, ce n'est pas le cas, il suffit de convertir un tableau NumPy:
Cela prend un temps constant, car il crée un vue sur vos données. Puis l'alimentation de scikit-learn:
np.matrix( np.asarray( df ) )
, parce que sklearn prévu un vecteur vertical, tandis que les tableaux numpy, une fois que vous les tranchez hors d'un tableau, d'agir comme horizontale vecotrs, ce qui est excellent, la plupart du temps..values
attribut. I. e.,reg.fit(df[['B', 'C']].values, df['A'].values)
.Statsmodels kan construire un Modèle OLS avec les références de colonne directement à une pandas dataframe.
Court et doux:
model = sm.OLS(df[y], df[x]).fit()
Les détails du Code et de la régression résumé:
De sortie:
Comment faire pour obtenir directement des R-squared, les Coefficients et la p-valeur: