"No empieces a cocinar sin una receta. No construyas un modelo sin un plan."
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!
Imagina que eres un pirata buscando un tesoro enterrado. No puedes salir corriendo a cavar en cualquier lugar. Necesitas:
¡Eso es exactamente lo que haremos en ML!
Vamos a desglosar cada paso con detalle, con ejemplos reales, errores comunes y consejos de expertos.
"Un problema bien definido está medio resuelto."
Antes de tocar código, antes de buscar datos… detente y piensa.
¿Qué quiero predecir?
¿Quién usará esta predicción?
¿Por qué es importante resolver esto?
"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.
"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.
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'])
Nunca asumas que los datos están limpios. Siempre explóralos primero.
Hazte estas preguntas:
print(data.shape) # (5572, 2) → 5572 mensajes, 2 columnas
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...
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).
print(data.isnull().sum())
→ En este caso, no. Pero en la vida real, ¡casi siempre hay!
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!
"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.
# 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
# Convertir 'ham'/'spam' a 0/1
data['label'] = data['label'].map({'ham': 0, 'spam': 1})
¡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")
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?
X_train.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.
"Aquí es donde la computadora aprende… pero tú le das las herramientas."
Ahora sí, ¡llegó la hora de entrenar!
Para clasificación de texto, un buen punto de partida es Naive Bayes Multinomial.
¿Por qué?
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(X_train_vec, y_train) # ¡Entrena el modelo!
📌 ¿Qué hace fit()?
¡Eso es todo! Tu modelo ya "sabe" distinguir spam de ham.
"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.
y_pred = model.predict(X_test_vec)
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?
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?
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.
¡No te detengas en la primera versión!
Ahora que tienes una base, puedes:
TfidfVectorizer).LogisticRegression, SVM).La ciencia de datos es iterativa. Nunca hay una "versión final". Siempre hay margen de mejora.
☐ 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!
"En ML, lo más importante no es el modelo… es el proceso."
Course: AI-course0
Language: ES
Lesson: 2 ml workflow