Regresión lineal
El modelo más sencillo y más usado para predecir un número: mínimos cuadrados, ecuación normal, descenso de gradiente y cómo leer sus coeficientes, con resultados reales.
01Qué es
La regresión lineal predice un valor numérico como una suma ponderada de las variables de entrada más un término independiente. Aprender el modelo es encontrar los pesos que hacen que esa suma se parezca lo más posible a los valores reales, normalmente minimizando el error cuadrático medio (mínimos cuadrados, un método que publicó Legendre en 1805 y que Gauss usaba desde antes).
Es la línea base de cualquier problema de regresión: rápida, interpretable y, sorprendentemente a menudo, difícil de superar cuando hay pocos datos.
02Intuición
Con una sola variable, es trazar la recta que mejor atraviesa una nube de puntos: la que hace más pequeña la suma de las distancias verticales al cuadrado. Elevar al cuadrado castiga mucho los errores grandes y hace que el problema tenga una solución única y cerrada.
Con varias variables la recta se convierte en un hiperplano, y cada peso responde a la pregunta: «si esta variable sube una unidad y las demás no cambian, ¿cuánto cambia la predicción?».
En el laboratorio de sobreajuste, el grado 1 es exactamente una regresión lineal. Sube el grado para ver qué pasa al darle más flexibilidad.
03Fundamento matemático
El modelo y la función de pérdida:
Como la pérdida es una parábola en w (convexa), su mínimo está donde el gradiente es cero. Eso da la ecuación normal:
Si hay muchas variables o muchos datos, resolver ese sistema es caro y se usa el descenso de gradiente, que da pasos en contra del gradiente:
Añadir un castigo a la pérdida da la regresión Ridge, cuya solución es : más estable cuando las variables están correlacionadas.
04Algoritmo paso a paso
- Reúne las variables en una matriz X (n filas, p columnas) y añade una columna de unos para el término independiente.
- Si vas a usar descenso de gradiente, estandariza las variables (media 0, desviación 1).
- Calcula los pesos: con la ecuación normal (resolviendo el sistema) o iterando el descenso de gradiente.
- Predice multiplicando las nuevas filas por los pesos.
- Evalúa en datos no vistos con RMSE, MAE y R², y revisa los residuos.
05Pseudocódigo
función AJUSTAR_ECUACIÓN_NORMAL(X, y):
X ← [1 | X] # columna de unos
resolver (XᵀX) w = Xᵀy
devolver w
función AJUSTAR_GRADIENTE(X, y, η, pasos):
w ← 0 ; b ← 0
repetir pasos veces:
e ← X·w + b − y
w ← w − η · (2/n) · Xᵀe
b ← b − η · (2/n) · Σe
devolver w, b
función PREDECIR(w, x):
devolver w₀ + Σ wⱼ·xⱼ06Implementación desde cero en Python
Con la ecuación normal
import numpy as np
# Añadimos una columna de unos para el término independiente (sesgo)
Xb = np.c_[np.ones(len(X_tr)), X_tr]
# Ecuación normal: (XᵀX) w = Xᵀy → se resuelve el sistema, no se invierte la matriz
w = np.linalg.solve(Xb.T @ Xb, Xb.T @ y_tr)
pred = np.c_[np.ones(len(X_te)), X_te] @ wCon descenso de gradiente
from sklearn.preprocessing import StandardScaler
sc = StandardScaler().fit(X_tr) # el descenso de gradiente necesita escalas parecidas
Xs, Xts = sc.transform(X_tr), sc.transform(X_te)
w, b, eta = np.zeros(X.shape[1]), 0.0, 0.1
for paso in range(2000):
error = Xs @ w + b - y_tr
w -= eta * 2 * Xs.T @ error / len(y_tr) # ∂MSE/∂w
b -= eta * 2 * error.mean() # ∂MSE/∂b
pred_gd = Xts @ w + bLas dos llegan al mismo sitio. La ecuación normal da exactamente las mismas predicciones que scikit-learn (RMSE 53,85 en test). El descenso de gradiente, tras 2.000 pasos, también da un RMSE de 53,85 y difiere de scikit-learn en menos de 0,3 unidades en cualquier predicción.
07Implementación con Scikit-learn
from sklearn.linear_model import LinearRegression
modelo = LinearRegression().fit(X_tr, y_tr)
modelo.coef_ # un peso por variable
modelo.intercept_ # término independiente
modelo.predict(X_te)LinearRegression resuelve mínimos cuadrados con una descomposición numérica estable, sin necesidad de escalar las variables. Para regularizar, Ridge, Lasso y ElasticNet tienen la misma interfaz.
08Dataset de ejemplo
Se usa el dataset Diabetes incluido en scikit-learn, publicado por Efron, Hastie, Johnstone y Tibshirani (2004): 442 pacientes con 10 variables medidas al inicio (edad, sexo, índice de masa corporal, tensión arterial media y seis análisis de sangre, s1 a s6). El objetivo es una medida cuantitativa de la progresión de la enfermedad un año después, entre 25 y 346 (media 152,1).
En la versión de scikit-learn las variables vienen ya centradas y escaladas, por eso los coeficientes no están en unidades físicas.
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
X, y = load_diabetes(return_X_y=True) # 442 pacientes, 10 variables
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42)09Entrenamiento
Con 353 filas de entrenamiento y 10 variables, fit tarda milisegundos. No hay hiperparámetros que ajustar en la versión básica; en Ridge o Lasso, la fuerza de la regularización se elige con validación cruzada (RidgeCV, LassoCV).
10Evaluación
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import cross_val_score
pred = modelo.predict(X_te)
print(mean_squared_error(y_te, pred) ** 0.5) # RMSE 53.85
print(mean_absolute_error(y_te, pred)) # MAE 42.79
print(r2_score(y_te, pred)) # R² 0.453
print(cross_val_score(LinearRegression(), X, y, cv=5, scoring="r2").mean()) # 0.482| Modelo | RMSE en test | R² en test |
|---|---|---|
| Predecir siempre la media | 73,22 | 0 |
| Solo el índice de masa corporal | — | 0,233 |
| Regresión lineal (10 variables) | 53,85 | 0,453 |
| Ridge, λ = 0,1 | — | 0,461 |
El modelo reduce el error un 26 % respecto a predecir la media. Su R² en entrenamiento es 0,528 y en test 0,453: la diferencia es pequeña, así que no hay sobreajuste importante. La validación cruzada de 5 particiones da un R² de 0,482 ± 0,049, más fiable que una sola partición.
11Métricas
El RMSE está en las mismas unidades que el objetivo y castiga más los errores grandes; el MAE es más robusto frente a valores extremos. El R² es la fracción de la varianza explicada: 0 equivale a predecir la media y 1 a acertar siempre. Un R² de 0,45 significa que el modelo explica algo menos de la mitad de la variación entre pacientes, lo esperable con 10 medidas clínicas para un fenómeno tan complejo.
12Visualización
Cuidado al leerlos: s1 (colesterol total) tiene el coeficiente más grande y negativo, y s2 (LDL) uno grande y positivo. No significa que el colesterol proteja: las dos variables están muy correlacionadas y el modelo compensa una con la otra. Es la multicolinealidad. Ridge reduce este efecto repartiendo el peso entre variables correlacionadas.
13Ventajas
- Muy rápida de entrenar y de ejecutar, incluso con millones de filas.
- Interpretable: cada peso tiene un significado directo (con las precauciones de arriba).
- Solución única y exacta; no depende de semillas aleatorias.
- Con pocos datos suele generalizar mejor que modelos más complejos.
- Base teórica muy estudiada: intervalos de confianza, contrastes, diagnóstico de residuos.
14Limitaciones
- Solo captura relaciones lineales, salvo que añadas tú las transformaciones (cuadrados, interacciones, logaritmos).
- Sensible a valores atípicos, porque el error se eleva al cuadrado.
- Los coeficientes se vuelven inestables con variables muy correlacionadas.
- Puede predecir valores imposibles (negativos, fuera de rango).
15Hiperparámetros
| Parámetro | Por defecto | Efecto |
|---|---|---|
fit_intercept | True | Aprende el término independiente w₀. Casi siempre debe quedarse activado. |
positive | False | Obliga a que todos los pesos sean ≥ 0 (útil si el signo tiene que ser positivo por el problema). |
alpha (Ridge / Lasso) | 1.0 | Fuerza de la regularización. Con Ridge en este dataset, α = 0,1 da el mejor R² en test (0,461); α = 10 lo hunde a 0,161. |
l1_ratio (ElasticNet) | 0.5 | Mezcla entre L1 (Lasso) y L2 (Ridge). |
Sobre L1 y L2, ver el laboratorio Lasso contra Ridge.
16Casos de uso
- Línea base obligatoria antes de probar cualquier modelo de regresión.
- Precios (vivienda, seguros) cuando la interpretabilidad importa.
- Estimar el efecto de una variable controlando por otras (econometría, estudios clínicos).
- Previsión de demanda simple con variables de calendario.
17Aplicaciones industriales
- Calibración de sensores: relacionar la lectura bruta con el valor real.
- Energía: consumo en función de temperatura, hora y día de la semana.
- Telecomunicaciones: estimar tráfico o latencia a partir de la carga de la red.
- Procesos industriales: modelos de sustitución (soft sensors) que estiman una variable cara de medir a partir de otras baratas.
18Ejercicio práctico
Añade términos polinómicos y compara el rendimiento en entrenamiento y test. Busca el grado a partir del cual el modelo empieza a sobreajustar y comprueba si subir α en Ridge lo compensa.
# Ejercicio: añade términos cuadráticos y de interacción y compara el R² en test.
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import Ridge
for grado in (1, 2, 3):
m = make_pipeline(PolynomialFeatures(grado), Ridge(alpha=0.1)).fit(X_tr, y_tr)
# ... imprime m.score(X_tr, y_tr) y m.score(X_te, y_te). ¿A partir de qué grado sobreajusta?19Código completo
El script completo con todos los experimentos de esta página está en el repositorio y se puede ejecutar en Google Colab sin instalar nada.
20Referencias y papers
- A.-M. Legendre (1805). Nouvelles méthodes pour la détermination des orbites des comètes. París: Firmin Didot. (Primera publicación del método de mínimos cuadrados).
- C. F. Gauss (1809). Theoria motus corporum coelestium in sectionibus conicis solem ambientium. Hamburgo: Perthes et Besser.
- A. E. Hoerl, R. W. Kennard (1970). «Ridge Regression: Biased Estimation for Nonorthogonal Problems». Technometrics, 12(1), 55–67.
- B. Efron, T. Hastie, I. Johnstone, R. Tibshirani (2004). «Least Angle Regression». The Annals of Statistics, 32(2), 407–499. (Origen del dataset Diabetes).
- T. Hastie, R. Tibshirani, J. Friedman (2009). The Elements of Statistical Learning, 2.ª ed., capítulo 3. Springer.