用pandas数据框运行OLS回归

我有一个pandas数据框,我希望能够从列B和C中的值预测列A的值。这里是一个玩具的例子:

 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]}) 

理想情况下,我会有类似ols(A ~ B + C, data = df)但是当我查看像scikit-learn这样的algorithm库中的例子时 ,它似乎用行列表而不是列来向数据提供数据。 这将要求我将数据重新格式化为列表内的列表,这似乎首先打败了使用pandas的目的。 什么是对大pandas数据框架中的数据运行OLS回归(或更普遍的任何机器学习algorithm)最pythonic的方式?

我想你几乎可以用你认为是理想的东西,使用pandas的可选依赖项之一的statsmodels包(它在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. 

注意: pandas.stats 已经被删除了0.20.0


可以用pandas.stats.ols来做到这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--------------------------------- 

请注意,您需要安装statsmodels软件包,它由pandas.stats.ols函数内部使用。

这将要求我将数据重新格式化为列表内的列表,这似乎首先打败了使用pandas的目的。

不,不,只是转换为NumPy数组:

 >>> data = np.asarray(df) 

这需要不断的时间,因为它只是为您的数据创build一个视图 。 然后喂它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 

我不知道这是新的sklearnpandas ,但我能够直接传递dataframe到sklearn没有转换dataframe到一个numpy数组或任何其他数据types。

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