Regresión múltiple en Python
-
Utilice el módulo
statsmodel.api
para realizar regresiones lineales múltiples en Python -
Utilice
numpy.linalg.lstsq
para realizar una regresión lineal múltiple en Python -
Utilice el método
scipy.curve_fit()
para realizar una regresión lineal múltiple en Python
Este tutorial discutirá la regresión lineal múltiple y cómo implementarla en Python.
La regresión lineal múltiple es un modelo que calcula la relación entre dos o más de dos variables y una única variable de respuesta ajustando una ecuación de regresión lineal entre ellas. Ayuda a estimar la dependencia o el cambio entre variables dependientes al cambio en las variables independientes. En la regresión lineal múltiple estándar, todas las variables independientes se tienen en cuenta simultáneamente.
Utilice el módulo statsmodel.api
para realizar regresiones lineales múltiples en Python
El módulo statsmodel.api
en Python está equipado con funciones para implementar la regresión lineal. Usaremos la función OLS()
, que realiza una regresión de mínimos cuadrados ordinarios.
Podemos importar un conjunto de datos usando el módulo pandas
o crear nuestros propios datos ficticios para realizar regresiones múltiples. Bifurcamos las variables dependientes e independientes para aplicar el modelo de regresión lineal entre esas variables.
Creamos un modelo de regresión usando la función OLS()
. Luego, pasamos las variables independientes y dependientes en esta función y ajustamos este modelo usando la función fit()
. En nuestro ejemplo, hemos creado algunas matrices para demostrar la regresión múltiple.
Vea el código a continuación.
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())
Producción :
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 función summary()
nos permite imprimir los resultados y coeficientes de la regresión. El R-Squared
y el Adjusted R-Squared
nos informan sobre la eficiencia de la regresión.
Utilice numpy.linalg.lstsq
para realizar una regresión lineal múltiple en Python
El método numpy.linalg.lstsq
devuelve la solución de mínimos cuadrados a una ecuación proporcionada al resolver la ecuación como Ax=B
calculando el vector x para minimizar el ||B-Ax||
normal.
Podemos usarlo para realizar regresiones múltiples como se muestra a continuación.
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)
Producción :
[ 0.1338682 0.26840334 -0.02874936 1.5122571 ]
Podemos comparar los coeficientes de cada variable con el método anterior y notar que el resultado es el mismo. Aquí el resultado final está en un array NumPy
.
Utilice el método scipy.curve_fit()
para realizar una regresión lineal múltiple en Python
Este modelo usa una función que se usa además para calcular un modelo para algunos valores, y el resultado se usa con mínimos cuadrados no lineales para ajustar esta función a los datos dados.
Vea el código a continuación.
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)
Producción :
[1.44920591 0.12720273 0.26001833]
[[ 0.84226681 -0.06637804 -0.06977243]
[-0.06637804 0.02333829 -0.01058201]
[-0.06977243 -0.01058201 0.02288467]]