¿Qué significa que una máquina "aprende"?
Valeria tiene una libreta con tres años de ventas de su café. Su primo Bruno le dice: "Fácil, le pasamos la libreta a una IA y listo". Pixel, el robot sarcástico, levanta una ceja metálica: "Claro, y yo soy el rey de los tostadores".
Aprender, en machine learning, significa encontrar patrones en datos pasados para hacer predicciones sobre datos nuevos. No programas las reglas a mano: el algoritmo las descubre mirando ejemplos.
Los ingredientes
- Características (
X): lo que sabemos de cada caso. Por ejemplo, temperatura, día de la semana, si llueve. - Etiqueta u objetivo (
y): lo que queremos predecir. Por ejemplo, cuántos cafés se venden. - Modelo: la "máquina" que relaciona
Xcony.
Por convención, X va en mayúscula (es una tabla) y y en minúscula (es una columna).
| Tipo de problema | ¿Qué predice? | Ejemplo |
|---|---|---|
| Regresión | Un número | Cafés vendidos mañana |
| Clasificación | Una categoría | ¿Esta reseña es buena o mala? |
| Clustering | Grupos sin etiquetas | Tipos de clientes |
El peligro: memorizar no es aprender
Imagina un estudiante que se aprende de memoria las respuestas del examen de práctica. En el examen real, con preguntas nuevas, se hunde. Eso se llama sobreajuste (overfitting).
Para detectarlo hacemos algo muy simple: escondemos una parte de los datos. Entrenamos con la mayoría (train) y examinamos con la parte escondida (test), que el modelo nunca vio.
train_test_split
import numpy as np
from sklearn.model_selection import train_test_split
X = np.arange(20).reshape(10, 2) # 10 filas, 2 columnas
y = np.arange(10)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
print(X_train.shape, X_test.shape) # (8, 2) (2, 2)
Detalles importantes:
test_size=0.2reserva el 20 % para el examen.random_state=0fija el azar: siempre sale la misma mezcla. Sin esto, tus resultados cambian en cada ejecución.- Devuelve cuatro cosas, siempre en este orden:
X_train, X_test, y_train, y_test.
Estratificar: que nadie quede fuera
Si el 20 % de tus clientes son "frecuentes" y el azar manda todos al train, el test no los verá. Con stratify=y se conserva la proporción de cada clase.
y = np.array([0] * 80 + [1] * 20)
X = np.arange(100).reshape(100, 1)
_, _, _, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=0)
print(y_test.mean()) # 0.2
Errores típicos
- Evaluar con los mismos datos con que entrenaste. Es como corregir tu propio examen con las respuestas delante: sale 10 siempre.
- Olvidar
random_statey no poder reproducir resultados. - Cambiar el orden de las variables al desempaquetar (
X_train, y_train, ...) y mezclar todo. - Hacer el split demasiado tarde, después de preparar los datos con información del test (se llama fuga de datos).
💡 Truco: una división habitual es 80 % train y 20 % test, o 70/30 si tienes pocos datos.
Historia: la libreta tramposa
Bruno entrenó un modelo con toda la libreta y presumió: "¡100 % de acierto!". Pixel preguntó: "¿Con qué datos lo probaste?". Bruno: "Con los mismos". Pixel apagó un LED con dignidad: "Has hecho un loro, no un predictor". Valeria sonrió, separó el 20 % de la libreta y por fin supieron qué tan bueno era su modelo de verdad.
Reto
Carga el dataset de flores load_iris, divídelo 70/30 y comprueba cuántas flores quedan en cada parte. ¡Debería sumar 150!