如何 select 数据库的列在 sklearn 中调用线性回归(OLS 和套索)

How to select columns of a data base to call a linear regression (OLS and lasso) in sklearn

我对 Python 感到不自在 - 更不用说 R 的恐惧和自在了。所以让我沉迷于一个愚蠢的问题,这个问题让我进行了大量的搜索但没有成功。

我想用 sklearn 和 OLS 和套索来拟合回归模型。特别是,我喜欢 mtcars 数据集,它在 R 中很容易调用,而且事实证明,在 Python:

中也很容易访问
import statsmodels.api as sm
import pandas as pd
import statsmodels.formula.api as smf


mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data
df = pd.DataFrame(mtcars)

看起来像这样:

                      mpg  cyl   disp   hp  drat  ...   qsec  vs  am  gear  carb
Mazda RX4            21.0    6  160.0  110  3.90  ...  16.46   0   1     4     4
Mazda RX4 Wag        21.0    6  160.0  110  3.90  ...  17.02   0   1     4     4
Datsun 710           22.8    4  108.0   93  3.85  ...  18.61   1   1     4     1
Hornet 4 Drive       21.4    6  258.0  110  3.08  ...  19.44   1   0     3     1

在尝试使用 LinearRegression() 时,发现的通常结构是

import numpy as np
from sklearn.linear_model import LinearRegression

model = LinearRegression().fit(x, y)

但要这样做,我需要 select 几列 df 以适应回归量 x,并且一列作为自变量 y .例如,我想要一个 x 矩阵,其中包含一列 1(用于截距)以及 dispqsec(数值变量),以及cyl(分类变量)。在自变量方面,我想使用 mpg.

看看能不能这样写成

model = LinearRegression().fit(mpg ~['disp', 'qsec', C('cyl')], data=df)

但是我该如何处理它的语法呢?

同样,我怎样才能用套索做同样的事情:

from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.001)
lasso.fit(mpg ~['disp', 'qsec', C('cyl')], data=df)

但这又不是正确的语法。


我确实发现您可以通过将数据框转换为矩阵来获得实际的回归(OLS 或套索)。但是,列名不见了,很难读取每个系数对应的变量。而且我仍然没有找到一个简单的方法来 运行 诊断值,比如 p 值,或者开始的 r 平方。

这里有两种方法 - 不尽如人意,尤其是因为一旦回归开始,变量标签似乎就消失了:

import statsmodels.api as sm
import pandas as pd
import statsmodels.formula.api as smf


mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data
df = pd.DataFrame(mtcars)

import numpy as np
from sklearn.linear_model import LinearRegression

单变量回归 mpg (i.v.) ~ hp (d.v.):

lm = LinearRegression()
 
mat = np.matrix(df)
 
lmFit = lm.fit(mat[:,3], mat[:,0])
 
print(lmFit.coef_)
print(lmFit.intercept_)

对于多元回归 drat ~ wt + cyl + carb:

lmm = LinearRegression()
wt = np.array(df['wt'])
cyl = np.array(df['cyl'])
carb = np.array(df['carb'])
stack = np.column_stack((cyl,wt,carb))
stackmat = np.matrix(stack)

lmFit2 = lmm.fit(stackmat,mat[:,4])
print(lmFit2.coef_)
print(lmFit2.intercept_)

你可以试试 patsy statsmodels:

import statsmodels.api as sm
import pandas as pd
import statsmodels.formula.api as smf
from patsy import dmatrix

mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data

mat = dmatrix("disp + qsec + C(cyl)", mtcars)

看起来像这样,我们可以省略第一列截距,因为它包含在 sklearn 中:

mat
 
DesignMatrix with shape (32, 5)
  Intercept  C(cyl)[T.6]  C(cyl)[T.8]   disp   qsec
          1            1            0  160.0  16.46
          1            1            0  160.0  17.02
          1            0            0  108.0  18.61
          1            1            0  258.0  19.44
          1            0            1  360.0  17.02

X = pd.DataFrame(mat[:,1:],columns = mat.design_info.column_names[1:])

from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(X,mtcars['mpg'])

但是model.coef_中的参数名称不会被命名。你只需要将它们放在一个系列中就可以阅读它们:

pd.Series(model.coef_,index = X.columns)
 
C(cyl)[T.6]   -5.087564
C(cyl)[T.8]   -5.535554
disp          -0.025860
qsec          -0.162425

来自 sklearn 线性回归的 Pvalues,没有现成的方法可以做到这一点,您可以查看这些 answers,也许其中之一就是您正在寻找的。