Aprendizajes Competición Iniciación SpainML (I)

Publicado por @SpainML el Feb. 10, 2019, 6:21 p.m.
La [competición de iniciación de SpainML][1] ya cuenta con más de 50 subidas de resultados en su primera semana. Dentro de la [comunidad Slack][2] los usuarios han estado muy activos preguntando dudas iniciales y este post se centra una que ha generado debate: cómo gestionar el problema del dataset desbalanceado. ## Clases desbalanceadas en Machine Learning ## Lo primero que se debe hacer al enfrentarse ante un problema de Machine Learning es un Análisis Exploratorio de los Datos (conocido como EDA - Exploratory Data Analysis). Uno de las puntos donde debe ponerse más atención es en analizar la distribución de clases del conjunto de entrenamiento del que se dispone. En este caso el problema es de clasificación binaria, es decir, la tarea consiste en decidir si un ejemplo va a pertenecer a una de dos clases posibles. Analizando el dataset de entrenamiento se puede apreciar una distribución de clases del orden del 70%-30%, y al ser *F1-Score* la métrica de evaluación, será necesario advertirle a nuestro modelo que la mejor aproximación no es predecir todos los ejemplos según la clase mayoritaria. Si la métrica fuese *Accuracy*, predecir todos los ejemplos como la clase mayoritaria nos haría partir con un 70% de acierto, pero en el caso de hacerlo así con la métrica de la competición, el resultado será un 0%. Para resolver el problema del desbalanceo de clases se han planteado tres soluciones distintas: ### Parámetro *class weight* ### La mayoría de frameworks de creación de modelos de Machine Learning cuentan con un parámetro denominado *class weight* encargado de ponderar la importancia que tiene cometer un error en función de la clase predicha. De esta forma, el clasificador ajustará su aprendizaje teniendo en cuenta que no tendrá el mismo efecto equivocarse clasificando algo positivo como negativo de algo negativo como positivo. Tanto en la librería Scikit Learn como en Keras se puede incluir este parámetro. ### *Downsampling* y *Oversampling* ### La segunda solución al problema del desbalance de clases es construir un dataset de entrenamiento balanceado de manera sintética. En el caso de *Downsampling* el objetivo será eliminar muestras de la clase mayoritaria para así igualar el número de instancias de ambas clases. Este proceso debe hacerse con cuidado para alterar en la menor medida posible la distribución de las variables de la clase mayoritaria. El *Oversampling* consiste en el proceso inverso, es decir, aumentar de manera sintética los ejemplos de la clase minoritaria. Una de las técnicas más conocidas para esta tarea se conoce como [SMOTE][3] (Synthetic Minority Over-sampling Technique). Por último, para gestionar ambos casos se compartió a través de la comunidad el paquete [imbalanced-learn][4] para Python. ### Extra: F1 como función de pérdida en modelos de Keras ### Una solución más sofisticada para gestionar el problema del desbalance entre clases es optimizar directamente sobre la función de pérdida F1. Para ello, el usuario **@jose13** nos enseñó a hacerlo en Keras, subiendo un Notebook a nuestra plataforma de kernels titulado [LSTM Baseline][5]. Recomendamos la lectura de este Notebook ya que contiene información valiosa sobre cómo afrontar este problema de una forma muy didáctica y siguiendo buenas prácticas. [1]: https://spainml.com/competiciones/iniciacion-spainml/ [2]: http://bit.ly/JoinSpainML [3]: https://www.jair.org/index.php/jair/article/view/10302 [4]: https://imbalanced-learn.readthedocs.io/en/stable/install.html [5]: https://spainml.com/competiciones/iniciacion-spainml/k/lstm-baseline