¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Mantener honesta la prueba

Después de esta lección: Puedo mantener limpio un conjunto de prueba y notar cuándo se le ha colado información.

Lección de 60 min5 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

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

PalabraQué significa
Conjunto de pruebafilas apartadas que se miran una sola vez, al final del todo
Conjunto de validaciónfilas que sirven para elegir entre modelos y ajustes
Fugainformación de la prueba, o de la respuesta, que llega al modelo antes de la prueba
Duplicadouna fila que aparece más de una vez
Referenciala 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

ConjuntoParteDíasSirve para
Conjunto de entrenamiento60 por ciento219Fijar los pesos
Conjunto de validación20 por ciento73Elegir un modelo y sus ajustes
Conjunto de prueba20 por ciento73La única nota honesta, al final

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Calcular los tres tamaños

Comando
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

Código: python
# 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

Comando
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

Comando
docker exec jupyter python3 steps/leak.py honesto

Se 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

Comando
docker exec jupyter python3 steps/leak.py copias

Se 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

Comando
docker exec jupyter python3 steps/leak.py respuesta

Se 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 fugaCómo comprobarlo
Cada día escrito dos veces, luego partidoUna fila de prueba tiene un gemelo en el entrenamientoContar las filas de prueba que están también en el entrenamiento
La columna hires predice una etiqueta hecha con hiresLa entrada contiene la respuestaPreguntar de cada columna: ¿se conoce antes de la respuesta?
Diez modelos probados y comunicada la mejor nota de pruebaEl conjunto de prueba sirvió para elegirElegir 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?

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.