Tienes una tabla de pisos y un modelo (una fórmula que aprende de ejemplos) que quiere sacar algo de ella. Antes de escribir una línea de código te toca decidir qué le preguntas, y esa decisión cambia el modelo, la salida y la forma de medir si funciona. Si la respuesta que buscas es un número (¿cuánto?), es un problema de regresión. Si es una categoría (¿sí o no?, ¿de cuál de estas?), es un problema de clasificación. Las dos pertenecen al aprendizaje supervisado (*supervised learning*): el modelo aprende de ejemplos en los que ya conocemos la respuesta correcta.
## Los pisos de partida
Imagina una ciudad inventada para este ejemplo, con diez pisos que ya se han vendido. De cada uno tienes cuatro datos: los metros, la distancia al centro, el precio al que se vendió y si se vendió en menos de 30 días. Los números de este post son ficticios.
Los datos con los que el modelo hace su cuenta (metros y distancia) son las variables de entrada (*features*). Lo que quieres predecir es la variable objetivo (*target*, o label, «etiqueta»). Es el vocabulario estándar de scikit-learn, la librería que usaremos. El truco de este post: la tabla es la misma y solo cambia cuál de sus columnas escoges como objetivo.
| Columna | Qué cuenta | Papel |
|---|---|---|
| metros | Superficie del piso | Entrada |
| km_centro | Distancia al centro | Entrada |
| precio | Euros de la venta | Objetivo en regresión |
| rapido | 1 si se vendió en menos de 30 días, 0 si no | Objetivo en clasificación |
## Regresión: ¿cuánto vale este piso?
Aquí la variable objetivo es el precio, que puede valer 215.000, 265.000, 370.000 o cualquier otro número. El modelo más sencillo es la regresión lineal: traza la línea que mejor se ajusta a los pisos que ya conoce y, para un piso nuevo, lee en esa línea el precio que le corresponde. Piénsalo como estirar una regla entre los puntos hasta que quede lo más cerca posible de todos. El dibujo de abajo simplifica: usa una sola entrada (los metros), mientras que el código usa dos.
Como la salida es un número, el fallo también se mide en número: cuánto te separas del precio real. La métrica más fácil de leer es el error medio absoluto (*MAE*, por sus siglas en inglés): la media de esas rayas rojas, sin importar si el modelo se pasó o se quedó corto. Sale en euros, así que se explica sin dibujos. En el código de más abajo sale 16.062 €: de media, el modelo se equivoca en esa cantidad.
## Clasificación: ¿se venderá en menos de 30 días?
Ahora la variable objetivo es `rapido`: 1 si se vendió en menos de 30 días y 0 si no. No hay término medio. El modelo no dibuja una línea de precios, sino que reparte los pisos en dos cajas. Cuando solo hay dos cajas, se llama clasificación binaria. Si fueran tres o más (piso, ático o chalet), sería clasificación con varias clases.
Evaluar es contar: de todos los pisos que ha clasificado, cuántos ha metido en la caja correcta. Esa proporción es la exactitud (*accuracy*). Si acierta 3 de 3, la exactitud es 1,0 (el 100 %); si acertara 2 de 3, sería 0,67. Aquí no hay «más o menos cerca»: el piso está en su caja o no lo está. Para esto, el post «Tu primer modelo de machine learning en 30 líneas de Python» usa un caso distinto (clientes que cancelan) y llega más lejos con las métricas.
## El mismo código, dos modelos
Para ejecutarlo no instales nada: copia el código en un cuaderno de Google Colab (gratis, desde el navegador) y pulsa ejecutar. Con scikit-learn (`sklearn`), la librería de aprendizaje automático de Python, el esqueleto es idéntico en los dos casos: se crea el modelo, se entrena con `fit` y se pregunta con `predict`. Lo único que cambia es el modelo y la columna objetivo. Antes del código, las piezas que no has visto:
- `import`: trae al programa herramientas que ya existen. `pandas` crea y maneja tablas; `sklearn`, los modelos y las métricas.
- `DataFrame`: la tabla de pandas, con una columna por cada lista que le pasas.
- `X[:7]` y `X[7:]`: cortes de la tabla. Los siete primeros pisos y los pisos desde el octavo, es decir, los tres últimos.
- Entrenar (`fit`): enseñar al modelo con ejemplos cuya respuesta ya conoce. Los siete primeros pisos son el conjunto de entrenamiento.
- Conjunto de prueba: los tres últimos pisos, que el modelo no ha visto. Sirven de examen.
- `LinearRegression` ajusta una línea para predecir un número. `LogisticRegression`, pese al nombre, clasifica: calcula una probabilidad y, según ella, responde 0 o 1. `max_iter=1000` solo le da más intentos para ajustarse.
- `predict_proba`: la probabilidad de cada clase, un número entre 0 y 1. La columna `[:, 1]` es la de «sí».
1import pandas as pd2from sklearn.linear_model import LinearRegression, LogisticRegression3from sklearn.metrics import mean_absolute_error, accuracy_score45# Los diez pisos vendidos (datos ficticios), en una tabla6pisos = pd.DataFrame({7 "metros": [50, 60, 70, 80, 90, 100, 110, 120, 65, 85],8 "km_centro": [1, 3, 2, 4, 1.5, 5, 3, 6, 0.5, 7],9 "precio": [210000, 205000, 280000, 270000, 370000, 330000, 390000, 360000, 265000, 215000],10 "rapido": [1, 1, 1, 0, 1, 0, 0, 0, 1, 0],11})1213# Entradas: las dos columnas con las que el modelo hace su cuenta14X = pisos[["metros", "km_centro"]]15X_train, X_test = X[:7], X[7:] # 7 pisos para entrenar, 3 para el examen1617# Regresión: el objetivo es un número18reg = LinearRegression().fit(X_train, pisos["precio"][:7])19precios = reg.predict(X_test)20print("Precio previsto:", precios.round(0))21print("Precio real :", pisos["precio"][7:].tolist())22print("Error medio absoluto (MAE):", round(mean_absolute_error(pisos["precio"][7:], precios)), "€")2324# Clasificación: el objetivo es una categoría (1 = sí, 0 = no)25clf = LogisticRegression(max_iter=1000).fit(X_train, pisos["rapido"][:7])26respuestas = clf.predict(X_test)27print("Previsto:", respuestas)28print("Real :", pisos["rapido"][7:].tolist())29print("Exactitud (accuracy):", accuracy_score(pisos["rapido"][7:], respuestas))30print("Prob. de venderse rápido:", clf.predict_proba(X_test)[:, 1].round(2))
Salida: «Precio previsto: [380200. 283823. 224162.]», «Precio real : [360000, 265000, 215000]», «Error medio absoluto (MAE): 16062 €», «Previsto: [0 1 0]», «Real : [0, 1, 0]», «Exactitud (accuracy): 1.0» y «Prob. de venderse rápido: [0. 0.99 0.02]».
Fíjate en las dos salidas. La regresión devuelve un precio para cada piso, con su error medio absoluto de 16.062 €. La clasificación devuelve un 0 o un 1 y, con `predict_proba`, también la probabilidad de que sea 1: un 0,99 es «casi seguro que se vende rápido» y un 0,02, «casi seguro que no».
Tres pisos de prueba son demasiado pocos para fiarse de una exactitud de 1,0: está para que veas cómo funciona la cuenta. En un problema real, el conjunto de prueba tiene cientos o miles de filas, y los datos se mezclan al azar antes de partirlos (aquí no, para que te salga lo mismo que a mí).
## Lo que cambia, lado a lado
| Aspecto | Regresión | Clasificación |
|---|---|---|
| Pregunta | ¿Cuánto? | ¿Cuál? ¿Sí o no? |
| Salida | Un número | Una categoría |
| Objetivo aquí | precio | rapido |
| Modelo de ejemplo | LinearRegression | LogisticRegression |
| Se evalúa con | Error medio absoluto (MAE) | Exactitud (accuracy) |
| Resultado aquí | MAE de 16.062 € | Exactitud de 1,0 |
Para saber ante cuál de los dos estás, mira la variable objetivo y pregúntate si tiene sentido que la respuesta sea 2,5 o 250.000,5. Un precio admite cualquier cantidad intermedia: regresión. Una etiqueta como «sí» o «no» no tiene punto intermedio: clasificación.
## Cómo elijo yo
Empieza por la decisión que alguien va a tomar con la predicción, no por el algoritmo. Imagina una inmobiliaria, la empresa que vende pisos. Si quiere fijar un precio de salida, necesita un número: regresión. Si quiere decidir qué pisos anunciar primero, le basta saber cuáles se venderán rápido: clasificación. Un error típico es convertir un número en sí/no «para simplificar», porque al hacerlo tiras información: un piso que se vende en 31 días queda en el mismo saco que uno que tarda un año.
En resumen: regresión predice un número y se mide con el error medio absoluto, clasificación predice una categoría y se mide con la exactitud. Con los mismos pisos puedes hacer las dos, y lo que decide cuál usar es la pregunta del negocio. Mi consejo: coge cualquier tabla con una columna numérica y otra de sí/no, y antes de entrenar nada escribe a mano qué columna es el objetivo y de qué tipo es. Esto lo practicamos en profundidad en la plataforma, en la lección «Clasificar o predecir un número: las dos formas del supervisado».