Множественная регрессия в Python

  1. Используйте модуль statsmodel.api для выполнения множественной линейной регрессии в Python
  2. Используйте numpy.linalg.lstsq для выполнения множественной линейной регрессии в Python
  3. Используйте метод scipy.curve_fit() для выполнения множественной линейной регрессии в Python

В этом руководстве мы обсудим множественную линейную регрессию и способы ее реализации в Python.

Множественная линейная регрессия - это модель, которая вычисляет отношение между двумя или более чем двумя переменными и одной переменной ответа путем подбора уравнения линейной регрессии между ними. Это помогает оценить зависимость или изменение зависимых переменных от изменения независимых переменных. В стандартной множественной линейной регрессии все независимые переменные учитываются одновременно.

Используйте модуль statsmodel.api для выполнения множественной линейной регрессии в Python

Модуль statsmodel.api в Python снабжен функциями для реализации линейной регрессии. Мы будем использовать функцию 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-Squared и Adjusted R-Squared говорят нам об эффективности регрессии.

Используйте numpy.linalg.lstsq для выполнения множественной линейной регрессии в Python

Метод numpy.linalg.lstsq возвращает решение по методу наименьших квадратов предоставленного уравнения, решая уравнение как Ax=B путем вычисления вектора x для минимизации нормального ||B-Ax||.

Мы можем использовать его для выполнения множественной регрессии, как показано ниже.

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