python - titanic - Ejecute una regresión OLS con Pandas Data Frame
titanic database (4)
Tengo un marco de datos de pandas
y me gustaría poder predecir los valores de la columna A a partir de los valores en 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 así como ols(A ~ B + C, data = df)
pero cuando miro los examples de bibliotecas de algoritmos como scikit-learn
parece alimentar 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 MCO (o cualquier algoritmo de aprendizaje automático en general) sobre datos en un marco de datos de pandas?
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.
No, no lo hace, simplemente conviértalo en una matriz NumPy:
>>> data = np.asarray(df)
Esto lleva tiempo constante porque solo crea una vista de sus datos. Luego, aliméntalo para aprender scikit:
>>> from sklearn.linear_model import LinearRegression
>>> lr = LinearRegression()
>>> X, y = data[:, 1:], data[:, 0]
>>> lr.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
>>> lr.coef_
array([ 4.01182386e-01, 3.51587361e-04])
>>> lr.intercept_
14.952479503953672
Creo que casi puedes hacer exactamente lo que creías que sería ideal, usando el paquete statsmodels , que es una de las dependencias opcionales de pandas
(se usa para algunas cosas en pandas.stats
).
>>> import pandas as pd
>>> import statsmodels.formula.api as sm
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> result = sm.ols(formula="A ~ B + C", data=df).fit()
>>> print result.params
Intercept 14.952480
B 0.401182
C 0.000352
dtype: float64
>>> print result.summary()
OLS Regression Results
==============================================================================
Dep. Variable: A R-squared: 0.579
Model: OLS Adj. R-squared: 0.158
Method: Least Squares F-statistic: 1.375
Date: Thu, 14 Nov 2013 Prob (F-statistic): 0.421
Time: 20:04:30 Log-Likelihood: -18.178
No. Observations: 5 AIC: 42.36
Df Residuals: 2 BIC: 41.19
Df Model: 2
==============================================================================
coef std err t P>|t| [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept 14.9525 17.764 0.842 0.489 -61.481 91.386
B 0.4012 0.650 0.617 0.600 -2.394 3.197
C 0.0004 0.001 0.650 0.583 -0.002 0.003
==============================================================================
Omnibus: nan Durbin-Watson: 1.061
Prob(Omnibus): nan Jarque-Bera (JB): 0.498
Skew: -0.123 Prob(JB): 0.780
Kurtosis: 1.474 Cond. No. 5.21e+04
==============================================================================
Warnings:
[1] The condition number is large, 5.21e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
No sé si esto es nuevo en sklearn
o pandas
, pero puedo pasar el marco de datos directamente a sklearn
sin convertir el marco de datos a una matriz numpy o cualquier otro tipo de datos.
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit(df[[''B'', ''C'']], df[''A''])
>>> reg.coef_
array([ 4.01182386e-01, 3.51587361e-04])
Nota: pandas.stats
ha sido eliminado con 0.20.0
Es posible hacer esto con pandas.stats.ols
:
>>> from pandas.stats.api import ols
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> res = ols(y=df[''A''], x=df[[''B'',''C'']])
>>> res
-------------------------Summary of Regression Analysis-------------------------
Formula: Y ~ <B> + <C> + <intercept>
Number of Observations: 5
Number of Degrees of Freedom: 3
R-squared: 0.5789
Adj R-squared: 0.1577
Rmse: 14.5108
F-stat (2, 2): 1.3746, p-value: 0.4211
Degrees of Freedom: model 2, resid 2
-----------------------Summary of Estimated Coefficients------------------------
Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%
--------------------------------------------------------------------------------
B 0.4012 0.6497 0.62 0.5999 -0.8723 1.6746
C 0.0004 0.0005 0.65 0.5826 -0.0007 0.0014
intercept 14.9525 17.7643 0.84 0.4886 -19.8655 49.7705
---------------------------------End of Summary---------------------------------
Tenga en cuenta que necesita tener el paquete statsmodels
instalado, es utilizado internamente por la función pandas.stats.ols
.