Tengo un pandas
marco de datos y me gustaría poder predecir los valores de la columna A a partir de los valores de las columnas B y C. Aquí hay un ejemplo de juguete:
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]})
Idealmente, tendría algo como, ols(A ~ B + C, data = df)
pero cuando miro los ejemplos de las bibliotecas de algoritmos scikit-learn
, parece que alimenta los datos al modelo con una lista de filas en lugar de columnas. Esto me obligaría a reformatear los datos en listas dentro de listas, lo que parece frustrar el propósito de usar pandas en primer lugar. ¿Cuál es la forma más pitónica de ejecutar una regresión OLS (o cualquier algoritmo de aprendizaje automático en general) en datos en un marco de datos de pandas?
formula
,formulas
TypeError: from_formula() takes at least 3 arguments (2 given)
print(result.params)
yprint(result.summary())
formula()
enfoque arroja el error de tipo TypeError: __init __ () falta 1 argumento posicional requerido: 'endog', así que supongo que está en desuso. también,ols
es ahoraOLS
Nota:
pandas.stats
se ha eliminado con 0.20.0Es posible hacer esto con
pandas.stats.ols
:Tenga en cuenta que debe tener el
statsmodels
paquete instalado, la función lo usa internamentepandas.stats.ols
.fuente
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
. El diseñador delR
paquete equivalente se ajusta quitando el ajuste de la media: stats.stackexchange.com/a/36068/64552 . . Otras sugerencias:you can use sm.add_constant to add an intercept to the exog array
y use un dict:reg = ols("y ~ x", data=dict(y=y,x=x)).fit()
pandas.stats
💔No sé si esto es nuevo en
sklearn
opandas
, pero puedo pasar el marco de datos directamentesklearn
sin convertir el marco de datos en una matriz numpy o cualquier otro tipo de datos.fuente
.values.reshape(-1, 1)
a las columnas del marco de datos. Por ejemplo:x_data = df['x_data'].values.reshape(-1, 1)
y pasando las matrices npx_data
(y una creada de manera similary_data
) al.fit()
método.No, no lo hace, simplemente conviértalo en una matriz NumPy:
Esto lleva un tiempo constante porque solo crea una vista de sus datos. Luego, aliméntelo a scikit-learn:
fuente
np.matrix( np.asarray( df ) )
, porque sklearn esperaba un vector vertical, mientras que las matrices numpy, una vez que las corta de una matriz, actúan como vecotrs horizontales, lo cual es genial la mayoría de las veces..values
atributo. Es decir,reg.fit(df[['B', 'C']].values, df['A'].values)
.Statsmodels puede crear un modelo OLS con referencias de columna directamente a un marco de datos de pandas.
Corto y dulce:
model = sm.OLS(df[y], df[x]).fit()
Detalles del código y resumen de regresión:
Salida:
Cómo obtener directamente R-cuadrado, coeficientes y valor p:
fuente