如何 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(用于截距)以及 disp
和 qsec
(数值变量),以及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,也许其中之一就是您正在寻找的。
我对 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(用于截距)以及 disp
和 qsec
(数值变量),以及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,也许其中之一就是您正在寻找的。