J'ai un pandas
bloc de données et j'aimerais pouvoir prédire les valeurs de la colonne A à partir des valeurs des colonnes B et C.Voici un exemple de jouet:
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 les exemples des bibliothèques d'algorithmes, scikit-learn
il semble que cela alimente les données du modèle avec une liste de lignes au lieu de colonnes. Cela m'obligerait à reformater les données en listes à l'intérieur de listes, ce qui semble aller à l'encontre de l'objectif d'utiliser des pandas en premier lieu. Quelle est la manière la plus pythonique d'exécuter une régression OLS (ou un algorithme d'apprentissage automatique plus généralement) sur des données dans une trame de données pandas?
formula
, j'ai tapé accidentellement à laformulas
place et j'ai eu une erreur étrange:TypeError: from_formula() takes at least 3 arguments (2 given)
print(result.params)
etprint(result.summary())
formula()
approche lève l'erreur de type TypeError: __init __ () manque 1 argument de position requis: 'endog', donc je suppose qu'il est obsolète. aussi,ols
est maintenantOLS
Remarque:
pandas.stats
a été supprimé avec 0.20.0Il est possible de faire cela avec
pandas.stats.ols
:Notez que vous devez avoir le
statsmodels
package installé, il est utilisé en interne par lapandas.stats.ols
fonction.la source
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 duR
package équivalent s'ajuste en supprimant l'ajustement de la moyenne: stats.stackexchange.com/a/36068/64552 . . Autres suggestions:you can use sm.add_constant to add an intercept to the exog array
et utilisez 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 capable de transmettre directement la trame de donnéessklearn
sans convertir la trame de données en un tableau numpy ou tout autre type de données.la source
.values.reshape(-1, 1)
ajouté aux colonnes du dataframe. Par exemple:x_data = df['x_data'].values.reshape(-1, 1)
et en passant les tableaux npx_data
(et un tableau créé de manière similairey_data
) dans la.fit()
méthode.Non, il suffit de convertir en un tableau NumPy:
Cela prend un temps constant car cela crée simplement une vue sur vos données. Puis alimentez-le pour scikit-learn:
la source
np.matrix( np.asarray( df ) )
, car sklearn s'attendait à un vecteur vertical, alors que les tableaux numpy, une fois que vous les coupez d'un tableau, agissent comme des vecotrs horizontaux, ce qui est excellent la plupart du temps..values
attribut. -À- dire,reg.fit(df[['B', 'C']].values, df['A'].values)
.Statsmodels peut construire un modèle OLS avec des références de colonne directement à un dataframe pandas.
Court et doux:
model = sm.OLS(df[y], df[x]).fit()
Détails du code et résumé de la régression:
Production:
Comment obtenir directement le R au carré, les coefficients et la valeur p:
la source