De Estadística a ML Distribuido
Aprende a escalar algoritmos de Machine Learning desde un laptop hasta un cluster de 1000 nodos.
Domina la ingeniería detrás de la matemática que ya conoces.
01. El Problema de Escala
La estadística clásica asume que los datos caben en memoria. Pero en Big Data, un dataset de 1TB no cabe en ningún laptop. Necesitamos distribuir los cálculos.
Con \(n = 10^9\) filas y \(p = 1000\) features → 1 petaflop de cómputo.
Comparación: Laptop vs Cluster
| Recurso | Laptop | Cluster (100 nodos) |
|---|---|---|
| RAM | 16 GB | 1.6 TB |
| Cores | 8 | 800 |
| Tiempo (regresión 1TB) | Imposible | ~5 minutos |
10GB] Split --> P2[Partición 2
10GB] Split --> P3[...] Split --> P100[Partición 100
10GB] P1 --> W1[Worker 1] P2 --> W2[Worker 2] P3 --> W3[Worker ...] P100 --> W100[Worker 100] W1 --> Agg[Agregar Resultados] W2 --> Agg W3 --> Agg W100 --> Agg Agg --> Result[Modelo Final] style Data fill:#E74C3C,stroke:#fff style Result fill:#27AE60,stroke:#fff
02. ¿Qué es Spark ML?
DataFrame = Matriz Distribuida
En estadística: \(X \in \mathbb{R}^{n \times p}\) es una matriz en memoria.
En Spark: DataFrame es la misma matriz, pero particionada en múltiples nodos.
X = np.array([[1, 2], [3, 4]])
# Spark ML
df = spark.createDataFrame([
(1, 2), (3, 4)
], ["x1", "x2"])
Operaciones Lazy (Perezosas)
Spark no ejecuta inmediatamente. Construye un DAG (grafo) de operaciones y las optimiza antes de ejecutar.
df_grouped = df_filtered.groupBy("city")
# Nada se ejecuta hasta aquí ↓
result = df_grouped.count().collect()
Para el Estadístico: ¿Por qué no usar scikit-learn?
- • Todo en memoria RAM
- • Máximo ~10GB de datos
- • Un solo core (mayoría)
- • No escala a cluster
- • Datos en disco/HDFS
- • Hasta petabytes
- • Miles de cores
- • Escala horizontal
- • sklearn: Datos < 5GB
- • Spark ML: Datos > 100GB
- • Ambos: Prototipo en sklearn, producción en Spark
03. Anatomía de un Pipeline de ML
CSV/Parquet] --> Clean[🧹 Limpieza
Nulls, Outliers] Clean --> FE[⚙️ Feature Engineering
VectorAssembler] FE --> Scale[📏 Normalización
StandardScaler] Scale --> Model[🧠 Modelo
LinearRegression] Model --> Pred[🎯 Predicciones
y_hat] style Raw fill:#3498DB,stroke:#fff style FE fill:#E74C3C,stroke:#fff style Model fill:#27AE60,stroke:#fff style Pred fill:#F39C12,stroke:#fff
Matemática: Composición de Funciones
Cada \(f_i\) es una transformación. El pipeline las ejecuta en secuencia automáticamente.
Ingeniería: Código PySpark
from pyspark.ml import Pipeline
from pyspark.ml.feature import VectorAssembler, StandardScaler
from pyspark.ml.regression import LinearRegression
# Definir etapas del pipeline
assembler = VectorAssembler(
inputCols=["edad", "salario"],
outputCol="features"
)
scaler = StandardScaler(
inputCol="features",
outputCol="scaled_features"
)
lr = LinearRegression(
featuresCol="scaled_features",
labelCol="target"
)
# Crear pipeline (composición)
pipeline = Pipeline(stages=[assembler, scaler, lr])
# Entrenar (ejecuta todas las etapas)
model = pipeline.fit(train_df)
# Predecir
predictions = model.transform(test_df)
🔗 Conexión Teoría-Práctica
En estadística, escribirías: "Primero normalizo \(X\), luego ajusto \(\beta = (X^T X)^{-1} X^T y\)".
En Spark ML, el Pipeline hace exactamente eso, pero distribuido en 100 nodos.
La matemática es idéntica, la ejecución es paralela.
📚 Módulos de Aprendizaje
1. Fundamentos de ML Distribuido
Álgebra lineal en un cluster: de vectores a particiones. MapReduce, broadcast variables, y operaciones matriciales distribuidas.
2. Pipelines de Machine Learning
VectorAssembler, Transformers vs Estimators, StandardScaler, PCA. Composición de transformaciones end-to-end.
3. Feature Engineering Avanzado
One-Hot Encoding, matrices sparse, StringIndexer, Bucketizer, PolynomialExpansion. De variables categóricas a vectores binarios.
4. Reto: One-Hot Encoding Manual
Implementa OHE sin librerías para entender matrices sparse. Dataset con 50,000 categorías. Validación vs OneHotEncoder oficial.