Python 中的多重回归

Shivam Arora 2023年1月30日 2021年7月10日
  1. 在 Python 中使用 statsmodel.api 模块执行多元线性回归
  2. 在 Python 中使用 numpy.linalg.lstsq 执行多元线性回归
  3. 在 Python 中使用 scipy.curve_fit() 方法执行多元线性回归
Python 中的多重回归

本教程将讨论多元线性回归以及如何在 Python 中实现它。

多元线性回归是一种模型,它通过在它们之间拟合线性回归方程来计算两个或两个以上变量与单个响应变量之间的关系。它有助于估计因变量之间的依赖性或变化对自变量的变化。在标准多元线性回归中,同时考虑所有自变量。

在 Python 中使用 statsmodel.api 模块执行多元线性回归

Python 中的 statsmodel.api 模块配备了实现线性回归的函数。我们将使用 OLS() 函数,它执行普通的最小二乘回归。

我们可以使用 pandas 模块导入数据集,也可以创建我们自己的虚拟数据来执行多元回归。我们将因变量和自变量分叉以在这些变量之间应用线性回归模型。

我们使用 OLS() 函数创建回归模型。然后,我们在这个函数中传递自变量和因变量,并使用 fit() 函数拟合这个模型。在我们的示例中,我们创建了一些数组来演示多元回归。

请参考下面的代码。

import statsmodels.api as sm
import numpy as np

y = [1,2,3,4,3,4,5,3,5,5,4,5,4,5,4,5,6,0,6,3,1,3,1] 
X = [[0,2,4,1,5,4,5,9,9,9,3,7,8,8,6,6,5,5,5,6,6,5,5],
     [4,1,2,3,4,5,6,7,5,8,7,8,7,8,7,8,6,8,9,2,1,5,6],
     [4,1,2,5,6,7,8,9,7,8,7,8,7,4,3,1,2,3,4,1,3,9,7]]

def reg_m(y, x):
    ones = np.ones(len(x[0]))
    X = sm.add_constant(np.column_stack((x[0], ones)))
    for ele in x[1:]:
        X = sm.add_constant(np.column_stack((ele, X)))
    results = sm.OLS(y, X).fit()
    return results

print(reg_m(y, x).summary())

输出:

 OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.241
Model:                            OLS   Adj. R-squared:                  0.121
Method:                 Least Squares   F-statistic:                     2.007
Date:                Wed, 16 Jun 2021   Prob (F-statistic):              0.147
Time:                        23:57:15   Log-Likelihood:                -40.810
No. Observations:                  23   AIC:                             89.62
Df Residuals:                      19   BIC:                             94.16
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1            -0.0287      0.135     -0.213      0.834      -0.311       0.254
x2             0.2684      0.160      1.678      0.110      -0.066       0.603
x3             0.1339      0.160      0.839      0.412      -0.200       0.468
const          1.5123      0.986      1.534      0.142      -0.551       3.576
==============================================================================
Omnibus:                        9.472   Durbin-Watson:                   2.447
Prob(Omnibus):                  0.009   Jarque-Bera (JB):                7.246
Skew:                          -1.153   Prob(JB):                       0.0267
Kurtosis:                       4.497   Cond. No.                         29.7
==============================================================================

summary() 函数允许我们打印回归的结果和系数。R-SquaredAdjusted R-Squared 告诉我们回归的效率。

在 Python 中使用 numpy.linalg.lstsq 执行多元线性回归

numpy.linalg.lstsq 方法通过计算向量 x 来最小化法线||B-Ax||,将方程解为 Ax=B,从而返回给定方程的最小二乘解。

我们可以使用它来执行多元回归,如下所示。

import numpy as np

y = [1,2,3,4,3,4,5,3,5,5,4,5,4,5,4,5,6,0,6,3,1,3,1] 
X = [[0,2,4,1,5,4,5,9,9,9,3,7,8,8,6,6,5,5,5,6,6,5,5],
     [4,1,2,3,4,5,6,7,5,8,7,8,7,8,7,8,6,8,9,2,1,5,6],
     [4,1,2,5,6,7,8,9,7,8,7,8,7,4,3,1,2,3,4,1,3,9,7]]
X = np.transpose(X) # transpose so input vectors
X = np.c_[X, np.ones(X.shape[0])]  # add bias term
linreg = np.linalg.lstsq(X, y, rcond=None)[0]
print(linreg)

输出:

[ 0.1338682   0.26840334 -0.02874936  1.5122571 ]

我们可以将每个变量的系数与之前的方法进行比较,并注意到结果是相同的。这里的最终结果在一个 NumPy 数组中。

在 Python 中使用 scipy.curve_fit() 方法执行多元线性回归

该模型使用一个函数,该函数进一步用于计算某些值的模型,并将结果与​​非线性最小二乘法一起使用以将该函数拟合到给定数据。

请参考下面的代码。

from scipy.optimize import curve_fit
import scipy
import numpy as np

def function_calc(x, a, b, c):
    return a + b*x[0] + c*x[1]
y = [1,2,3,4,3,4,5,3,5,5,4,5,4,5,4,5,6,0,6,3,1,3,1] 
X = [[0,2,4,1,5,4,5,9,9,9,3,7,8,8,6,6,5,5,5,6,6,5,5],
     [4,1,2,3,4,5,6,7,5,8,7,8,7,8,7,8,6,8,9,2,1,5,6],
     [4,1,2,5,6,7,8,9,7,8,7,8,7,4,3,1,2,3,4,1,3,9,7]]

popt, pcov = curve_fit(function_calc, x, y)
print (popt)
print(pcov)

输出:

[1.44920591 0.12720273 0.26001833]
[[ 0.84226681 -0.06637804 -0.06977243]
 [-0.06637804  0.02333829 -0.01058201]
 [-0.06977243 -0.01058201  0.02288467]]