如何在 python 中执行加权最小二乘回归
线性回归的关键假设之一是残差在预测变量的每个水平上以相等方差分布。这种假设称为同方差性。
如果不遵守此假设,则称残差中存在异方差性。当这种情况发生时,回归结果变得不可靠。
解决此问题的一种方法是使用加权最小二乘回归,它为观测值分配权重,使得误差方差较小的观测值获得更多权重,因为与误差方差较大的观测值相比,它们包含更多信息。
本教程提供了如何在 Python 中执行加权最小二乘回归的分步示例。
第 1 步:创建数据
首先,我们创建以下 pandas DataFrame,其中包含有关班级 16 名学生的学习小时数和期末考试成绩的信息:
import pandas as pd #createDataFrame df = pd. DataFrame ({' hours ': [1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8], ' score ': [48, 78, 72, 70, 66, 92, 93, 75, 75, 80, 95, 97, 90, 96, 99, 99]}) #view first five rows of DataFrame print ( df.head ()) hours score 0 1 48 1 1 78 2 2 72 3 2 70 4 2 66
步骤 2:拟合简单线性回归模型
接下来,我们将使用statsmodels模块中的函数来拟合一个简单的线性回归模型,使用小时作为预测变量,得分作为响应变量:
import statsmodels.api as sm #define predictor and response variables y = df[' score '] X = df[' hours '] #add constant to predictor variables X = sm. add_constant (x) #fit linear regression model fit = sm. OLS (y,x). fit () #view model summary print ( fit.summary ()) OLS Regression Results ==================================================== ============================ Dept. Variable: R-squared score: 0.630 Model: OLS Adj. R-squared: 0.603 Method: Least Squares F-statistic: 23.80 Date: Mon, 31 Oct 2022 Prob (F-statistic): 0.000244 Time: 11:19:54 Log-Likelihood: -57.184 No. Observations: 16 AIC: 118.4 Df Residuals: 14 BIC: 119.9 Model: 1 Covariance Type: non-robust ==================================================== ============================ coef std err t P>|t| [0.025 0.975] -------------------------------------------------- ---------------------------- const 60.4669 5.128 11.791 0.000 49.468 71.465 hours 5.5005 1.127 4.879 0.000 3.082 7.919 ==================================================== ============================ Omnibus: 0.041 Durbin-Watson: 1.910 Prob(Omnibus): 0.980 Jarque-Bera (JB): 0.268 Skew: -0.010 Prob(JB): 0.875 Kurtosis: 2.366 Cond. No. 10.5
从模型摘要中,我们可以看到模型的 R 平方值为0.630 。
相关:什么是好的 R 平方值?
步骤 3:拟合加权最小二乘模型
接下来,我们可以使用statsmodels WLS()函数通过设置权重来执行加权最小二乘法,以使方差较低的观测值获得更大的权重:
#define weights to use
wt = 1/smf. ols (' fit.resid.abs() ~ fit.fittedvalues ', data=df). fit (). fitted values **2
#fit weighted least squares regression model
fit_wls = sm. WLS (y, X, weights=wt). fit ()
#view summary of weighted least squares regression model
print ( fit_wls.summary ())
WLS Regression Results
==================================================== ============================
Dept. Variable: R-squared score: 0.676
Model: WLS Adj. R-squared: 0.653
Method: Least Squares F-statistic: 29.24
Date: Mon, 31 Oct 2022 Prob (F-statistic): 9.24e-05
Time: 11:20:10 Log-Likelihood: -55.074
No. Comments: 16 AIC: 114.1
Df Residuals: 14 BIC: 115.7
Model: 1
Covariance Type: non-robust
==================================================== ============================
coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 63.9689 5.159 12.400 0.000 52.905 75.033
hours 4.7091 0.871 5.407 0.000 2.841 6.577
==================================================== ============================
Omnibus: 2,482 Durbin-Watson: 1,786
Prob(Omnibus): 0.289 Jarque-Bera (JB): 1.058
Skew: 0.029 Prob(JB): 0.589
Kurtosis: 1.742 Cond. No. 17.6
==================================================== ============================
从结果中,我们可以看到该加权最小二乘模型的 R 平方值已增加至0.676 。
这表明加权最小二乘模型比简单线性回归模型能够解释更多的考试成绩方差。
这告诉我们,与简单线性回归模型相比,加权最小二乘模型可以更好地拟合数据。
其他资源
以下教程解释了如何在 Python 中执行其他常见任务: