El equipo de Andrew Ng cometió una gran error en un trabajo de investigación. Y ocurrió porque los datos se dividieron aleatoriamente. Esto es exactamente lo que pasó (con solución):
Es común generar conjuntos de tren y validación mediante descomposición aleatoria. Sin embargo, en muchas situaciones puede ser fatal para la construcción de maquetas. Considera construir un modelo que genere pies de foto para las imágenes. Debido a la naturaleza inherente del lenguaje, cada imagen puede tener muchos pies de foto diferentes. - Imagen-1 → Leyenda-1, Leyenda-2, Leyenda-3, etc. - Imagen-2 → Leyenda-1, Leyenda-2, Leyenda-3, etc. Mira esto 👇
Si usamos 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 se entrenó. Este es un ejemplo de fuga de datos (también llamada fuga de grupo), ¡lo que resulta en un sobreajuste!
Lo mismo ocurrió en el artículo de Andrew Ng, donde prepararon un conjunto de datos médico para detectar neumonía. - Imágenes totales = 112k - Total de pacientes = 30k Debido a la división aleatoria, las imágenes del mismo paciente estaban disponibles tanto en el conjunto de entrenamiento como en el de validación. Esto provocó fugas de datos, y las puntuaciones de validación parecieron mucho mejores de lo que deberían. Este es su artículo👇 inicial
La división de barajado en grupo solucionó esto. Hay dos pasos: 1) Agrupar todas las instancias de entrenamiento correspondientes a una imagen. 2) Tras agrupar, el GRUPO COMPLETO (todos los ejemplos de una misma imagen) debe asignarse aleatoriamente al tren o al conjunto de validación. Esto evitará la fuga del grupo.
Si usas Sklearn, GroupShuffleSplit implementa esta idea. Como ejemplo, consideremos que tenemos el siguiente conjunto de datos: - x1 y x2 son las características. - y es la variable objetivo. - grupo denota los criterios de agrupación. Mira 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 de grupos. Devuelve un generador, y podemos desempaquetarlo 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 del grupo "B" están juntos en el conjunto de validación/prueba. Mira esto 👇
Unos días después, el equipo de Andrew Ng actualizó el artículo tras usar la misma estrategia de división de baraja de grupos para asegurarse de que los mismos pacientes no acabaran tanto en el conjunto de entrenamiento como en el de validación. 👉 Te toca a ti: ¿Te has enfrentado a este problema antes?
11.83K