-
Notifications
You must be signed in to change notification settings - Fork 0
Progreso mayo 2022
SEMANAS 1 y 2 (04/05/2022 - 19/05/2022)
- Usando validación cruzada para generalizar los modelos
- Paquete de ROS para detectar emociones funcionando en Raspberry Pi 4
Hasta ahora lo que hacíamos es dividir el conjunto de datos en una proporción 80:20 (80% datos de entrenamiento y 20% datos de prueba) y posteriormente entrenábamos ese 80% con uno de los algoritmos y los respectivos parámetros escogidos y mediamos su rendimiento usando el 20% restante de los datos.
Si vamos a entrenar con KNN el principal objetivo es encontrar el número de vecinos más óptimo (k). Nosotros lo que estábamos haciendo es entrenar nuestro modelo con diferentes valores de k y estudiar cual de ellos es el que ofrecía más porcentaje de acierto. Para ello entrenábamos con el 80% de los datos y probábamos el rendimiento con el 20% restante.
De este estudio obtuvimos que el mejor resultado fue con k=3, un 93% de acierto. Podemos verlo aquí.
Hasta aquí parece todo correcto, pero... ¿si probamos con nuevos datos ese acierto se seguirá manteniendo en 93%?. La respuesta es que NO.
Si queremos generalizar el resultado de nuestro algoritmo debemos probarlo con más datos nuevos, ¿cómo hacemos eso si no tenemos más datos?. Aquí entra en juego la validación cruzada K-Fold.
Usando KFold lo que conseguiremos es usar todos los datos como prueba y todos los datos como entrenamiento al terminar todas las iteraciones. Viendo la imagen anterior podemos observar que el algoritmo divide el conjunto de datos en 4 partes iguales (esto es totalmente personalizable y sería el valor K del algoritmo, lo que hace referencia a los pliegues) y en cada iteración el conjunto de datos de prueba va "moviéndose" a la derecha.
Una vez hecha la separación lo que tendríamos que hacer sería probar cada una de las k (vecinos de KNN) en cada una de las iteraciones de KFold. El resultado sería una matriz como la que vemos en la siguiente imagen.
Tras realizar las medias de las iteraciones nos quedaría el porcentaje de acierto medio para cada una de las k (vecinos) y entonces ahora ya sí podríamos elegir la mejor k de manera más general y evitando en mayor medida el overlifting.
Hasta aquí estaría todo resuelto si sólo usáramos KNN para entrenar nuestro modelo pero no es el caso, nosotros también estamos usando PCA. Al tener otro parámetro para optimizar (el número de componentes de PCA, osea el número de características que mantiene) pasamos a un problema de dimensión 3 en vez de dimensión 2.
La forma de resolverlo es la misma, pero al tener una dimensión más es algo más complejo. Un ejemplo sería la siguiente imagen, en ella se están buscando vecinos (entre 1 y 7) y componentes de PCA (entre 1 y 5). Esto es un caso simplificado para poder visualizarlo bien.
El valor más alto de la última matriz nos indicará cual es la combinación más óptima de vecinos de KNN y componentes de PCA.
Para el algoritmo SVM sería hacer lo mismo pero en vez de buscar el número de vecinos, se busca el parámetro de regularización (C), y para MLP el número de capas ocultas y sus neuronas.
Más información aquí.
Los scripts utilizados para encontrar los parámetros óptimos de cada algoritmo se encuentran en la carpeta k_fold_cross_validation.
Los parámetros óptimos obtenidos para KNN+PCA han sido:
- k = 7
- n_components = 11
Los parámetros óptimos obtenidos para SVM+PCA han sido:
- C = 21
- n_components = 11
Los parámetros óptimos obtenidos para MLP+PCA han sido:
- hidden_layer_sizes = (17)
- n_components = 11
El paquete se puede encontrar aquí.
Se puede ver una demo de su uso en este vídeo.