tutorial titanic science problema problem data python pandas scikit-learn regression statsmodels

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 .