Algoritmos de regresión - Regresión lineal

Introducción a la regresión lineal

La regresión lineal puede definirse como el modelo estadístico que analiza la relación lineal entre una variable dependiente con un conjunto dado de variables independientes. La relación lineal entre variables significa que cuando el valor de una o más variables independientes cambia (aumenta o disminuye), el valor de la variable dependiente también cambia en consecuencia (aumenta o disminuye).

Matemáticamente, la relación se puede representar con la ayuda de la siguiente ecuación:

Y = mX + b

Aquí, Y es la variable dependiente que estamos tratando de predecir.

X es la variable dependiente que usamos para hacer predicciones.

m es la pendiente de la línea de regresión que representa el efecto que X tiene sobre Y

b es una constante, conocida como intersección con el eje Y. Si X = 0, Y sería igual ab.

Además, la relación lineal puede ser de naturaleza positiva o negativa, como se explica a continuación:

Relación lineal positiva

Una relación lineal se llamará positiva si aumentan tanto la variable independiente como la dependiente. Se puede entender con la ayuda del siguiente gráfico:

Relación lineal negativa

Una relación lineal se llamará positiva si los aumentos independientes y la variable dependiente disminuyen. Se puede entender con la ayuda del siguiente gráfico:

Tipos de regresión lineal

La regresión lineal es de los dos tipos siguientes:

  • Regresión lineal simple
  • Regresión lineal múltiple

Regresión lineal simple (SLR)

Es la versión más básica de regresión lineal que predice una respuesta utilizando una sola característica. El supuesto en SLR es que las dos variables están relacionadas linealmente.

Implementación de Python

Podemos implementar SLR en Python de dos maneras, una es para proporcionar su propio conjunto de datos y la otra es usar el conjunto de datos de la biblioteca de python scikit-learn.

Example 1 - En el siguiente ejemplo de implementación de Python, estamos usando nuestro propio conjunto de datos.

Primero, comenzaremos con la importación de paquetes necesarios de la siguiente manera:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

A continuación, defina una función que calculará los valores importantes para SLR -

def coef_estimation(x, y):

La siguiente línea de secuencia de comandos dará un número de observaciones n -

n = np.size(x)

La media de los vectores xey se puede calcular de la siguiente manera:

m_x, m_y = np.mean(x), np.mean(y)

Podemos encontrar la desviación cruzada y la desviación de x de la siguiente manera:

SS_xy = np.sum(y*x) - n*m_y*m_x
SS_xx = np.sum(x*x) - n*m_x*m_x

A continuación, los coeficientes de regresión, es decir, b se pueden calcular de la siguiente manera:

b_1 = SS_xy / SS_xx
b_0 = m_y - b_1*m_x
return(b_0, b_1)

A continuación, necesitamos definir una función que trazará la línea de regresión y predecirá el vector de respuesta:

def plot_regression_line(x, y, b):

La siguiente línea de secuencia de comandos trazará los puntos reales como diagrama de dispersión:

plt.scatter(x, y, color = "m", marker = "o", s = 30)

La siguiente línea de secuencia de comandos predecirá el vector de respuesta:

y_pred = b[0] + b[1]*x

Las siguientes líneas de secuencia de comandos trazarán la línea de regresión y les colocarán las etiquetas:

plt.plot(x, y_pred, color = "g")
plt.xlabel('x')
plt.ylabel('y')
plt.show()

Por último, necesitamos definir la función main () para proporcionar un conjunto de datos y llamar a la función que definimos anteriormente:

def main():
   x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
   y = np.array([100, 300, 350, 500, 750, 800, 850, 900, 1050, 1250])
   b = coef_estimation(x, y)
   print("Estimated coefficients:\nb_0 = {} \nb_1 = {}".format(b[0], b[1]))
   plot_regression_line(x, y, b)
   
if __name__ == "__main__":
main()

Salida

Estimated coefficients:
b_0 = 154.5454545454545
b_1 = 117.87878787878788

Example 2 - En el siguiente ejemplo de implementación de Python, usamos un conjunto de datos de diabetes de scikit-learn.

Primero, comenzaremos con la importación de paquetes necesarios de la siguiente manera:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

A continuación, cargaremos el conjunto de datos de diabetes y crearemos su objeto:

diabetes = datasets.load_diabetes()

Mientras implementamos SLR, usaremos solo una característica de la siguiente manera:

X = diabetes.data[:, np.newaxis, 2]

A continuación, necesitamos dividir los datos en conjuntos de entrenamiento y prueba de la siguiente manera:

X_train = X[:-30]
X_test = X[-30:]

A continuación, debemos dividir el objetivo en conjuntos de entrenamiento y prueba de la siguiente manera:

y_train = diabetes.target[:-30]
y_test = diabetes.target[-30:]

Ahora, para entrenar el modelo, necesitamos crear un objeto de regresión lineal de la siguiente manera:

regr = linear_model.LinearRegression()

A continuación, entrene el modelo utilizando los conjuntos de entrenamiento de la siguiente manera:

regr.fit(X_train, y_train)

A continuación, haga predicciones utilizando el conjunto de pruebas de la siguiente manera:

y_pred = regr.predict(X_test)

A continuación, imprimiremos algunos coeficientes como MSE, puntuación de varianza, etc. de la siguiente manera:

print('Coefficients: \n', regr.coef_)
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
print('Variance score: %.2f' % r2_score(y_test, y_pred))

Ahora, grafique las salidas de la siguiente manera:

plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

Salida

Coefficients:
   [941.43097333]
Mean squared error: 3035.06
Variance score: 0.41

Regresión lineal múltiple (MLR)

Es la extensión de la regresión lineal simple que predice una respuesta utilizando dos o más características. Matemáticamente podemos explicarlo de la siguiente manera:

Considere un conjunto de datos que tiene n observaciones, p características, es decir, variables independientes ey como una respuesta, es decir, variable dependiente, la línea de regresión para p características se puede calcular de la siguiente manera:

$$ h (x_ {i}) = b_ {0} + b_ {1} x_ {i1} + b_ {2} x_ {i2} + ... + b_ {p} x_ {ip} $$

Aquí, h (x i ) es el valor de respuesta previsto y b 0 , b 1 , b 2 …, b p son los coeficientes de regresión.

Los modelos de regresión lineal múltiple siempre incluyen los errores en los datos conocidos como error residual que cambia el cálculo de la siguiente manera:

$$ h (x_ {i}) = b_ {0} + b_ {1} x_ {i1} + b_ {2} x_ {i2} + ... + b_ {p} x_ {ip} + e_ {i} $$

También podemos escribir la ecuación anterior de la siguiente manera:

$$ y_ {i} = h (x_ {i}) + e_ {i} \: o \: e_ {i} = y_ {i} - h (x_ {i}) $$

Implementación de Python

en este ejemplo, usaremos el conjunto de datos de viviendas de Boston de scikit learn -

Primero, comenzaremos con la importación de paquetes necesarios de la siguiente manera:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, metrics

A continuación, cargue el conjunto de datos de la siguiente manera:

boston = datasets.load_boston(return_X_y=False)

Las siguientes líneas de secuencia de comandos definirán la matriz de características, X y el vector de respuesta, Y -

X = boston.data
y = boston.target

A continuación, divida el conjunto de datos en conjuntos de entrenamiento y prueba de la siguiente manera:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.7, random_state=1)

Ejemplo

Ahora, cree un objeto de regresión lineal y entrene el modelo de la siguiente manera:

reg = linear_model.LinearRegression()
reg.fit(X_train, y_train)
print('Coefficients: \n', reg.coef_)
print('Variance score: {}'.format(reg.score(X_test, y_test)))
plt.style.use('fivethirtyeight')
plt.scatter(reg.predict(X_train), reg.predict(X_train) - y_train,
   color = "green", s = 10, label = 'Train data')
plt.scatter(reg.predict(X_test), reg.predict(X_test) - y_test,
   color = "blue", s = 10, label = 'Test data')
plt.hlines(y = 0, xmin = 0, xmax = 50, linewidth = 2)
plt.legend(loc = 'upper right')
plt.title("Residual errors")
plt.show()

Salida

Coefficients:
[
   -1.16358797e-01  6.44549228e-02  1.65416147e-01  1.45101654e+00
   -1.77862563e+01  2.80392779e+00  4.61905315e-02 -1.13518865e+00
    3.31725870e-01 -1.01196059e-02 -9.94812678e-01  9.18522056e-03
   -7.92395217e-01
]
Variance score: 0.709454060230326

Supuestos

Las siguientes son algunas suposiciones sobre el conjunto de datos que se realiza mediante el modelo de regresión lineal:

Multi-collinearity- El modelo de regresión lineal asume que hay muy poca o ninguna multicolinealidad en los datos. Básicamente, la multicolinealidad ocurre cuando las variables o características independientes tienen dependencia en ellas.

Auto-correlation- Otro supuesto que asume el modelo de regresión lineal es que hay muy poca o ninguna autocorrelación en los datos. Básicamente, la autocorrelación ocurre cuando hay dependencia entre errores residuales.

Relationship between variables - El modelo de regresión lineal asume que la relación entre las variables de respuesta y características debe ser lineal.