如何选择数据库中的列以调用sklearn中的线性回归(OLS和lasso)

2024-06-25 22:57:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python感到不舒服——更不用说对R感到害怕和自在了。所以请允许我回答一个愚蠢的问题,这个问题让我进行了大量搜索,但都没有成功

我想用sklearn和OLS以及lasso来拟合回归模型。特别是,我喜欢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)

但要做到这一点,我需要选择几列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或lasso)。但是,列的名称不见了,很难读取每个系数对应的变量。我还没有找到一个简单的方法来运行诊断值,比如p值,或者r平方


Tags: importdfdatamodelassklearnfitlasso
2条回答

这里有两种方法——不令人满意,特别是因为一旦回归开始,变量标签似乎就消失了:

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

您可以尝试statsmodels使用的patsy

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,也许其中一个就是您正在寻找的

相关问题 更多 >