Python의 다중 회귀

Shivam Arora 2023년10월10일
  1. statsmodel.api모듈을 사용하여 Python에서 다중 선형 회귀 수행
  2. numpy.linalg.lstsq를 사용하여 Python에서 다중 선형 회귀 수행
  3. scipy.curve_fit()메서드를 사용하여 Python에서 다중 선형 회귀 수행
Python의 다중 회귀

이 자습서에서는 다중 선형 회귀와이를 Python에서 구현하는 방법에 대해 설명합니다.

다중 선형 회귀는 둘 이상의 변수와 단일 응답 변수 사이에 선형 회귀 방정식을 피팅하여 관계를 계산하는 모델입니다. 독립 변수의 변경에 대한 종속 변수 간의 종속성 또는 변경을 추정하는 데 도움이됩니다. 표준 다중 선형 회귀에서는 모든 독립 변수가 동시에 고려됩니다.

statsmodel.api모듈을 사용하여 Python에서 다중 선형 회귀 수행

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는 회귀의 효율성에 대해 알려줍니다.

numpy.linalg.lstsq를 사용하여 Python에서 다중 선형 회귀 수행

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배열입니다.

scipy.curve_fit()메서드를 사용하여 Python에서 다중 선형 회귀 수행

이 모델은 일부 값에 대한 모델을 계산하는 데 추가로 사용되는 함수를 사용하며 그 결과는이 함수를 주어진 데이터에 맞추기 위해 비선형 최소 제곱과 함께 사용됩니다.

아래 코드를 참조하십시오.

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]]

관련 문장 - Python Regression