Función SMOTE
Equilibrando conjuntos de datos desbalanceados

Empiece a escribir aquí...

En este artículo, aprenderá todo lo que necesita saber sobre SMOTE . SMOTE es una técnica de aprendizaje automático que resuelve los problemas que ocurren cuando se usa un conjunto de datos desequilibrado . Los conjuntos de datos desequilibrados a menudo ocurren en la práctica, y es crucial dominar las herramientas necesarias para trabajar con este tipo de datos.

SMOTE: una potente solución para datos desequilibrados

SMOTE son las siglas de Synthetic Minority Oversampling Technique . El método fue propuesto en un artículo de 2002 en el Journal of Artificial Intelligence Research. SMOTE es un método mejorado para tratar datos desequilibrados en problemas de clasificación.

¿Cuándo usar SMOTE?

Para comenzar e d, repasemos qué son exactamente los datos desequilibrados y cuándo ocurre.

Los datos desequilibrados son datos en los que las frecuencias observadas son muy diferentes entre los diferentes valores posibles de una variable categórica. Básicamente, hay muchas observaciones de algún tipo y muy pocas de otro tipo.

SMOTE es una solución cuando tiene datos desequilibrados.

Como ejemplo, imagine un conjunto de datos sobre las ventas de un nuevo producto para deportes de montaña . Para simplificar, digamos que el sitio web vende a dos tipos de clientes: esquiadores y escaladores.

Para cada visitante, también registramos si el visitante compra el nuevo producto de montaña . Imagine que queremos hacer un modelo de clasificación que nos permita usar los datos del cliente para predecir si el visitante comprará el nuevo producto.

La mayoría de los compradores de comercio electrónico no compran: a menudo, muchos vienen en busca de productos y solo un pequeño porcentaje de los visitantes realmente compran algo. Nuestro conjunto de datos estará desequilibrado porque tenemos una gran cantidad de no compradores y una cantidad muy pequeña de compradores.

El siguiente esquema representa nuestra situación de ejemplo:

SMOTE. Desequilibrio de clases en los compradores de nuestro nuevo producto de montaña. Imagen del autor.

¿Por qué los datos desequilibrados son un problema?

En el ejemplo de datos, verá que hemos tenido 30 visitas al sitio web. 20 de ellos son esquiadores y 10 escaladores. El objetivo es crear un modelo de aprendizaje automático que pueda predecir si un visitante comprará.

Este ejemplo tiene solo una variable independiente: si el visitante es un esquiador o un escalador. Como experimento mental, consideremos dos modelos muy simples:

  • un modelo que utiliza la variable "esquiador vs escalador"
  • un modelo que no utiliza la variable "esquiador vs escalador"

Quiero evitar profundizar en diferentes algoritmos de aprendizaje automático aquí, pero veamos a partir de un análisis lógico si es útil usar la variable independiente para predecir compradores.

El 10% de los escaladores compran, mientras que solo el 5% de los esquiadores compran. Basándonos en estos datos, podríamos decir que los escaladores tienen más probabilidades de comprar que los esquiadores . Sin embargo, esto no ayuda al modelo a decidir predecir "comprar" o "no comprar" para un visitante.

La precisión es una mala métrica de aprendizaje automático cuando se trabaja con datos desequilibrados.

Para dividir a las 30 personas en compradores / no compradores, lo único que realmente podría hacer un modelo aquí es predecir "no comprar" para todos . Es más probable que los esquiadores no compren que compren. También es más probable que los escaladores no compren. Predecir "no comprar" para todos es la única opción aquí.

Lo complicado aquí es que el modelo que predice "no comprar" para todos es correcto en 28 de 30 casos. Esto se convierte en una precisión de 28 de 30, que es del 93%. Usando datos desequilibrados, acabamos de hacer un modelo que parece muy preciso, ¡aunque en realidad es inútil!

Submuestreo

Antes de sumergirnos en los detalles de SMOTE, primero veamos algunos métodos simples e intuitivos para contrarrestar el desequilibrio de clases .

El método más sencillo para contrarrestar el desequilibrio de clases es el submuestreo. Submuestreo significa que descarta una cantidad de puntos de datos de la clase que está presente con demasiada frecuencia .

La desventaja del submuestreo es que pierde una gran cantidad de datos valiosos

Para el ejemplo del sitio web de montaña, teníamos dos opciones: "comprar" y "no comprar". Tuvimos 28 no compradores y 2 compradores. Si hiciéramos un submuestreo, eliminaríamos aleatoriamente una gran cantidad de no compradores de nuestro conjunto de datos.

La ventaja del submuestreo es que es una técnica muy sencilla para reducir el desequilibrio de clases. Sin embargo, es una gran desventaja que necesitemos eliminar una gran cantidad de datos.

SMOTE. Submuestreo: eliminar ocurrencias de la clase más frecuente. Imagen del autor.

En el ejemplo presentado, el submuestreo definitivamente no es una buena idea, porque terminaríamos casi sin datos. El submuestreo puede ser efectivo cuando hay muchos datos y el desequilibrio de clases no es tan grande. En un ejemplo con un 40% de compradores y un 60% de no compradores, el submuestreo no eliminaría tantos datos y, por lo tanto, podría ser efectivo.

Sobremuestreo

Otra solución simple para los datos desequilibrados es el sobremuestreo. El sobremuestreo es lo opuesto al submuestreo. El sobremuestreo significa hacer duplicados de los datos que están menos presentes en su conjunto de datos. Luego, agrega esos duplicados a su conjunto de datos.

Apliquemos esto al ejemplo del sitio web de deportes de montaña. Tuvimos 2 compradores de nuestro producto contra 28 no compradores. Si hiciéramos una sobremuestra, podríamos duplicar a los compradores 16 veces y obtener un conjunto de datos con 28 compradores y 28 no compradores.

La desventaja del sobremuestreo es que crea muchos puntos de datos duplicados.

La ventaja de esto es que no tiene que eliminar puntos de datos, por lo que no elimina información valiosa. Por otro lado, está creando datos que no son reales, por lo que puede estar introduciendo información falsa en su modelo.

Claramente, en nuestro ejemplo de deportes de montaña, no tenemos suficientes puntos de datos para siquiera pensar en el sobremuestreo. Terminaríamos con muchos puntos de datos idénticos, y esto definitivamente sería problemático para cualquier algoritmo de aprendizaje automático.

SMOTE. Sobremuestreo: duplicación de ocurrencias de la clase menos frecuente. Imagen del autor.

Sin embargo, en casos menos extremos, la aplicación de un sobremuestreo aleatorio puede ser eficaz. Al hacer esto, es importante evaluar el rendimiento predictivo de su modelo de aprendizaje automático en un conjunto de datos sin sobremuestreo. Después de todo, sus predicciones fuera de la muestra se realizarán con datos no sobremuestreados y, por lo tanto, así es como debe medir el rendimiento de su modelo.

Aumento de datos

El aumento de datos es un método que funciona de manera muy similar al sobremuestreo. Sin embargo, el Aumento de datos agrega un giro: en lugar de hacer duplicados exactos de observaciones en la clase menos presente, agregará pequeñas perturbaciones a los puntos de datos copiados .

Las pequeñas perturbaciones dependen del tipo de datos que tenga. El método se utiliza a menudo para modelos de tratamiento de imágenes como la detección de objetos o la segmentación de imágenes , en los que simplemente puede girar, girar y estirar las imágenes de entrada para obtener imágenes similares pero diferentes.

En los datos tabulares, podría pensar en agregar un pequeño ruido aleatorio a los valores para que sean ligeramente diferentes del original. También puede crear datos sintéticos basados ​​en los datos originales.

SMOTE. Aumento de datos: ocurrencias duplicadas y perturbadoras de la clase menos frecuente. Imagen del autor.

El algoritmo SMOTE

SMOTE es un algoritmo que realiza el aumento de datos mediante la creación de puntos de datos sintéticos basados ​​en los puntos de datos originales. SMOTE puede verse como una versión avanzada de sobremuestreo o como un algoritmo específico para el aumento de datos. La ventaja de SMOTE es que no genera duplicados , sino que crea puntos de datos sintéticos que son ligeramente diferentes de los puntos de datos originales.

SMOTE es una alternativa mejorada para el sobremuestreo

El algoritmo SMOTE funciona de la siguiente manera:

  • Sacas una muestra aleatoria de la clase minoritaria.
  • Para las observaciones de esta muestra, identificará los k vecinos más cercanos.
  • Luego, tomará uno de esos vecinos e identificará el vector entre el punto de datos actual y el vecino seleccionado.
  • Multiplica el vector por un número aleatorio entre 0 y 1.
  • Para obtener el punto de datos sintéticos, agréguelo al punto de datos actual.

Esta operación es en realidad muy parecida a mover ligeramente el punto de datos en la dirección de su vecino . De esta manera, se asegura de que su punto de datos sintéticos no sea una copia exacta de un punto de datos existente mientras se asegura de que tampoco sea demasiado diferente de las observaciones conocidas en su clase minoritaria.

Para obtener más detalles sobre el algoritmo, puede consultar el documento que presentó SMOTE aquí.

SMOTE influye en la precisión frente a la recuperación

En el ejemplo de deportes de montaña presentado anteriormente, hemos analizado la precisión general del modelo. La precisión mide los porcentajes de predicciones acertadas. En los problemas de clasificación, generalmente queremos ir un poco más allá y tener en cuenta el rendimiento predictivo de cada clase .

En la clasificación binaria, la matriz de confusión es una métrica de aprendizaje automático que muestra el número de:

  • verdaderos positivos (el modelo predijo correctamente la verdad)
  • falsos positivos (el modelo predijo incorrectamente verdadero)
  • verdaderos negativos (el modelo predijo correctamente falso)
  • falsos negativos (el modelo predijo incorrectamente falso)

En este contexto, también hablamos de precisión versus recuerdo . Precisión significa qué tan bien un modelo logra identificar ÚNICAMENTE casos positivos . Recordar significa qué tan bien un modelo logra identificar TODOS los casos positivos dentro de los datos .

Los verdaderos positivos y los verdaderos negativos son predicciones correctas: tener muchos de ellos es la situación ideal. Los falsos positivos y los falsos negativos son predicciones erróneas: tener pocos de ellos también es el caso ideal. Sin embargo, en muchos casos, podemos preferir tener falsos positivos en lugar de falsos negativos .

Cuando se utiliza el aprendizaje automático para automatizar los procesos comerciales, los falsos negativos (positivos que se predicen como negativos) no aparecerán en ninguna parte y probablemente nunca se detectarán, mientras que los falsos positivos (negativos que se pronostican erróneamente como positivos) generalmente se filtrarán bastante. fácilmente en las comprobaciones manuales posteriores que tienen muchas empresas.

En muchos casos comerciales, los falsos positivos son menos problemáticos que los falsos negativos.

Un ejemplo obvio serían las pruebas para el coronavirus . Imagina que los enfermos se hacen una prueba y obtienen un falso negativo: saldrán e infectarán a otras personas. Por otro lado, si son falsos positivos se verán obligados a quedarse en casa: no es lo ideal, pero al menos no constituyen un peligro para la salud pública.

Cuando tenemos un fuerte desequilibrio de clases, tenemos muy pocos casos en una clase, lo que hace que el modelo casi nunca prediga esa clase. Con SMOTE podemos modificar el modelo para reducir los falsos negativos, a costa de aumentar los falsos positivos. El resultado de usar SMOTE es generalmente un aumento en el recuerdo , a costa de una menor precisión . Esto significa que agregaremos más predicciones de la clase minoritaria : algunas de ellas correctas (aumento de recuerdo), pero algunas incorrectas (disminución de precisión).

SMOTE aumenta la recuperación a costa de una menor precisión

Por ejemplo, un modelo que predice compradores todo el tiempo será bueno en términos de recuperación, ya que identificó todos los casos positivos. Sin embargo, será malo en términos de precisión. La precisión general del modelo también puede disminuir, pero esto no es un problema: la precisión no debe usarse como métrica en caso de datos desequilibrados .

Pasemos ahora a la implementación de código de SMOTE en Python.

SMOTE en Python

El conjunto de datos que usaremos en este ejemplo es un conjunto de datos simulados que es un poco similar al ejemplo que se usó anteriormente. El siguiente código importará los datos a Python directamente desde un repositorio de GitHub:

SMOTE. Importando los datos.

Si no está familiarizado con GitHub, puede consultar este breve tutorial de Github aquí .

Una vez que haya importado estos datos, será un marco de datos que se verá como se muestra a continuación. Los datos contienen cuatro variables independientes y una variable dependiente ('comprar'). Queremos hacer un modelo de clasificación que prediga si un visitante comprará, en base a la información de las otras cuatro columnas.

SMOTE. Las primeras cinco líneas del conjunto de datos. Imagen del autor.

Dado que el objetivo de este artículo es presentar SMOTE como una solución para el desequilibrio de clases, lo primero que debemos hacer es verificar este desequilibrio en los datos. El siguiente código crea un gráfico de barras que muestra la distribución de clases de compradores frente a no compradores.

SMOTE. Crear un gráfico de barras para mostrar la distribución de clases.

Usando este código, obtendrá el siguiente gráfico:

SMOTE. Distribución de clases en los datos originales. Imagen del autor.

Vemos claramente que hay muchos no compradores frente a un pequeño número de compradores.

Muestreo estratificado

En este artículo, crearemos una división de tren / prueba para comparar el rendimiento de nuestro modelo de aprendizaje automático en un conjunto de datos que no se incluyó en el entrenamiento del modelo. Si no está familiarizado con el enfoque de entrenamiento / prueba, le aconsejo que consulte este artículo sobre el flujo general de los proyectos de aprendizaje automático .

Cuando trabaje con datos desequilibrados, utilice un muestreo estratificado para su división de tren / prueba.

En casos con datos balanceados, podemos generar un tren / conjunto de prueba simplemente asignando al azar el 30% de los datos a un conjunto de prueba. Sin embargo, en datos desequilibrados, esto debe evitarse. Existe un gran riesgo de terminar casi sin casos de la clase minoritaria en el conjunto de prueba.

El muestreo estratificado es una solución a esto. El muestreo estratificado forzará el mismo equilibrio de clases en el tren y el conjunto de datos de prueba que los datos originales. Puede hacer un muestreo estratificado utilizando train_test_split de scikitlearn de la siguiente manera:

SMOTE. Creación de una división de prueba de trenes estratificada.

Verifiquemos ahora con un gráfico que la distribución de clases en el tren es la misma que en los datos originales. Esta es una verificación importante que debe realizarse antes de comenzar con el modelado.

SMOTE. Inspeccionar la distribución de clases en los datos de entrenamiento.

Obtendrá el siguiente gráfico. Confirma que la distribución de clases es igual, gracias al muestreo estratificado que usamos en la función train_test_split de scikitlearn.

SMOTE. Gráfico de barras de la distribución de clases en los datos de entrenamiento. Imagen del autor.

Para una seguridad absoluta, también verifiquemos si la estratificación fue correcta en los datos de prueba. Puede utilizar el siguiente código para hacer esto:

SMOTE. Cree el mismo gráfico para los datos de prueba.

Este código creará el mismo gráfico de barras que antes, excepto que utiliza los datos de prueba como entrada. Obtendrá el siguiente gráfico:

SMOTE. Verificación de la distribución de clases en los datos de prueba. Imagen del autor.

Todo se ve bien: los datos de entrenamiento y los datos de prueba tienen la misma distribución de clases que los datos originales. Ahora podemos pasar a crear un modelo de aprendizaje automático para predecir qué visitantes del sitio web terminarán comprando algo.

El modelo de aprendizaje automático que usaremos es la regresión logística. La regresión logística es uno de los modelos más fáciles que podemos utilizar para la clasificación. Por lo general, es el primer modelo que debe probar cuando trabaje con problemas de clasificación.

Primero construyamos un modelo de regresión logística sobre los datos originales, de modo que tengamos un punto de referencia para los rendimientos al usar SMOTE. Puede utilizar el siguiente código para ajustar una regresión logística a los datos de entrenamiento y crear predicciones sobre los datos de prueba.

SMOTE. Ajuste una regresión logística en los datos de entrenamiento y prediga en el conjunto de prueba.

Para evaluar el rendimiento predictivo de este modelo, comencemos por mirar la matriz de confusión . La matriz de confusión muestra los resultados previstos por un lado y los resultados reales por el otro.

Si tiene más de dos resultados, la matriz de confusión le dará los detalles exactos para cada combinación de clases predichas y reales. Cuando solo tiene dos clases de resultados, esto se traduce en verdaderos positivos, verdaderos negativos, falsos positivos y falsos negativos.

Puede obtener la matriz de confusión utilizando el siguiente código:

SMOTE. Verifique la matriz de confusión.

Los resultados pueden diferir ligeramente, ya que la división aleatoria de tren / prueba provocará diferencias en el conjunto de prueba exacto. Sin embargo, en mi caso, el resultado obtenido es el siguiente:

  • Verdaderos negativos: 281
  • Falsos positivos: 4
  • Falsos negativos: 12
  • Positivos verdaderos: 3

Una segunda métrica de clasificación que usaremos es el informe de clasificación de scikitlearn . Es una herramienta muy útil que extrae numerosas métricas sobre nuestro modelo. Puede obtenerlo de la siguiente manera:

SMOTE. Obtén el informe de clasificación.

El informe obtenido se muestra a continuación. Las cosas interesantes a tener en cuenta son la precisión para cada clase (0 = no compradores, 1 = compradores) y la recuperación para cada clase.

SMOTE. Este es nuestro informe de clasificación de los datos originales. Imagen del autor.

Rehaciendo la regresión logística con SMOTE

Como siguiente paso, utilizaremos la matriz de confusión y el informe de clasificación como punto de referencia. Ahora aplicaremos SMOTE para reducir el desequilibrio de clases y comparar las mismas métricas antes y después de la aplicación de SMOTE.

El paquete imblearn es ideal para SMOTE en Python

El primer paso es usar la función SMOTE en el paquete imblearn para crear conjuntos de datos remuestreados de X e y. Esto puede hacerse de la siguiente manera:

SMOTE. Ajustar y volver a muestrear los conjuntos de datos X e Y utilizando SMOTE del paquete imblearn.

Verifiquemos lo que esto ha hecho con nuestro desequilibrio de clases. El siguiente código dará como resultado el mismo gráfico de barras que creamos anteriormente:

SMOTE. Verificar el saldo de la clase después de la aplicación de SMOTE.

Obtendrá el siguiente gráfico:

SMOTE. Mostrando la distribución de clases después de aplicar SMOTE. Imagen del autor.

Este gráfico muestra claramente que ahora tenemos una gran cantidad de compradores que antes no teníamos. Todos esos son puntos de datos sintéticos que se han creado gracias a SMOTE.

Rehagamos ahora el modelo para investigar el efecto de SMOTE en nuestras métricas de clasificación. Puedes rehacer el modelo con el siguiente código:

SMOTE. Reajuste del modelo en los datos que se volvieron a muestrear con SMOTE.

Ahora rehacemos las métricas que también hicimos en el modelo anterior. Esto nos permitirá comparar los dos y estimar cuál ha sido el impacto de SMOTE. Puede obtener la matriz de confusión de la siguiente manera:

SMOTE. Comprobación de la matriz de confusión en los datos que se volvieron a muestrear con SMOTE.

Obtendrá los siguientes resultados (pueden ser ligeramente diferentes debido a la creación aleatoria del tren / conjunto de prueba):

  • Negativos verdaderos: 265 (en lugar de 281, por lo que se ha reducido con SMOTE)
  • Falsos positivos: 20 (era 4, por lo que ha aumentado con SMOTE)
  • Falsos negativos: 2 (eran 12, así que esto se ha reducido con SMOTE)
  • Verdaderos positivos: 13 (fue 3, por lo que ha aumentado con SMOTE)

Esto muestra que SMOTE ha provocado que la precisión general disminuya (casos menos correctos en general). Sin embargo, gracias a SMOTE logramos aumentar sustancialmente el número de verdaderos positivos (compradores correctamente identificados).

Esto confirma que, como se explicó anteriormente, SMOTE es excelente cuando desea cambiar sus errores hacia falsos positivos en lugar de falsos negativos. En muchos casos comerciales, los falsos positivos son menos problemáticos que los falsos negativos.

Generemos también el informe de clasificación. Esto puede hacerse de la siguiente manera:

SMOTE. Mostrando el informe de clasificación de los datos que se volvieron a muestrear con SMOTE.

El informe de clasificación obtenido se muestra aquí:

SMOTE. Este es el informe de clasificación de los datos que se volvieron a muestrear con SMOTE. Imagen del autor.

Podemos observar una serie de cambios al comparar este informe de clasificación con el anterior:

  • El recuerdo de no compradores bajó de 0,99 a 0,93: hay más no compradores que no pudimos encontrar
  • El recuerdo de compradores aumentó de 0,4 a 0,87: logramos identificar a muchos más compradores
  • La precisión de los compradores bajó de 0,77 a 0,39: el costo de identificar correctamente a más compradores es que ahora también identificamos incorrectamente a más compradores (identificando a los visitantes como compradores cuando en realidad no son compradores) .

Esto confirma la conclusión de que ahora estamos en mejores condiciones de encontrar compradores, a costa de clasificar también erróneamente a más compradores como no compradores.

Conclusión

A lo largo de este artículo, ha descubierto el algoritmo SMOTE como una solución para los datos desequilibrados en los problemas de clasificación. SMOTE es una alternativa inteligente al sobremuestreo: en lugar de crear duplicados de la clase minoritaria, crea puntos de datos sintéticos que son relativamente similares a los originales.

Con SMOTE, su modelo comenzará a detectar más casos de la clase minoritaria, lo que dará como resultado una mayor recuperación, pero una menor precisión . La decisión de si se trata de un comportamiento deseado siempre dependerá de su caso comercial .

También ha visto cómo implementar SMOTE en Python . Usando la función SMOTE en el paquete imblearn y una Regresión logística en los datos de ventas del sitio web, ha confirmado que SMOTE permite una mayor recuperación de la clase minoritaria a costa de una menor precisión.

Espero que este artículo te haya sido útil. ¡Gracias por leer!


Compartir
Identificarse dejar un comentario
Funciones y estrategias de extracción en Postgresql
/*
*/