Python scikit学习线性模型参数标准错误
我正在与sklearn合作,特别是线性_模型模块。拟合简单的线性曲线后,如中所示Python scikit学习线性模型参数标准错误,python,scikit-learn,linear-regression,variance,Python,Scikit Learn,Linear Regression,Variance,我正在与sklearn合作,特别是线性_模型模块。拟合简单的线性曲线后,如中所示 import pandas as pd import numpy as np from sklearn import linear_model randn = np.random.randn X = pd.DataFrame(randn(10,3), columns=['X1','X2','X3']) y = pd.DataFrame(randn(10,1), columns=['Y']) mo
import pandas as pd
import numpy as np
from sklearn import linear_model
randn = np.random.randn
X = pd.DataFrame(randn(10,3), columns=['X1','X2','X3'])
y = pd.DataFrame(randn(10,1), columns=['Y'])
model = linear_model.LinearRegression()
model.fit(X=X, y=y)
我知道如何通过coef_u和intercept_u访问系数和截距,预测也很简单。我想获得这个简单模型参数的方差-协方差矩阵,以及这些参数的标准误差。我熟悉R和vcov()函数,并且似乎scipy.optimize对此()有一些功能-sklearn是否有访问这些统计数据的功能
谢谢你在这方面的帮助
-Ryan不,scikit learn没有建立用于进行推理的错误估计。不过,Statsmodels确实如此
import statsmodels.api as sm
ols = sm.OLS(y, X)
ols_result = ols.fit()
# Now you have at your disposition several error estimates, e.g.
ols_result.HC0_se
# and covariance estimates
ols_result.cov_HC0
见tl;博士
不使用scikit learn,但您可以使用一些线性代数手动计算。我这样做是为了下面的例子
还有一个jupyter笔记本,上面有以下代码:
什么和为什么
估计值的标准误差只是估计值方差的平方根。你估计的偏差是多少?如果假设模型存在高斯误差,则为:
Var(beta_hat)=逆(X.T@X)*西格玛_平方_hat
然后beta_hat[i]
的标准误差是Var(beta_hat)[i,i]**0.5
所有你需要计算的sigma\u squared\u hat
。这是对模型高斯误差的估计。这不是先验知识,但可以通过残差的样本方差进行估计
此外,还需要向数据矩阵中添加一个截取项。Scikit learn使用线性回归
类自动执行此操作。所以要自己计算这个,你需要将它添加到你的X矩阵或数据帧中
怎样
从你的代码开始
显示您的scikit学习结果
用线性代数复制这个
计算参数估计的标准误差
用statsmodels
耶,完成了 是否有任何方法可以使用从scikit回归模型中获得的任何数据来计算scikit学习的标准误差?我知道statsmodels提供了这个数字,但我需要statsmodels没有的l2惩罚。我不知道。对于L2惩罚和n>p,我想你可以写出公式。对于n
无效。
at
sigma\u squared\u hat=与我的数据集的平方[0,0]/(N-p)
。平方的剩余和计算为numpy.float64
。我在这里遗漏了什么?@Bharat生成剩余平方和的代码是什么?那么,当你使用弹性网收缩系数时。。。
print(model.intercept_)
print(model.coef_)
[-0.28671532]
[[ 0.17501115 -0.6928708 0.22336584]]
N = len(X)
p = len(X.columns) + 1 # plus one because LinearRegression adds an intercept term
X_with_intercept = np.empty(shape=(N, p), dtype=np.float)
X_with_intercept[:, 0] = 1
X_with_intercept[:, 1:p] = X.values
beta_hat = np.linalg.inv(X_with_intercept.T @ X_with_intercept) @ X_with_intercept.T @ y.values
print(beta_hat)
[[-0.28671532]
[ 0.17501115]
[-0.6928708 ]
[ 0.22336584]]
y_hat = model.predict(X)
residuals = y.values - y_hat
residual_sum_of_squares = residuals.T @ residuals
sigma_squared_hat = residual_sum_of_squares[0, 0] / (N - p)
var_beta_hat = np.linalg.inv(X_with_intercept.T @ X_with_intercept) * sigma_squared_hat
for p_ in range(p):
standard_error = var_beta_hat[p_, p_] ** 0.5
print(f"SE(beta_hat[{p_}]): {standard_error}")
SE(beta_hat[0]): 0.2468580488280805
SE(beta_hat[1]): 0.2965501221823944
SE(beta_hat[2]): 0.3518847753610169
SE(beta_hat[3]): 0.3250760291745124
import statsmodels.api as sm
ols = sm.OLS(y.values, X_with_intercept)
ols_result = ols.fit()
ols_result.summary()
...
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.2867 0.247 -1.161 0.290 -0.891 0.317
x1 0.1750 0.297 0.590 0.577 -0.551 0.901
x2 -0.6929 0.352 -1.969 0.096 -1.554 0.168
x3 0.2234 0.325 0.687 0.518 -0.572 1.019
==============================================================================