El equipo de Andrew Ng una vez cometió un gran error en un artículo de investigación. Y ocurrió debido a la división aleatoria de los datos. Aquí está exactamente lo que sucedió (con solución):
Es común generar conjuntos de entrenamiento y validación utilizando divisiones aleatorias. Sin embargo, en muchas situaciones, puede ser fatal para la construcción del modelo. Considera construir un modelo que genere descripciones para imágenes. Debido a la naturaleza inherente del lenguaje, cada imagen puede tener muchas descripciones diferentes. - Imagen-1 → Descripción-1, Descripción-2, Descripción-3, etc. - Imagen-2 → Descripción-1, Descripción-2, Descripción-3, etc. Mira esto 👇
Si utilizamos una división aleatoria, el mismo punto de datos (imagen) estará disponible en los conjuntos de entrenamiento y validación. Como resultado, terminamos evaluando el modelo en las instancias en las que fue entrenado. ¡Este es un ejemplo de fuga de datos (también llamada fuga de grupo), lo que resulta en sobreajuste!
Lo mismo ocurrió en el artículo de Andrew Ng, donde prepararon un conjunto de datos médicos para detectar neumonía. - Total de imágenes = 112k - Total de pacientes = 30k Debido a la división aleatoria, las imágenes del mismo paciente estaban disponibles tanto en los conjuntos de entrenamiento como en los de validación. Esto llevó a una fuga de datos, y las puntuaciones de validación parecían mucho mejores de lo que deberían haber sido. Este es su artículo inicial👇
El problema de la división de grupos se resolvió. Hay dos pasos: 1) Agrupar todas las instancias de entrenamiento correspondientes a una imagen. 2) Después de agrupar, TODO EL GRUPO (todos los ejemplos de una imagen) debe ser asignado aleatoriamente al conjunto de entrenamiento o al conjunto de validación. Esto evitará la fuga de grupos.
Si usas Sklearn, el GroupShuffleSplit implementa esta idea. Como ejemplo, considera que tenemos el siguiente conjunto de datos: - x1 y x2 son las características. - y es la variable objetivo. - group denota los criterios de agrupamiento. Revisa esto 👇
Primero, importamos el GroupShuffleSplit de sklearn e instanciamos el objeto. A continuación, el método split() de este objeto nos permite realizar la división por grupos. Devuelve un generador, y podemos descomprimirlo para obtener la siguiente salida: - Los puntos de datos en los grupos “A” y “C” están juntos en el conjunto de entrenamiento. - Los puntos de datos en el grupo “B” están juntos en el conjunto de validación/prueba. Revisa esto 👇
Unos días después, el equipo de Andrew Ng actualizó el documento tras utilizar la misma estrategia de división por barajado de grupos para asegurar que los mismos pacientes no terminaran en ambos conjuntos de entrenamiento y validación. 👉 Te toca a ti: ¿Has enfrentado este problema antes?
18,51K