Datos
Pares entrada-salida. Pueden ser etiquetados (supervisado) o no (no supervisado).
Capítulo 1
Tenemos datos , un modelo , y buscamos los parámetros θ que mejor expliquen los datos.
Pares entrada-salida. Pueden ser etiquetados (supervisado) o no (no supervisado).
Hipótesis parametrizada que relaciona X e Y. Ej: lineales, árboles, redes.
Proceso de ajustar θ para minimizar una función de pérdida.
El riesgo empírico es el promedio de la pérdida sobre los datos de entrenamiento:
El riesgo real no es computable porque no conocemos la distribución real. El riesgo empírico es una aproximación.
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}")El error de generalización se descompone en:
Modelo muy simple. No captura patrones. Underfitting.
Modelo muy complejo. Aprende ruido. Overfitting.
Aumentar complejidad reduce sesgo pero aumenta varianza.
Para elegir entre modelos, usamos validación cruzada o criterios de información:
Dividir datos en k folds. Entrenar en k-1, validar en el restante. Repetir k veces.
Penalizan la complejidad del modelo. AIC = -2ln(L) + 2k. BIC = -2ln(L) + k·ln(n).
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})")Los modelos gráficos dirigidos (bayesian networks) representan dependencias condicionales entre variables como un grafo acíclico dirigido.
Ej: modelo naive Bayes (todas las features independientes dada la clase).
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})")