El modelo perfecto que falló el lunes
Una inmobiliaria de Valencia prepara un modelo que estima el precio de un piso. En la reunión, el modelo acierta todos los pisos que ya conocían.
El lunes lo usan con pisos nuevos y falla por miles de euros.
El problema no estaba en el modelo. Estaba en cómo lo comprobaron.
Al final de esta lección
Nota
Puedo explicar por qué probamos un modelo con datos que no ha visto.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Entrenar | dejar que el modelo aprenda de ejemplos |
| Conjunto de entrenamiento | los ejemplos con los que aprende |
| Conjunto de prueba | los ejemplos guardados para medirlo |
| Mezclar | desordenar las filas antes de separar |
| Fuga de datos | una pista de la respuesta colada en las entradas |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Guarda una parte de los datos
Si mides el modelo con los mismos pisos con los que aprendió, el resultado engaña. Se los puede saber de memoria.
Por eso separas los datos en dos partes antes de empezar. Con el conjunto de entrenamiento aprende. El conjunto de prueba lo guardas y no lo toca.
Al final lo mides con la prueba. Así ves cómo le irá con pisos de verdad.
Ejemplo resuelto: 1.000 pisos al 80 %
| Paso | Cuenta | Resultado |
|---|---|---|
| Total de pisos | 1.000 | |
| Entrenamiento, 80 % | 1.000 × 80 ÷ 100 | 800 pisos |
| Prueba, el resto | 1.000 − 800 | 200 pisos |
| Comprobación | 800 + 200 | 1.000, no falta ninguno |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Separa los pisos y mide
# 10 pisos de una inmobiliaria: metros cuadrados y precio en miles de euros.
# Ya están mezclados, así que el orden no esconde nada.
flats = [[60, 180], [75, 220], [90, 260], [50, 150], [110, 330],
[70, 205], [85, 250], [95, 280], [65, 190], [80, 235]]
# 80 % para entrenar y 20 % para probar.
cut = len(flats) * 80 // 100
train = flats[:cut]
test = flats[cut:]
print("Entrenar con", len(train), "pisos")
print("Probar con", len(test), "pisos")
# El modelo: precio medio por metro cuadrado de los pisos de entrenamiento.
total_m2 = 0
total_price = 0
for flat in train:
total_m2 = total_m2 + flat[0]
total_price = total_price + flat[1]
per_m2 = total_price / total_m2
# Lo medimos con pisos que no ha visto nunca.
for flat in test:
guess = round(flat[0] * per_m2)
print(flat[0], "m2: estima", guess, "mil euros; precio real", flat[1])
Mezcla las filas antes de cortar
Imagina que los pisos vienen ordenados por barrio. Si cortas sin mezclar, la prueba solo tendrá los últimos barrios.
El modelo nunca habrá visto esos barrios, y la medida no será justa.
Por eso primero se mezclan las filas. Así las dos partes se parecen a los datos reales.
Una fuga de datos hace trampa
Una operadora de móvil quiere saber qué clientes se darán de baja. En la tabla hay una columna con el motivo de la baja.
Esa columna solo se rellena cuando el cliente ya se ha ido. El modelo la usa y acierta casi siempre, pero hace trampa.
Con un cliente de hoy esa columna está vacía, y el modelo ya no sirve. Esto se llama fuga de datos.
Un error frecuente
Advertencia
Mucha gente cree que, si el modelo acierta con los datos de entrenamiento, ya está listo. No es así: esos datos ya los ha visto. Solo el conjunto de prueba dice cómo le irá con casos nuevos. En una entrevista técnica, esto es lo primero que te preguntarán.