Curso / fast.ai / Lección 5
● piloto de formato

fast.ai · Practical Deep Learning for Coders · Lección 5

Modelo desde cero, otra vez: por qué repetirlo con datos tabulares

Esta lección no enseña conceptos nuevos de SGD — los repite, a propósito, sobre un dominio distinto (datos tabulares del Titanic en vez de imágenes de MNIST) para consolidar que el mecanismo es genuinamente el mismo en cualquier tipo de dato. Y cierra con el argumento más pragmático del curso: por qué, aun sabiendo programarlo a mano, conviene usar un framework.

1. El mismo proceso, otro dominio: de MNIST a Titanic

En la Lección 3 armaste, a mano, un modelo lineal y después una red de dos capas para clasificar dígitos. Acá el ejercicio se repite con el dataset del Titanic de Kaggle (predecir quién sobrevivió al hundimiento, a partir de clase de pasaje, sexo, edad, tarifa pagada, cantidad de familiares a bordo) — deliberadamente, para que quede claro que no hay nada específico de imágenes en SGD: los mismos siete pasos (predecir, medir loss, calcular gradiente, dar un step) aplican sin cambios a filas de una tabla.

Lo único que cambia entre MNIST y Titanic es el preprocesamiento de la entrada — cómo se convierte cada fila en un vector de números que un modelo lineal pueda multiplicar.

2. Preprocesar datos tabulares para un modelo lineal

A diferencia de una imagen (ya es una grilla de números), una tabla mezcla tipos de dato heterogéneos que hay que normalizar a una representación numérica uniforme antes de poder aplicar xb@weights + bias:

  • Variables categóricas (sexo, puerto de embarque): se convierten a columnas dummy/one-hot — una columna binaria por categoría posible, en vez de un único número arbitrario (asignar 0/1/2 a categorías sin orden real induciría una relación numérica falsa entre ellas).
  • Variables continuas (edad, tarifa): se normalizan (restar la media, dividir por el desvío estándar) para que ninguna columna domine el gradiente solo por tener una escala numérica más grande.
  • Missing values (edad faltante en buena parte de los pasajeros): se rellenan con un valor razonable (la mediana) y, cuando importa no perder esa información, se agrega una columna booleana extra marcando qué filas tenían el dato faltante.

Con esto armado, el mismo patrón de la Lección 3 aplica sin cambios: un modelo lineal (xb@weights + bias) entrenado con mse o una loss binaria equivalente a mnist_loss, con un techo de accuracy bajo por ser puramente lineal — y después, una capa oculta con ReLU entre dos capas lineales para levantar ese techo, exactamente como con los dígitos.

3. Por qué usar un framework (y qué esconde)

Habiendo ya escrito linear1, el loop de gradientes y simple_net a mano dos veces (MNIST y Titanic), el curso hace explícito el argumento pedagógico completo: entender el mecanismo desde cero te da la capacidad de diagnosticar cuando algo sale mal — pero escribirlo a mano en cada proyecto real es un desperdicio de tiempo y una fuente de bugs sutiles. Un framework como fastai o PyTorch de alto nivel no reemplaza el conocimiento de qué está pasando por dentro — automatiza exactamente eso que ya escribiste, y agrega detalles de estabilidad numérica y performance que no vale la pena reinventar cada vez: inicialización cuidadosa de pesos, manejo de NaN/overflow, batching eficiente en GPU, schedulers de learning rate.

📜 La analogía del propio curso

Saber cómo funciona SGD por dentro y aun así usar Learner.fit() de fastai es como saber cómo funciona un motor de combustión y aun así manejar un auto con caja automática: el conocimiento no se desperdicia — te permite reconocer cuándo algo anda raro (el motor suena distinto, el loss no baja como debería) que alguien que solo sabe "girar la llave" no puede diagnosticar.

4. Preview: la alternativa de árboles de decisión

La lección cierra con un adelanto de lo que viene en la Lección 6: para datos tabulares específicamente, existe una familia de modelos completamente distinta a las redes neuronales — los árboles de decisión — que suele ser más rápida de entrenar, necesita casi nada de preprocesamiento (tolera variables categóricas sin one-hot, no necesita normalizar continuas) y es mucho más fácil de interpretar. Un árbol simplemente hace preguntas binarias sucesivas sobre las columnas ("¿Sexo == mujer?", "¿Clase de pasaje == 1?") eligiendo en cada paso la pregunta que más reduce el error de predicción, sin ningún gradiente ni SGD de por medio.

Random forests promedian muchos árboles así entrenados sobre subconjuntos aleatorios de datos, y son frecuentemente la primera cosa que probar en un problema tabular nuevo antes de siquiera considerar una red neuronal — el tema central de la próxima lección.

5. Resumen

  1. SGD no tiene nada específico de imágenes — el mismo mecanismo de la Lección 3 aplica sin cambios a datos tabulares del Titanic.
  2. Lo que cambia entre dominios es el preprocesamiento: one-hot para categóricas, normalización para continuas, imputación para missing values.
  3. Escribir SGD a mano una vez te da el diagnóstico; usar un framework después te ahorra reinventar estabilidad numérica y performance en cada proyecto.
  4. Para datos tabulares, los árboles de decisión y random forests son una alternativa a las redes neuronales — más simples, casi sin preprocesamiento, muy interpretables — y suelen ser el primer modelo a probar.