De clases a valores continuos
Un problema de regresión busca predecir un número. Puede ser el precio de una vivienda, la demanda esperada de un producto, el consumo eléctrico de una oficina o el tiempo estimado de resolución de una incidencia.
La estructura general es muy parecida a la clasificación: X contiene variables predictoras e y contiene la respuesta. La diferencia está en que y ya no representa una clase discreta, sino un valor continuo.
import pandas as pd
df = pd.DataFrame({
"superficie_m2": [45, 60, 75, 90, 110, 130, 150, 170],
"habitaciones": [1, 2, 2, 3, 3, 4, 4, 5],
"antiguedad": [30, 20, 18, 12, 10, 8, 5, 3],
"precio_miles": [155, 198, 240, 290, 335, 390, 455, 510],
})
X = df[["superficie_m2", "habitaciones", "antiguedad"]]
y = df["precio_miles"]
En regresión, cada predicción se interpreta en la unidad de la variable objetivo. Si
yestá en miles de euros, la predicción también lo estará.
El dataset de ejemplo es deliberadamente pequeño para que el flujo sea legible. En un caso real habría más observaciones, más validación y más control sobre la calidad de los datos.
Entrenar una regresión lineal
La regresión lineal aprende una relación aproximada entre las variables predictoras y el valor objetivo. No es el modelo adecuado para todos los problemas, pero sí es una buena primera referencia por su sencillez.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.25,
random_state=42,
)
modelo = LinearRegression()
modelo.fit(X_train, y_train)
La llamada a fit() calcula los coeficientes que mejor ajustan la relación lineal según los datos de entrenamiento. Después, predict() estima valores numéricos para filas no usadas al entrenar.
y_pred = modelo.predict(X_test)
print(y_pred)
Para inspeccionar el resultado de forma clara, se puede construir una tabla con valores reales y estimados:
comparacion = pd.DataFrame({
"real": y_test.to_numpy(),
"prediccion": y_pred,
})
comparacion["error_absoluto"] = (comparacion["real"] - comparacion["prediccion"]).abs()
print(comparacion)
Medir el error
En regresión no tiene sentido hablar de accuracy, porque rara vez una predicción numérica coincide exactamente con el valor real. En su lugar se mide el tamaño del error.
Una métrica sencilla es el MAE o error absoluto medio. Indica, en promedio, cuántas unidades se equivoca el modelo.
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_test, y_pred)
print(f"MAE: {mae:.2f} miles de euros")
Si el MAE es 12.50, significa que el modelo se equivoca de media en unas 12,5 unidades de la variable objetivo. En este ejemplo, eso equivale a 12.500 euros porque precio_miles está expresado en miles.
flowchart TB
classification["Clasificación"] --> classMetric["Métrica: acierto por clase"]
regression["Regresión"] --> errorMetric["Métrica: tamaño del error"]
classMetric --> decision["Evaluar si el modelo sirve"]
errorMetric --> decision
La pregunta clave en regresión no es si el modelo "acierta" exactamente, sino si el error es aceptable para el uso que se quiere dar a la predicción.
Predecir un caso nuevo
Una vez entrenado, el modelo puede estimar el valor de una muestra nueva con las mismas columnas que X.
nueva_vivienda = pd.DataFrame({
"superficie_m2": [120],
"habitaciones": [3],
"antiguedad": [9],
})
precio_estimado = modelo.predict(nueva_vivienda)
print(f"Precio estimado: {precio_estimado[0]:.1f} miles de euros")
La muestra nueva debe respetar la misma estructura que los datos de entrenamiento: mismos nombres de columnas, mismo orden semántico y valores expresados en las mismas unidades.
Este detalle parece pequeño, pero es una de las bases del aprendizaje automático aplicado: el modelo solo puede interpretar correctamente datos nuevos si llegan con el mismo significado que los datos usados durante el entrenamiento.
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Scikit Learn es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de Scikit Learn
Explora más contenido relacionado con Scikit Learn y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
Comprender la diferencia práctica entre clasificación y regresión, entrenar un modelo LinearRegression y evaluar predicciones numéricas con MAE.