Mínimos cuadrados ordinarios (regresión lineal)#
El modelo lineal se define como:
\hat{y}(w,x)=w_0 + w_1 x_1 + \cdots + w_p x_p
En la regresión lineal, los parámetros son calculados minimizando la suma de residuales al cuadrado:
\min_w ||Xw -y||_2^2 = \min_w ||e||_2^2
La estimación de los parámetros del modelo minimizando el MSE supone que los errores siguen una distribución normal con media cero y varianza finita y constante.
Si las características están correlacionadas (dependencia lineal aproximada), los resultados son altamente sensitivos a los errores aleatorios en la variable objetivo.
[1]:
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
X, y_true = make_regression(
n_samples=100,
n_features=1,
n_informative=1,
#
# Intecepto
bias=0.0,
#
# numero de vectores singulares para explicar
# los datos
effective_rank=None,
#
# importancia relativa de las colas
tail_strength=0.9,
noise=12.0,
shuffle=False,
coef=False,
random_state=0,
)
plt.figure(figsize=(3.5, 3.5))
plt.scatter(X, y_true, color="tab:blue", alpha=0.8, edgecolors="white")
plt.gca().spines["left"].set_color("gray")
plt.gca().spines["bottom"].set_color("gray")
plt.gca().spines["top"].set_visible(False)
plt.gca().spines["right"].set_visible(False)
plt.plot()
[1]:
[]
[2]:
from sklearn.linear_model import LinearRegression
linearRegression = LinearRegression(
# -------------------------------------------------------------------------
# Ajusta el intercepto?
fit_intercept=True,
)
linearRegression.fit(X, y_true)
display(
linearRegression.coef_,
linearRegression.intercept_,
linearRegression.score(X, y_true),
)
array([42.66621538])
-0.9770181924368713
0.9183527010047458
[3]:
import numpy as np
line_X = np.linspace(X.min(), X.max())[:, np.newaxis]
y_pred = linearRegression.predict(line_X)
plt.figure(figsize=(3.5, 3.5))
plt.scatter(X, y_true, color="tab:blue", alpha=0.8, edgecolors="white")
plt.plot(line_X, y_pred, "k", linewidth=2)
plt.gca().spines["left"].set_color("gray")
plt.gca().spines["bottom"].set_color("gray")
plt.gca().spines["top"].set_visible(False)
plt.gca().spines["right"].set_visible(False)
plt.show()
Este modelo es altamente sensible a outliers
[4]:
import numpy as np
n_outliers = 5
np.random.seed(0)
X[:n_outliers] = 3 + 0.5 * np.random.normal(size=(n_outliers, 1))
y_true[:n_outliers] = -3 + 10 * np.random.normal(size=n_outliers)
linearRegression.fit(X, y_true)
line_X = np.linspace(X.min(), X.max())[:, np.newaxis]
y_pred = linearRegression.predict(line_X)
plt.figure(figsize=(5, 5))
plt.scatter(X, y_true, color="tab:blue", alpha=0.8, edgecolors="white")
plt.plot(line_X, y_pred, "k", linewidth=2)
plt.gca().spines["left"].set_color("gray")
plt.gca().spines["bottom"].set_color("gray")
plt.gca().spines["top"].set_visible(False)
plt.gca().spines["right"].set_visible(False)
plt.show()