Python 中的多重回歸

Shivam Arora 2023年10月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]]