python - ols - scikit learn linear regression predict




Esegui una regressione OLS con cornice dati Pandas (3)

Ho una cornice dati pandas e mi piacerebbe poter predire i valori della colonna A dai valori nelle colonne B e C. Ecco un esempio di giocattolo:

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, avrei qualcosa come ols(A ~ B + C, data = df) ma quando guardo gli examples dalle librerie di algoritmi come scikit-learn sembra che i dati scikit-learn inviati al modello con un elenco di righe anziché colonne . Ciò richiederebbe di riformattare i dati in elenchi all'interno di elenchi, il che sembra vanificare lo scopo dell'utilizzo dei panda in primo luogo. Qual è il modo più cortese per eseguire una regressione OLS (o qualsiasi algoritmo di apprendimento automatico più in generale) sui dati in un frame di dati panda?


Ciò richiederebbe di riformattare i dati in elenchi all'interno di elenchi, il che sembra vanificare lo scopo dell'utilizzo dei panda in primo luogo.

No, non lo è, basta convertire in un array NumPy:

>>> data = np.asarray(df)

Questo richiede tempo costante perché crea solo una vista sui tuoi dati. Quindi dai da mangiare a scikit-learn:

>>> 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

Non so se questo è nuovo in sklearn o pandas , ma sono in grado di passare il frame di dati direttamente a sklearn senza convertire il frame di dati in una matrice numpy o altri tipi di dati.

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 è stato rimosso con 0.20.0

È possibile farlo 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---------------------------------

Si noti che è necessario avere installato il pacchetto statsmodels , che viene utilizzato internamente dalla funzione pandas.stats.ols .





statsmodels