Capítulo 1

Cuando los Modelos Encuentran los Datos

1.1 Datos, Modelos y Aprendizaje

Tenemos datos D={(xi,yi)}i=1n\mathcal{D} = \{(\mathbf{x}_i, y_i)\}_{i=1}^n, un modelo f(x;θ)f(\mathbf{x}; \theta), y buscamos los parámetros θ que mejor expliquen los datos.

Datos

Pares entrada-salida. Pueden ser etiquetados (supervisado) o no (no supervisado).

Modelo

Hipótesis parametrizada que relaciona X e Y. Ej: lineales, árboles, redes.

Aprendizaje

Proceso de ajustar θ para minimizar una función de pérdida.

1.2 Riesgo Empírico

El riesgo empírico es el promedio de la pérdida sobre los datos de entrenamiento:

Remp(θ)=1ni=1nL(yi,f(xi;θ))R_{\text{emp}}(\theta) = \frac{1}{n} \sum_{i=1}^n L(y_i, f(\mathbf{x}_i; \theta))

El riesgo real R(θ)=Ep(x,y)[L(y,f(x;θ))]R(\theta) = \mathbb{E}_{p(\mathbf{x}, y)}[L(y, f(\mathbf{x}; \theta))] no es computable porque no conocemos la distribución real. El riesgo empírico es una aproximación.

python
import numpy as np
from sklearn.metrics import mean_squared_error

# Riesgo empírico = error en training
y_true = np.array([1.0, 2.0, 3.0])
y_pred = np.array([1.1, 1.9, 3.2])

empirical_risk = mean_squared_error(y_true, y_pred)
print(f"Riesgo empírico (MSE): {empirical_risk:.4f}")

# Para clasificación: accuracy / 0-1 loss
from sklearn.metrics import zero_one_loss
risk_01 = zero_one_loss(y_true > 2, y_pred > 2)
print(f"Riesgo empírico (0-1): {risk_01:.4f}")

1.3 Sesgo y Varianza (revisión ML)

El error de generalización se descompone en:

E[(yf^(x))2]=Sesgo[f^(x)]2subestimacioˊn+Var[f^(x)]sobreajuste+σ2\mathbb{E}[(y - \hat{f}(x))^2] = \underbrace{\text{Sesgo}[\hat{f}(x)]^2}_{\text{subestimación}} + \underbrace{\text{Var}[\hat{f}(x)]}_{\text{sobreajuste}} + \sigma^2

Alto sesgo

Modelo muy simple. No captura patrones. Underfitting.

Alta varianza

Modelo muy complejo. Aprende ruido. Overfitting.

Trade-off

Aumentar complejidad reduce sesgo pero aumenta varianza.

1.4 Selección de Modelos

Para elegir entre modelos, usamos validación cruzada o criterios de información:

Validación Cruzada (k-fold)

Dividir datos en k folds. Entrenar en k-1, validar en el restante. Repetir k veces.

AIC / BIC

Penalizan la complejidad del modelo. AIC = -2ln(L) + 2k. BIC = -2ln(L) + k·ln(n).

python
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
import numpy as np

X = np.random.randn(200, 5)
y = X @ np.array([1, -0.5, 0, 0.3, 0]) + 0.1 * np.random.randn(200)

for depth in [1, 3, 5, 10]:
    model = DecisionTreeRegressor(max_depth=depth)
    scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
    print(f"depth={depth}: MSE = {-scores.mean():.4f} (±{scores.std():.4f})")

1.5 Modelos Gráficos (Direccionales)

Los modelos gráficos dirigidos (bayesian networks) representan dependencias condicionales entre variables como un grafo acíclico dirigido.

p(x)=i=1dp(xipa(xi))p(\mathbf{x}) = \prod_{i=1}^d p(x_i \mid \text{pa}(x_i))

Ej: modelo naive Bayes (todas las features independientes dada la clase).

python
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=500, n_features=10, random_state=42)
model = GaussianNB()
scores = cross_val_score(model, X, y, cv=5)
print(f"Naive Bayes accuracy: {scores.mean():.3f} (±{scores.std():.3f})")