Una nota demasiado buena
Un equipo prueba un modelo con filas apartadas del entrenamiento. Le dicen que acierta nueve de cada diez veces. En uso acierta siete de cada diez.
El modelo no tenía nada malo. Las filas de la prueba no eran realmente nuevas. Cuando una nota parece demasiado buena, pregunta primero qué pudo haber visto ya el modelo.
Al final de esta lección
Nota
Puedo mantener limpio un conjunto de prueba y notar cuándo se le ha colado información.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Conjunto de prueba | filas apartadas que se miran una sola vez, al final del todo |
| Conjunto de validación | filas que sirven para elegir entre modelos y ajustes |
| Fuga | información de la prueba, o de la respuesta, que llega al modelo antes de la prueba |
| Duplicado | una fila que aparece más de una vez |
| Referencia | la nota de una adivinanza muy simple, para comparar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Tres conjuntos, tres trabajos
En la lección anterior apartaste un conjunto de validación. Lo miraste muchas veces, para decidir cuándo parar y qué ajustes usar.
Así que cada vez es un poco menos nuevo. Un equipo cuidadoso aparta un tercer conjunto, el conjunto de prueba. Se usa una sola vez, al final, para la nota que se comunica.
Ejemplo resuelto: un año en tres conjuntos
| Conjunto | Parte | Días | Sirve para |
|---|---|---|---|
| Conjunto de entrenamiento | 60 por ciento | 219 | Fijar los pesos |
| Conjunto de validación | 20 por ciento | 73 | Elegir un modelo y sus ajustes |
| Conjunto de prueba | 20 por ciento | 73 | La única nota honesta, al final |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcular los tres tamaños
docker exec jupyter python3 -c "print(int(365 * 0.6), int(365 * 0.2), 365 - int(365 * 0.6) - int(365 * 0.2))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La fuga: la prueba no es realmente nueva
Una fuga es cualquier modo en que el modelo ve información de la prueba antes de la prueba. La más fácil es un duplicado: la misma fila en el conjunto de entrenamiento y en el de prueba.
Un modelo que solo recuerda filas parece entonces excelente. Ejecuta el código y míralo con un modelo que no hace más que recordar.
Un modelo que solo recuerda
# Ocho días: (temperatura, lluvia) y si el día fue movido o tranquilo.
days = [
((3, 0), "tranquilo"), ((8, 0), "movido"), ((12, 2), "tranquilo"), ((15, 0), "movido"),
((18, 0), "movido"), ((9, 5), "tranquilo"), ((21, 0), "movido"), ((6, 3), "tranquilo"),
]
train = days[:6]
fresh = days[6:]
copies = days[:2] + days[6:]
def memoriser(day):
# Recuerda cada día de entrenamiento tal cual. Un día desconocido recibe "tranquilo".
for known, label in train:
if known == day:
return label
return "tranquilo"
def score(rows):
right = 0
for day, label in rows:
if memoriser(day) == label:
right = right + 1
return right / len(rows)
print("en sus propios días de entrenamiento:", score(train))
print("en dos días nuevos:", score(fresh))
print("en dos copias y dos días nuevos:", score(copies))
# ¿Qué puntuación creerías? Cambia un día nuevo y vuelve a ejecutar.
La misma prueba en una tabla real
Ahora la misma idea con los alquileres de bicicletas del laboratorio. Un modelo del vecino más cercano responde con la etiqueta del día conocido más próximo, así que se parece a un memorizador. Un día movido tiene 300 alquileres o más.
Escribe primero un pequeño script en el laboratorio. Toma una palabra: honesto, copias o respuesta.
Escribir el script en el laboratorio
docker exec jupyter sh -c "printf '%s\n' 'import sys' 'import pandas as pd' 'from sklearn.model_selection import train_test_split' 'from sklearn.neighbors import KNeighborsClassifier' '' 'hires = pd.read_csv(\"hires.csv\")' 'way = sys.argv[1]' 'if way == \"copias\":' ' hires = pd.concat([hires, hires], ignore_index=True)' 'columns = [\"temp_c\", \"rain_mm\"]' 'if way == \"respuesta\":' ' columns = columns + [\"hires\"]' 'label = hires[\"hires\"] >= 300' 'X_train, X_test, y_train, y_test = train_test_split(hires[columns], label, test_size=0.25, random_state=1)' 'model = KNeighborsClassifier(n_neighbors=1).fit(X_train, y_train)' 'print(way, \"aprendidos:\", round(model.score(X_train, y_train), 3), \"apartados:\", round(model.score(X_test, y_test), 3))' > steps/leak.py"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecutarlo con honestidad
docker exec jupyter python3 steps/leak.py honestoSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribir cada día dos veces y luego partir
docker exec jupyter python3 steps/leak.py copiasSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una columna que da la respuesta
La otra fuga frecuente es una columna que contiene la respuesta, o algo que solo se sabe después. Una marca de reembolso en una tabla que predice reembolsos lo es. También un total que se suma tras el suceso.
En el laboratorio, hires es el número con el que se hace la etiqueta. Ponlo entre las entradas y mira.
Dar al modelo la columna hires
docker exec jupyter python3 steps/leak.py respuestaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que una nota alta prueba un buen modelo. Puede probar solo que la prueba era fácil. Una nota perfecta en filas apartadas es un motivo para buscar una fuga, no para celebrar.
Ejemplo resuelto: tres fugas y cómo comprobarlas
| Qué pasó | Por qué es una fuga | Cómo comprobarlo |
|---|---|---|
| Cada día escrito dos veces, luego partido | Una fila de prueba tiene un gemelo en el entrenamiento | Contar las filas de prueba que están también en el entrenamiento |
| La columna hires predice una etiqueta hecha con hires | La entrada contiene la respuesta | Preguntar de cada columna: ¿se conoce antes de la respuesta? |
| Diez modelos probados y comunicada la mejor nota de prueba | El conjunto de prueba sirvió para elegir | Elegir con la validación y probar una vez |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Para ir más lejos: una fuga propia
Toma el hires.csv del laboratorio y un modelo tuyo. Anota la nota en los días aprendidos y en los apartados.
Añade luego una columna que creas que provoca una fuga y vuelve a ejecutar. ¿Cuánto se mueve la nota? Escribe una frase: ¿por qué esa columna no existiría el día en que de verdad necesitaras una predicción?