📘 Lección 2: El Mapa del Tesoro — Entendiendo el Flujo de Trabajo de un Proyecto de Machine Learning

"No empieces a cocinar sin una receta. No construyas un modelo sin un plan."


⏱️ Duración estimada de esta lección: 60-75 minutos


🧭 ¿Por qué esta lección es tan importante?

Muchos principiantes cometen el mismo error: quieren saltar directamente al modelo.

"¡Quiero entrenar una IA como ChatGPT YA!"

Pero eso es como querer construir un avión sin saber qué es un tornillo.

En esta lección, no solo aprenderás los pasos de un proyecto de ML… aprenderás por qué cada paso existe, qué pasa si lo saltas, y cómo pensar como un científico de datos desde el minuto uno.

Al final, tendrás un mapa mental claro, que podrás aplicar a cualquier proyecto: clasificación de spam, predicción de precios, detección de fraudes, diagnóstico médico, ¡lo que sea!


🗺️ El Mapa del Tesoro: Los 5 Pasos de Oro de un Proyecto de ML

Imagina que eres un pirata buscando un tesoro enterrado. No puedes salir corriendo a cavar en cualquier lugar. Necesitas:

  1. Un mapa → Definir el problema.
  2. Buscar pistas → Conseguir y explorar los datos.
  3. Preparar tus herramientas → Limpiar y transformar los datos.
  4. Cavar en el lugar correcto → Entrenar el modelo.
  5. Verificar que es oro de verdad → Evaluar el modelo.

¡Eso es exactamente lo que haremos en ML!

Vamos a desglosar cada paso con detalle, con ejemplos reales, errores comunes y consejos de expertos.


🧩 Paso 1: Definir el Problema — ¿Qué quieres predecir? ¿Para quién? ¿Por qué?

"Un problema bien definido está medio resuelto."

Antes de tocar código, antes de buscar datos… detente y piensa.

🔍 Preguntas clave que debes hacerte:

  • ¿Qué quiero predecir?

    • ¿Una categoría? → Clasificación (spam/ham, gato/perro, aprobado/reprobado).
    • ¿Un número? → Regresión (precio de casa, temperatura, ventas del mes).
    • ¿Una secuencia? → Generación (texto, música, código).
  • ¿Quién usará esta predicción?

    • ¿Un médico? → Necesitas alta precisión, explicabilidad.
    • ¿Un usuario de app? → Necesitas velocidad, simplicidad.
    • ¿Un CEO? → Necesitas métricas de negocio claras.
  • ¿Por qué es importante resolver esto?

    • ¿Ahorra dinero? ¿Salva vidas? ¿Mejora la experiencia del usuario?
    • Si no puedes responder esto… quizás no vale la pena hacerlo.

🎯 Ejemplo 1: Clasificador de Spam

  • Qué: Predecir si un mensaje es "spam" o "ham" (no spam).
  • Quién: Usuarios de correo o SMS (quieren menos spam).
  • Por qué: Reducir el tiempo perdido, evitar fraudes, mejorar la productividad.

🎯 Ejemplo 2: Predictor de Precios de Casas

  • Qué: Predecir el precio (número) de una casa dadas sus características.
  • Quién: Compradores, vendedores, agentes inmobiliarios.
  • Por qué: Ayudar a fijar precios justos, acelerar ventas, reducir incertidumbre.

❌ Error común #1: Saltar este paso

"Voy a usar este dataset de Titanic porque está cool."

¡No! El dataset no es el objetivo. El problema es el objetivo. El dataset es solo una herramienta para resolverlo.


📦 Paso 2: Conseguir y Explorar los Datos — La Mina de Oro (o de Carbón)

"Los datos son el nuevo petróleo… pero a veces vienen llenos de barro."

Una vez definido el problema, necesitas datos. Sin datos, no hay ML.

🔍 ¿Dónde conseguir datos?

  • Datasets públicos: Kaggle, Hugging Face, UCI Machine Learning Repository, Google Dataset Search.
  • Tus propios datos: Encuestas, logs de tu app, historial de ventas, etc.
  • APIs: Twitter, Reddit, Google Trends, etc.
  • Web scraping (con cuidado y ética): BeautifulSoup, Scrapy.

🎯 Ejemplo: Dataset de SMS Spam

Lo usaremos en este curso. Está en Kaggle y es pequeño, limpio y perfecto para empezar.

import pandas as pd

url = "https://raw.githubusercontent.com/justmarkham/DAT8/master/data/sms.tsv"
data = pd.read_csv(url, sep='\t', names=['label', 'message'])

🔍 Exploración inicial: ¡Conoce a tus datos!

Nunca asumas que los datos están limpios. Siempre explóralos primero.

Hazte estas preguntas:

  • ¿Cuántas filas y columnas tiene?
print(data.shape)  # (5572, 2) → 5572 mensajes, 2 columnas
  • ¿Cómo se ven las primeras filas?
print(data.head())
  label                                            message
0   ham  Go until jurong point, crazy.. Available only ...
1   ham                      Ok lar... Joking wif u oni...
2  spam  Free entry in 2 a wkly comp to win FA Cup fina...
3   ham  U dun say so early hor... U c already then say...
4   ham  Nah I don't think he goes to usf, he lives aro...
  • ¿Cuántos valores únicos hay en la etiqueta?
print(data['label'].value_counts())
ham     4825
spam     747
Name: label, dtype: int64

→ ¡Tenemos muchos más "ham" que "spam"! Esto es importante (lo veremos en evaluación).

  • ¿Hay valores nulos?
print(data.isnull().sum())

→ En este caso, no. Pero en la vida real, ¡casi siempre hay!

  • ¿Cómo es la distribución de la longitud de los mensajes?
data['length'] = data['message'].apply(len)
print(data['length'].describe())
count    5572.000000
mean       80.489052
std        59.942492
min         2.000000
25%        36.000000
50%        61.000000
75%       111.000000
max       910.000000

→ ¡Hay mensajes de hasta 910 caracteres! ¿Serán spam? ¿Serán normales?

import matplotlib.pyplot as plt
import seaborn as sns

sns.histplot(data=data, x='length', hue='label', bins=50)
plt.title("Distribución de longitud de mensajes por tipo")
plt.show()

→ Verás que los mensajes de spam tienden a ser más largos. ¡Eso es una pista valiosa!


🧹 Paso 3: Preparar los Datos — Limpiar, Transformar, Dividir

"Si metes basura, sacas basura." — Ley de Garbage In, Garbage Out (GIGO)

Los modelos de ML son como motores de Fórmula 1: muy potentes, pero muy sensibles a la calidad del combustible.

🔧 Tareas comunes de preparación:

1. Manejo de valores nulos

# Si hubiera nulos, podrías:
# data = data.dropna()  # Eliminar filas con nulos
# o
# data['columna'] = data['columna'].fillna(data['columna'].mean())  # Rellenar con la media

2. Codificación de etiquetas (si es clasificación)

# Convertir 'ham'/'spam' a 0/1
data['label'] = data['label'].map({'ham': 0, 'spam': 1})

3. Dividir en train y test

¡Nunca, nunca, nunca entrenes y evalúes con los mismos datos!

from sklearn.model_selection import train_test_split

X = data['message']  # Características (features)
y = data['label']    # Etiqueta (target)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.2,   # 20% para test
    random_state=42  # Para que los resultados sean reproducibles
)

print(f"Train: {len(X_train)} mensajes")
print(f"Test: {len(X_test)} mensajes")

4. Vectorización (convertir texto en números)

Los modelos no entienden texto. Entienden números.

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)  # Aprende el vocabulario + transforma
X_test_vec = vectorizer.transform(X_test)        # Solo transforma (¡no aprende!)

print(f"Vocabulario: {len(vectorizer.vocabulary_)} palabras únicas")
print(f"Forma de X_train_vec: {X_train_vec.shape}")  # (4457, 7358) → 4457 mensajes, 7358 palabras

📌 ¿Qué hace CountVectorizer?

  • Crea un vocabulario con todas las palabras únicas en X_train.
  • Para cada mensaje, cuenta cuántas veces aparece cada palabra.
  • Convierte cada mensaje en un vector de números (frecuencias).

Ejemplo:

Mensaje: "free money now"
Vocabulario: ['free', 'money', 'now', 'click', 'here', ...]

Vector: [1, 1, 1, 0, 0, ...] → aparece "free" 1 vez, "money" 1 vez, etc.

🤖 Paso 4: Entrenar el Modelo — ¡La Magia (que no es magia)!

"Aquí es donde la computadora aprende… pero tú le das las herramientas."

Ahora sí, ¡llegó la hora de entrenar!

🔧 Elegir un algoritmo

Para clasificación de texto, un buen punto de partida es Naive Bayes Multinomial.

¿Por qué?

  • Es simple, rápido y funciona sorprendentemente bien con texto.
  • No necesita mucha potencia.
  • Es robusto ante datos desbalanceados (como nuestro dataset, con más "ham" que "spam").
from sklearn.naive_bayes import MultinomialNB

model = MultinomialNB()
model.fit(X_train_vec, y_train)  # ¡Entrena el modelo!

📌 ¿Qué hace fit()?

  • Aprende las probabilidades:
    • ¿Qué palabras aparecen más en spam?
    • ¿Qué palabras aparecen más en ham?
  • Guarda esas probabilidades internamente.

¡Eso es todo! Tu modelo ya "sabe" distinguir spam de ham.


📈 Paso 5: Evaluar el Modelo — ¿Funciona… o solo cree que funciona?

"No confíes en tu modelo. Ponlo a prueba."

Entrenar es fácil. Evaluar bien es lo que separa a los aficionados de los profesionales.

🔍 Predecir en el conjunto de test

y_pred = model.predict(X_test_vec)

📊 Calcular métricas

Accuracy (precisión global)

from sklearn.metrics import accuracy_score

acc = accuracy_score(y_test, y_pred)
print(f"Accuracy: {acc:.4f}")  # Ej: 0.9825 → 98.25% de aciertos

→ ¡Parece excelente! ¿Pero es suficiente?

Matriz de confusión

from sklearn.metrics import confusion_matrix
import seaborn as sns

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
            xticklabels=['Ham', 'Spam'], 
            yticklabels=['Ham', 'Spam'])
plt.title("Matriz de Confusión")
plt.ylabel("Verdadero")
plt.xlabel("Predicho")
plt.show()

→ Te mostrará algo como:

          Predicho
          Ham  Spam
Verdadero
Ham       950    5
Spam       10   150

→ ¿Qué significa?

  • Verdaderos Negativos (TN): 950 mensajes ham correctamente clasificados.
  • Falsos Positivos (FP): 5 mensajes ham clasificados como spam (¡error grave!).
  • Falsos Negativos (FN): 10 mensajes spam clasificados como ham (¡error grave!).
  • Verdaderos Positivos (TP): 150 mensajes spam correctamente clasificados.

Reporte de clasificación

from sklearn.metrics import classification_report

print(classification_report(y_test, y_pred, target_names=['Ham', 'Spam']))
              precision    recall  f1-score   support

         Ham       0.99      0.99      0.99       955
        Spam       0.97      0.94      0.95       160

    accuracy                           0.98      1115
   macro avg       0.98      0.97      0.97      1115
weighted avg       0.98      0.98      0.98      1115

📌 ¿Qué significan estas métricas?

  • Precision (Precisión): De todos los que dije que eran spam, ¿cuántos realmente lo eran?
    → Spam: 0.97 → 97% de los mensajes marcados como spam eran spam. ¡Bueno!

  • Recall (Sensibilidad): De todos los spam que existían, ¿cuántos detecté?
    → Spam: 0.94 → Detecté el 94% de los spam. ¡Muy bueno!

  • F1-Score: Promedio armónico de precisión y recall. Ideal cuando hay desbalance.


🔄 El Ciclo de Mejora: Nunca termina aquí

¡No te detengas en la primera versión!

Ahora que tienes una base, puedes:

  • Probar otro vectorizador (TfidfVectorizer).
  • Probar otro modelo (LogisticRegression, SVM).
  • Añadir más datos.
  • Mejorar la limpieza de texto (eliminar stop words, lematizar).
  • Ajustar hiperparámetros.

La ciencia de datos es iterativa. Nunca hay una "versión final". Siempre hay margen de mejora.


❌ Errores Comunes en este Paso (¡Evítalos!)

  1. Evaluar en los datos de entrenamiento → Te da una falsa sensación de éxito.
  2. No dividir train/test → No sabes si tu modelo generaliza.
  3. Usar solo accuracy en datos desbalanceados → Puede esconder errores graves.
  4. No explorar los datos antes → Te pierdes patrones, errores, oportunidades.
  5. No documentar lo que haces → Mañana no recordarás por qué hiciste algo.

✅ Checklist de esta lección — ¿Qué debes entender ahora?

☐ Los 5 pasos de un proyecto de ML y por qué cada uno es crucial.
☐ Cómo explorar un dataset antes de usarlo.
☐ Por qué dividir en train/test es obligatorio.
☐ Cómo convertir texto en números (vectorización).
☐ Cómo entrenar un modelo con fit().
☐ Cómo evaluarlo con accuracy, matriz de confusión y classification report.
☐ Que el primer modelo nunca es el último… ¡siempre se puede mejorar!


🎯 Frase para recordar:

"En ML, lo más importante no es el modelo… es el proceso."


Course Info

Course: AI-course0

Language: ES

Lesson: 2 ml workflow