Finalmente, hemos arribado al último tramo antes de iniciar la primeras exploraciones enfocadas en modelos de machine learning; en esta ocasión, la travesía será fugaz, pero no por ello menos importante, ya que trata sobre un paso intermedio entre el preprocesamiento y procesamiento de datos, y que es prácticamente indefectible antes de comenzar con el entrenamiento de todo modelo de aprendizaje de máquinas.
Equipaje recomendado
Nociones sobre conjuntos de datos
Nociones sobre preprocesamiento de datos
Fundamentos de machine learning
Tentempié
¿Qué son los conjuntos de datos de entrenamiento, desarrollo y prueba?
Después de preprocesar un conjunto de datos, este ya está listo para ser computado por un algoritmo de machine learning; sin embargo, es necesario gestionar un aspecto de su estructura una última vez mediante un sencillo pero imprescindible paso: la división de este en subconjuntos, conocidos como conjuntos de entrenamiento, desarrollo, y prueba.
Estos conjuntos tienen diferentes objetivos a lo largo de la etapa de entrenamiento de un modelo de aprendizaje automático, y es menester entender el cómo y por qué de estas divisiones antes de comenzar a utilizar algoritmos de este tipo.
Revisaremos a detalle cada uno, su definición y la proporción que generalmente tienen respecto a todos los datos disponibles.
Conjunto de datos de entrenamiento (test set)
El conjunto de datos de entrenamiento (test set) es el subconjunto de datos que se procesa para la extracción de patrones, y con ello ajustar automáticamente los parámetros que constituyen al modelo resultante.
Es decir, es la porción de datos que se entrega de forma inicial a la máquina para que aprenda de estos.
Para ilustrar esto, recordaremos el ejemplo visto en nuestra primera exploración, en el que se entrena a un modelo para el reconocimiento de gatos en imágenes; en este caso, el conjunto de datos comprende la cantidad total de imágenes de animales que damos a la computadora para que aprenda a diferenciarlos.
Este ejemplo se había simplificado en la introducción al aprendizaje de máquinas de la siguiente forma:
Ahora que tenemos mayor conocimiento sobre los conjuntos de datos etiquetados, podemos desarrollar un poco más esta ejemplificación mostrando parte de la estructura y etapas subyacentes de un algoritmo de machine learning, cuya primera fase describiremos como el aprendizaje de la máquina a partir del conjunto de datos de entrenamiento, el cual está compuesto de una porción de todo el conjunto de datos:
El conjunto de datos de entrenamiento es la parte de todas nuestras imágenes que daremos a la máquina para este aprendizaje inicial. Es importante destacar que nunca le proporcionaremos el 100% de los datos, (al menos no en lo que respecta a los algoritmos de aprendizaje supervisado, los cuales estudiaremos primero en este curso), las razones se abordarán más adelante.
Tamaño del conjunto de datos de entrenamiento
La porción de datos que se debe elegir para el entrenamiento del modelo no será siempre la misma, ya que varía de acuerdo al tamaño del conjunto de datos, entre otros factores. Sin embargo, se suele recomendar que al menos el 70% de los datos estén dentro de este subconjunto, ya que se requieren suficientes ejemplos de entrenamiento para un ajuste óptimo del modelo (el tamaño definido puede variar significativamente conforme al número de ejemplos de entrenamiento disponibles).
Conjunto de datos de desarrollo (dev set)
Una vez que hemos seleccionado los datos a utilizar para generar el aprendizaje del modelo, ¿para qué necesitamos hacer otras divisiones del conjunto de datos?
La respuesta a esta cuestión se encuentra en la etapa posterior a la antes descrita, la cual es sumamente importante y característica del aprendizaje automático, ya que consiste en evaluar qué tan bien la máquina ha aprendido, es decir, qué tan bien se ha ajustado el modelo a los datos mediante la determinación de sus parámetros. Para estos fines, se distribuyen típicamente los datos en uno o dos subconjuntos más: el de desarrollo, y el de pruebas.
Hablemos sobre el primero.
El conjunto de datos de desarrollo o de validación (dev set), es el subconjunto que se utiliza para determinar el rendimiento del modelo operando sobre datos nuevos (que no pertenecen al conjunto de entrenamiento), y el cual se utiliza para ajustar sus hiperparámetros, lo cual significa configurar algoritmo utilizado hasta obtener resultados satisfactorios.
Los hiperparámetros son parámetros que definen algunos aspectos sobre las operaciones y estructura de un algoritmo de aprendizaje de máquinas, y que no se ajustan automáticamente porque se definen antes de la etapa de entrenamiento; por lo pronto no ahondaremos mucho en ello, pero será objeto de estudio en próximas expediciones.
El punto clave aquí es que el conjunto de datos de validación se entrega al modelo para evaluar su desempeño y con ello configurar el algoritmo utilizado para determinar qué configuración le favorece más. Esto sucede probando el modelo y cuantificando sus aciertos y errores. En nuestro ejemplo, la evaluación se realizaría utilizando el modelo para etiquetar como gatos o no gatos a nuevas imágenes que no provengan del conjunto de entrenamiento (por eso se genera otro subconjunto aparte).
Una vez evaluado el desempeño del modelo entrenado, se procede a realizar cambios en la arquitectura del modelo con el fin de dilucidar cuáles valores de su configuración proveen las salidas con la precisión más alta, como se muestra en la Figura 2.8.3.
El uso de un conjunto de datos de desarrollo es imprescindible su se desea experimentar con la configuración del algoritmo o algoritmos utilizados para el entrenamiento. Sin embargo, su uso no siempre está presente a la hora de ajustar modelos de machine learning. Todo dependerá de la complejidad de los datos, y de tus resultados preliminares. Habrá ocasiones en que solo necesites de un conjunto de entrenamiento y prueba, esto lo veremos más adelante.
Tamaño del conjunto de datos de desarrollo
Lo recomendable en cuanto al tamaño para este subconjunto es que abarque alrededor del 10% del conjunto original, pero esto dependerá del número total de ejemplos de entrenamiento. Por ejemplo, para un conjunto de datos de 1000 ejemplos de entrenamiento (en el ejemplo, 1000 imágenes), el 10% es 100, y parece suficiente para la etapa de desarrollo; pero si se tratara de un conjunto más grande, por ejemplo, de 1 millón de datos, el 10% serían 100 mil ejemplos de entrenamiento, por lo que incluso podría elegirse solo el 1% (10 mil) o menos para el tamaño del conjunto de validación.
Es importante tomar en cuenta esto último, ya que resalta la influencia de las dimensiones del conjunto de datos para la definición de las porciones de los subconjuntos de entrenamiento, desarrollo y prueba.
Conjunto de datos de prueba (test set)
Para finalizar, el conjunto de datos de prueba (test set) es el subconjunto de datos que pretende simular el uso del modelo de machine learning en producción, es decir, en situaciones fuera del entorno de desarrollo, o lo que podemos llamar como la evaluación de su rendimiento en las condiciones más cercanas al «mundo real».
Estos datos son nuevos para el modelo, no se hallan contenidos en el conjunto de entrenamiento o de validación, por lo que se utilizan para evaluar su desempeño final después de la elección de hiperparámetros, si es que llevaste a cabo una etapa de ajuste de estos.
La intención de este conjunto es responder a la cuestión: ¿qué tan preciso es el modelo en la ejecución sus tareas? Si los resultados son satisfactorios, entonces se puede generalizar que el modelo funcionará con el mismo rendimiento en datos nuevos ya no pertenecientes al conjunto de datos.
Respecto a nuestro ejemplo, esto se traduce en que, después de entrenar al modelo y seleccionar los hiperparámetros más convenientes, se evaluará una última vez con otro cúmulo de imágenes nuevas:
Cuando se han finalizado los ajustes del algoritmo de machine learning, se evalúa de nuevo el modelo, pero ahora con un conjunto de datos completamente nuevo (conjunto de prueba). Este definirá que tan bien hace su trabajo el modelo obtenido. Si el rendimiento final no es el esperado, se vuelve a repetir el proceso realizando ajustes en el algoritmo u otros componentes asociados, como los datos o métricas de rendimiento, hasta alcanzar resultados satisfactorios.
Tamaño del conjunto de datos de prueba
Las dimensiones de este conjunto son similares a las del conjunto de datos de desarrollo: se recomienda un aproximado del 10% del total de los datos, ya que se requiere una cantidad no muy pequeña de ejemplos para poner a prueba el modelo. Como se explicó anteriormente, esto depende mucho del tamaño del conjunto de datos, por lo que porcentajes más chicos pueden ser igualmente funcionales.
Una distribución común de división del conjunto de datos es la proporción 80%-10%-10% para cada subconjunto respectivamente (train, dev, test), principalmente cuando se trata de conjuntos relativamente pequeños o medianos.
Notas:
- Los conjuntos de datos en los códigos de machine learning que te encuentres en la red generalmente no se dividirán en los tres subconjuntos antes descritos, ya que el uso de un conjunto de desarrollo/validación está más enfocado en la experimentación en fases de la definición de la configuración del algoritmo, por lo que se suelen utilizar solo los conjuntos de entrenamiento y prueba. Sin embargo, en proyectos industriales o de investigación científica, se recomienda considerar el conjunto de validación para realizar pruebas de las arquitecturas de los modelos implicados.
- Antes de hacer estas divisiones, es recomendable realizar un barajeo aleatorio de los ejemplos de entrenamiento. Esto se puede lograr fácilmente con funciones como shuffle de Sklearn en Python.
- Si no has cachado todo lo visto en esta lección, no te preocupes, en un futuro muy próximo estaremos haciendo estas divisiones en prácticas de programación (y en la teoría), lo cual te ayudará a comprender su uso.
¡Hemos terminado!
Has finalizado tu entrenamiento en datos, lo que significa que en nuestra próxima exploración arrancaremos en terrenos más inmersos en el dominio del aprendizaje de máquinas, donde te adentrarás en el conocimiento de los algoritmos de aprendizaje supervisado, y podrás experimentar uno de estos por primera vez en Python.