Cómo elegir y evaluar algoritmos de machine learning

Si ya estás familiarizado con los elementos básicos de machine learning, el siguiente paso es aprender a eligir y evaluar los distintos algoritmos que tenemos disponibles. Algunas de las preguntas más comunes al momento de usar algoritmos de aprendizaje computacional (machine learning) son:

  1. ¿Cómo elegir el mejor algoritmo y los mejores atributos (features) a utilizar?
  2. ¿Cómo evaluar el desempeño de dicho algoritmo?
  3. ¿Cómo entrenar al predictor que usaremos “en producción”?, es decir, con el cuál haremos predicciones reales.

Cada una de estas preguntas requiere un procedmiento diferente. Además, los detalles de cada procedimiento dependen, en gran medida, de la cantidad de datos etiquetados que tengamos a nuestro alcance.


Escenario 1: Acceso a una gran cantidad de datos

Cuando los datos disponibles para entrenar nuestro algoritmo son abundantes, el proceso para responder las tres preguntas iniciales es relativamente sencillo: Simplemente hay que separar los datos en un máximo de 3 sub-conjuntos: entrenamiento, validación, y prueba . La cantidad de sub-conjuntos, y el procentaje de datos en cada sub-conjunto depende de la pregunta que queramos responder. Lo que es muy importante es que los sub-conjuntos no tengan elementos en común.

Este último punto es crítico, y se debe tener cuidado de ejecutarlo correctamente. Por ejemplo, si estamos trabajando con imágenes médicas, tenemos acceso a datos de 10,000 pacientes, y cada paciente tiene entre 1 y 4 imágenes, la división de los datos se debe hacer a nivel de paciente. Es decir, cada paciente se asigna a uno de los sub-conjuntos, y todas las imágenes de ese paciente deben estar en el mismo sub-conjunto.

1.1 Eligiendo el mejor algoritmo y los mejores atributos

Figura 1

Este proceso es relativamente sencillo. Empezamos diviendo el total de nuestros datos en dos conjuntos: (1) entrenamiento y (2) validación, tal como se muestra en la Figura 1. Después, creamos una tabla donde cada fila contiene el desempeño obtenido usando la configuración de cada experimento. Por ejemplo, supongamos que queremos elegir entre las siguientes opciones:

  • E1 : Regresión lineal, sin regularización
  • E2: Regresión linear, Regularización L2 (lambda = 0.1)
  • E3: Regresión lineal, Regularización L2 (lambda = 0.5)
  • E4: Regresión lineal, Regularización L1 (lambda = 0.1)
  • E5: Regresión lineal, Regularización L1 (lambda = 0.5)

Lo que hacemos es entrenar los algoritmos, usando nuestro conjunto de entrenamiento, con la configuración descrita en cada uno de los experimentos (E1, …, E5). Después, evaluamos el desempeño de cada uno de los predictores generados por cada experimento, y seleccionamos el algoritmo con el mejor desempeño. Por ejemplo, si nuestra métrica para medir el desempeño es RMSE (Root Mean Squared Error), nuestra tabla pudiera verse de la siguiente manera:

E1E2E3E4E5
RMSE12.2411.4315.389.2510.12

En este caso, la mejor configuración es utilizar E4: regresión lineal con regularización L1 (lambda = 0.1). Esto resuelve nuestra primer pregunta: ¿Cuál es el mejor algoritmo y atributos a elegir? Un punto importante es que la configuración de los experimentos puede ser tan amplia y compleja como uno desee. Es decir, es posible incorporar técnicas de pre-procesamiento de los datos, algoritmos de selección de atributos, etc. como parte de la configuración de un experimento.

1.2 Creando nuestro predictor para producción

Figura 2

Una vez que seleccionamos la mejor configuración para nuestro predictor, simplemente volvemos a entrenar dicho predictor. A diferencia del paso anterior, esta vez utilizaremos todos los datos que tenemos disponibles. Es decir, no hay necesidad de dividir nuestros datos en sub-conjuntos de entrenamiento, validación o prueba.

Una pregunta común es si usar todos los datos no genera el riesgo de overfitting; sin embargo, en el paso #1 comprobamos que el uso de la configuración que vamos a usar es la que tiene el mejor desempeño. Por lo tanto, queremos dar a esta configuración la mayor cantidad de datos posibles, es decir, todos.

1.3 Estimando el desempeño de nuestro predictor

Figura 3

Hasta el momento hemos determinado cuál es la mejor configuración a utilizar para entrenar nuestro predictor, y hemos entrenado dicho predictor. La siguiente pregunta es: ¿Cuál es el desempeño que esperamos observar cuando usemos dicho predictor en datos reales?

Responder esta pregunta requiere que evaluemos dicho nuestros algoritmos en datos que no han sido usados para tomar ninguna decisión. Es decir, que no han sido usados ni para entrenar nuestro predictor, ni para decidir cuál es la mejor configuración de entrenamiento a utilizar. Por lo tanto, necesitamos dividir nuestros datos en 3 sub-conjuntos: entrenamiento, validación, y prueba, tal como se muestra en la figura 3. Después vamos a repetir los procesos descritos en las secciones 1.1 y 1.2 de la siguiente manera:

  1. Usamos los sub-conjuntos de entrenamiento y validación para crear la tabla descrita en la sección 1.2. Usamos dicha tabla para escoger la mejor configuración a utilizar.
  2. Fusionamos los sub-conjuntos de entrenamiento y validación en uno solo, llamado conjunto de toma de decisiones, y lo usamos junto con la configuración seleccionada en el paso 1 para crear nuestro predictor.
  3. Finalmente, evaluamos el desempeño del predictor creado en el paso #2 en nuestro conjunto de prueba .

El desempeño que obtenemos en el paso #3 es el desempeño que esperamos observar cuando usemos nuestro predictor en datos reales. Una nota importante es que es posible que la configuración que obtenemos en el paso #1 de este procedimiento no sea la misma que la configuración que obtenemos para crear nuestro predictor final (sección 1.2). No hay problema si esto pasa, a fin de cuentas, lo que queremos evaluar es el desempeño de nuestro sistema completo: selección de configuración + predictor.

Una buena práctica es repetir este procedimiento n veces, creando en cada iteración los conjuntos de entrenamiento, validación, y prueba de manera aleatoria. Esto nos permite reportar una distribución de probabilidad (o su media, desviación estándar, etc) sobre el desempeño esperado en vez de reportar los datos de simplemente un experimento.

Escenario 2: Cantidad limitada de datos

Cuando los datos que tenemos son limitados, queremos aprovechar la mayor cantidad posible de ellos para entrenamiento. En estos casos la técnica de k-fold cross validation es batante útil. Similar al escenario anterior, podemos resolver nuestras tres preguntas de la siguiente manera.

2.1 Eligiendo el mejor algoritmo y los mejores atributos

Figura 4

Empezamos este proceso dividiendo nuestro set de datos en k sub-conjuntos independientes. Para seleccionar la mejor configuración de nuestro experimento, vamos a llenar una tabla similar a la presentada en la sección 1.1. La única diferencia es que en vez de tener 1 fila con resultados, tendremos k filas. Es decir, repetiremos el experimento k veces.

En la primer iteración usaremos el sub-conjunto 1 como nuestro conjunto de validación, y el fusionaremos el resto de los sub-conjuntos en un conjunto de entrenamiento. Después, entrenaremos nuestro predictor usando el conjunto de entrenamiento, y reportaremos en la tabla el desmpeño obtenido en el conjunto de validación. Durante la n-ésima iteración, usaremos el sub-conjunto n como el conjunto de validación, y el resto los fusionaremos en el conjunto de entrenamiento.

E1E2E3E4E5
RMSE 112.3511.2815.038.2511.52
RMSE 211.9812.1315.5410.3210.37
RMSE k12.0211.0115.329.49.8
Promedio12.2411.4315.389.2510.12
Tabla 2.1 Seleccionamos el experimento con el mejor desempeño promedio después de k iteraciones.

Finalmente, una vez que se tienen los resultados de las k iteraciones se obtiene el promedio de cada experimento, y se selecciona la configuración con el mejor desempeño promedio. La ventaja de usar k-fold cross validation es que cada elemento de nuestro conjunto original de datos es usado k-1 veces para entrenamiento, y una vez para prueba. Este proceso se ilustra enla Figura 4.

2.2 Creando nuestro predictor para producción

Una vez seleccionada la mejor configuración para entrenar nuestro predictor, se sigue el mismo procedimiento que en la sección 1.1. Se toman todos los datos disponibles, se entrenar un predictor usando la mejor configuración de experimento seleccionada, y el predictor que resulta es el que utilizaremos en nuestra aplicación.

2.3 Estimando el desempeño de nuestro predictor

Figura 5

Este procedimiento es, quizás, el que más confusiones causa entre las personas que trabajan con algoritmos de aprendizaje computacional. Para determinar el desempeño esperado, necesitamos utilizar internal cross-validation y external cross-validation. Como resultado, necesitaremos repetir el mismo experimento k2 veces. El procedimiento se realiza de la siguiente manera (ver Figura 5 para una explicación gráfica):

  1. Iniciamos dividiendo nuestro conjunto total de datos en k sub-conjuntos. Llamaremos al n-ésimo subconjunto nuestro conjunto de prueba . Es decir, no tomaremos ninguna decisión usando ese conjunto durante este iteración, únicamente lo usaremos para reportar los resultados. El resto de los k-1 subconjuntos los fusionaremos en un conjunto que por el momento llamaremos conjunto de toma de decisiones.
  2. Tomamos nuestro conjunto de toma de decisiones, y repetimos el proceso descrito en la sección 2.1. Es decir, dividimos nuestro conjunto de toma de decisiones en otros k2 subconjuntos. El n2-ésimo subconjunto será nuestro conjunto de validación, mientras que el resto de los sub-conjuntos los fusionaremos en nuestro conjunto de entrenamiento. Este paso se le conoce como internal cross-validation.
  3. Llenamos una tabla similar a la Tabla 2.1, y seleccionamos la mejor configuración del experimento en esta iteración.
  4. Después tomamos todos los datos del conjunto de toma de decisiones y la mejor configuración del experimento para entrenar nuestro predictor. Finalmente, reportamos los datos del desempeño de nuestro predictor en nuestro conjunto de prueba durante esta iteración. Esto finaliza la primer iteración de nuestro external cross-validation. Repetiremos los pasos 1-4 para cada una de las k iteraciones.
  5. Finalmente, reportamos el desempeño esperado de nuestro algoritmo como el promedio del desempeño de las k iteraciones del proceso de external cross-validation. Es posible que en cada una de estas iteraciones la configuración que obtenemos en el paso #3 no sea la misma que la configuración que obtenemos para crear nuestro predictor final (sección 2.2). No hay problema si esto pasa, a fin de cuentas, lo que queremos evaluar es el desempeño de nuestro sistema completo: selección de configuración + predictor.

Conclusión

Existen distintos procedimientos para (1) seleccionar la mejor configuración para entrenamiento, (2) entrenar el predictor que usaremos en nuestras aplicaciones y (3) estimar el desempeño de dicho predictor. Algunos de estos procedimientos requiren dividir el total de nuestros datos en sub-conjuntos de entrenamiento, validación y prueba; sin embargo, el número exacto de sub-conjuntos a utilizar depende de la pregunta que queramos resolver y de la cantidad de datos que tengamos disponibles.

Un comentario en “Cómo elegir y evaluar algoritmos de machine learning”

  1. Hola Roberto,
    Muchas gracias por explicar este proceso. Lo encuentro muy útil para las personas que pretendemos desarrollar un clasificador o un regresor.
    La mayoría de la literatura se centra en explicar cómo dividir los datos o en k fold cv, pero pocos explican el proceso global de aprendizaje, creación del predictor, y evaluación. Repito muy útil la información.
    Espero que sigas posteando este tipo de información para poder seguir aprendiendo.

Comentarios cerrados.