HUB CENTRAL

SECCIÓN 13.SparkML()

MACHINE LEARNING DISTRIBUIDO

DISTRIBUTED LEARNING

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.

Complejidad Computacional
$$ \text{Regresión Lineal: } \beta = (X^T X)^{-1} X^T y $$
Problema: \(X^T X\) requiere \(O(n \times p^2)\) operaciones.
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
graph TB Data[Dataset 1TB] --> Split{Particionar} Split --> P1[Partición 1
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.

# Estadística clásica (NumPy)
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_filtered = df.filter(col("age") > 18)
df_grouped = df_filtered.groupBy("city")

# Nada se ejecuta hasta aquí ↓
result = df_grouped.count().collect()
💡 Esto permite optimizaciones imposibles en pandas/NumPy.

Para el Estadístico: ¿Por qué no usar scikit-learn?

❌ scikit-learn
  • • Todo en memoria RAM
  • • Máximo ~10GB de datos
  • • Un solo core (mayoría)
  • • No escala a cluster
✅ Spark ML
  • • Datos en disco/HDFS
  • • Hasta petabytes
  • • Miles de cores
  • • Escala horizontal
🎯 Cuándo usar cada uno
  • sklearn: Datos < 5GB
  • Spark ML: Datos > 100GB
  • Ambos: Prototipo en sklearn, producción en Spark

03. Anatomía de un Pipeline de ML

graph LR Raw[📊 Datos Raw
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

$$ \begin{aligned} \text{Pipeline: } & h(x) = f_4(f_3(f_2(f_1(x)))) \\[0.5em] \text{Donde:} \\ f_1 &: \text{VectorAssembler} \\ f_2 &: \text{StandardScaler} \\ f_3 &: \text{PCA (opcional)} \\ f_4 &: \text{LinearRegression} \end{aligned} $$

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