Regressione multipla in Python
-
Usa il modulo
statsmodel.api
per eseguire regressioni lineari multiple in Python -
Usa
numpy.linalg.lstsq
per eseguire regressioni lineari multiple in Python -
Usa il metodo
scipy.curve_fit()
per eseguire regressioni lineari multiple in Python
Questo tutorial discuterà la regressione lineare multipla e come implementarla in Python.
La regressione lineare multipla è un modello che calcola la relazione tra due o più di due variabili e una singola variabile di risposta inserendo un’equazione di regressione lineare tra di esse. Aiuta a stimare la dipendenza o il cambiamento tra variabili dipendenti rispetto al cambiamento nelle variabili indipendenti. Nella regressione lineare multipla standard, tutte le variabili indipendenti vengono prese in considerazione contemporaneamente.
Usa il modulo statsmodel.api
per eseguire regressioni lineari multiple in Python
Il modulo statsmodel.api
in Python è dotato di funzioni per implementare la regressione lineare. Useremo la funzione OLS()
, che esegue la normale regressione dei minimi quadrati.
Possiamo importare un set di dati utilizzando il modulo pandas
o creare i nostri dati fittizi per eseguire regressioni multiple. Dividiamo le variabili dipendenti e indipendenti per applicare il modello di regressione lineare tra quelle variabili.
Creiamo un modello di regressione utilizzando la funzione OLS()
. Quindi, passiamo le variabili indipendenti e dipendenti in questa funzione e adattiamo questo modello usando la funzione fit()
. Nel nostro esempio, abbiamo creato alcuni array per dimostrare la regressione multipla.
Vedi il codice qui sotto.
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())
Produzione:
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
==============================================================================
La funzione summary()
ci permette di stampare i risultati ei coefficienti della regressione. L’R-Squared
e l’Adjusted R-Squared
ci parlano dell’efficienza della regressione.
Usa numpy.linalg.lstsq
per eseguire regressioni lineari multiple in Python
Il metodo numpy.linalg.lstsq
restituisce la soluzione dei minimi quadrati a un’equazione fornita risolvendo l’equazione come Ax=B
calcolando il vettore x per minimizzare il normale ||B-Ax||
.
Possiamo usarlo per eseguire regressioni multiple come mostrato di seguito.
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)
Produzione:
[ 0.1338682 0.26840334 -0.02874936 1.5122571 ]
Possiamo confrontare i coefficienti per ogni variabile con il metodo precedente e notare che il risultato è lo stesso. Qui il risultato finale è in un array NumPy
.
Usa il metodo scipy.curve_fit()
per eseguire regressioni lineari multiple in Python
Questo modello utilizza una funzione che viene ulteriormente utilizzata per calcolare un modello per alcuni valori e il risultato viene utilizzato con minimi quadrati non lineari per adattare questa funzione ai dati forniti.
Vedi il codice qui sotto.
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)
Produzione:
[1.44920591 0.12720273 0.26001833]
[[ 0.84226681 -0.06637804 -0.06977243]
[-0.06637804 0.02333829 -0.01058201]
[-0.06977243 -0.01058201 0.02288467]]