Python: manejo de clases de desequilibrio en Python Machine Learning

9

Tengo un conjunto de datos para el que estoy tratando de predecir variables objetivo.

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

He proporcionado una muestra de datos, pero la mía tiene miles de registros distribuidos de manera similar. Aquí, Col1, Col2, Col3, Col4 son mis características y Col5 es la variable de destino. Por lo tanto, la predicción debe ser 1,2,3 o 4, ya que estos son mis valores para la variable objetivo. He intentado utilizar algoritmos como bosque aleatorio, árbol de decisión, etc. para las predicciones.

Aquí, si ve, los valores 1,2 y 3 ocurren más veces en comparación con 4. Por lo tanto, mientras pronostico, mi modelo está más sesgado hacia 1 2 y 3, mientras que obtengo solo un menor número de predicciones para 4 (Obtuve solo 1 predicho para la política 4 de miles de registros cuando vi la matriz de confusión).

Para que mi modelo se generalice, eliminé el mismo porcentaje de datos que pertenecen al valor 1,2 y 3 al azar. Agrupe por cada valor en Col5 y luego eliminé cierto porcentaje, de modo que reduje el número de registros. Ahora pude ver cierto aumento en el porcentaje de precisión y también un aumento razonable en las predicciones para el valor 4 en la matriz de confusión.

¿Es este el enfoque correcto para tratar (eliminar los datos al azar de los grupos en los que el modelo está sesgado)?

Probé algoritmos de Python incorporados como Adaboost, técnicas GradientBoost usando sklearn. Leí que estos algoritmos son para manejar la clase de desequilibrio. Pero no pude lograr mejorar mi precisión, sino eliminando aleatoriamente los datos, donde pude ver algunas mejoras.

¿Es esta reducción una técnica de submuestreo y este es el enfoque correcto para el submuestreo?

¿Hay algún paquete predefinido en sklearn o alguna lógica que pueda implementar en python para hacer esto, si mi eliminación aleatoria es incorrecta?

Además, aprendí sobre la técnica SMOTE, que se ocupa del sobremuestreo. ¿Debo probar esto para el valor 4? ¿Y podemos hacer esto usando cualquier paquete incorporado en Python? Sería genial si alguien me ayuda en esta situación.

SRS
fuente

Respuestas:

5

Este artículo sugiere usar el ranking (lo escribí). En lugar de usar, por ejemplo, SVM directamente, usaría RankSVM. Como los rankers comparan la observación con la observación, el entrenamiento es necesariamente equilibrado. Sin embargo, hay dos "peros": el entrenamiento es mucho más lento y, al final, lo que hacen estos modelos es clasificar sus observaciones según la probabilidad de que pertenezcan a una clase y la probabilidad de que pertenezcan a otra, por lo que debe aplicar un umbral después.

Si va a utilizar el preprocesamiento para corregir su desequilibrio, le sugiero que busque en MetaCost . Este algoritmo implica construir un conjunto de modelos y luego cambiar los previos de clase para equilibrarlos en función de los casos difíciles de predecir. Es muy elegante. Lo bueno de los métodos como SMOTE es que al fabricar nuevas observaciones, puede hacer que los conjuntos de datos pequeños sean más sólidos.

De todos modos, a pesar de que escribí algunas cosas sobre el desequilibrio de clase, todavía soy escéptico de que sea un problema importante en el mundo real. Creo que es muy raro que tenga antecedentes de desequilibrio en su conjunto de entrenamiento, pero antecedentes equilibrados en sus datos del mundo real. ¿Vos si? Lo que suele ocurrir es que los errores de tipo I son diferentes a los errores de tipo II y apostaría a que a la mayoría de las personas les vendría mejor usar una matriz de costos, que la mayoría de los métodos de capacitación aceptan o puede aplicarla mediante el procesamiento previo utilizando MetaCost o SMOTE. Creo que muchas veces "arreglar el desequilibrio" es corto a "No quiero molestarme en pensar en el equilibrio relativo entre los errores de tipo I y II".

Apéndice:

Probé algoritmos de Python incorporados como Adaboost, técnicas GradientBoost usando sklearn. Leí que estos algoritmos son para manejar la clase de desequilibrio.

AdaBoost ofrece mejores resultados para el desequilibrio de clase cuando inicializa la distribución de peso teniendo en cuenta el desequilibrio. Puedo cavar la tesis donde leo esto si quieres.

De todos modos, por supuesto, esos métodos no darán buenas precisiones. ¿Tiene un desequilibrio de clase tanto en su formación como en su conjunto de datos de validación? Debe usar métricas como la puntuación F1 o pasar una matriz de costos a la función de precisión. El desequilibrio de clase de "corrección" es cuando sus antecedentes son diferentes en su entrenamiento y sus casos de validación.

Ricardo Cruz
fuente
4

Algunos de los algoritmos de sklearn tienen un parámetro llamado class_weight que puede establecer como "equilibrado" . De esa forma, sklearn ajustará los pesos de sus clases según la cantidad de muestras que tenga de cada clase.

Para el clasificador de bosque aleatorio, intente lo siguiente y vea si mejora su puntaje:

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!
stmax
fuente
(class_weight = "balanceado") no proporciona mejoras suficientes cuando traté de usarlo
SRS
2
@Srinath, ¿qué entiendes por mejora? ¿Qué métrica estás usando? Si tanto su entrenamiento como su validación son desequilibrios, no puede usar puntajes de precisión. Lo que class_weighthace es construir una matriz de costos para usted en cada clasek, Ck=2NkN. Debe pasar ya sea sample_weight=[C_k for k in y]a accuracy_scoreo algo así como el uso f1_score.
Ricardo Cruz
2

Sí, esta es una buena técnica para abordar el problema del desequilibrio de clase. Sin embargo, los métodos de submuestreo conducen a la pérdida de información en el conjunto de datos (por ejemplo, acaba de eliminar un patrón interesante entre las variables restantes, que podría haber contribuido a una mejor capacitación del modelo). Es por eso que se prefieren los métodos de sobremuestreo, específicamente en el caso de un conjunto de datos más pequeño.

En respuesta a su consulta sobre los paquetes de Python, la caja de herramientas de aprendizaje desequilibrado está especialmente dedicada para la misma tarea. Proporciona varios métodos de submuestreo y sobremuestreo. Recomendaría probar la técnica SMOTE .

Saurav
fuente
1

Depende de la técnica de conjunto que desee utilizar. El problema básico que está trabajando con el problema de desequilibrio de datos de varias clases. El submuestreo se puede utilizar de manera eficiente en el ensacado y en las técnicas de refuerzo. El algoritmo SMOTE es muy eficiente en la generación de nuevas muestras. El problema del desequilibrio de datos ha sido ampliamente estudiado en la literatura. Le recomiendo que lea sobre uno de estos algoritmos: SMOTE-Boost SMOTE-Bagging Rus-Boost EusBoost Estas son técnicas de refuerzo / embolsado diseñadas específicamente para problemas de desequilibrio de datos. En lugar de SMOTE, puede probar ADA-SMOTE o Border-Line SMOTE. He usado y modificado el Border-Line SMOTE para multi-clase y es muy eficiente. Si su base de datos es muy grande y el problema es fácil, intente: viola - jones clasificador. También lo he usado con el problema de desequilibrio de datos y es realmente eficiente

Bashar Haddad
fuente
Gracias por la orientación. Estoy investigando los temas mencionados por usted. ¿Pero la técnica que solía submuestrear (reducir los datos al azar) es una forma correcta de hacerlo?
SRS
Puede usarlo si su base de datos es muy grande. Pero si su base de datos es pequeña, perderá parte de la información. Lea el Rus-Boosting, en este método usan aleatorio bajo muestreo como parte del algoritmo de refuerzo para evitar perder información. Muestran el subconjunto que se utilizará para capacitar al próximo alumno base pero no a toda la base de datos
Bashar Haddad el
Mi conjunto de datos tiene casi 80k registros que estoy usando como conjunto de entrenamiento. Estoy implementando esto en python. Estaba buscando algunos paquetes en sklearn o alguna otra cosa en python. No pude encontrarlos. ¿Es esto algo para lo que debería corregir alguna lógica para que se implementen?
SRS
No creo que haya ninguna implementación para estos métodos. El problema del desequilibrio de datos todavía está bajo investigación. Si tiene una buena implementación para Adaboost.M1 o M2. Puede modificarlo fácilmente para convertirse en Rus Boost
Bashar Haddad
Creo que la base de datos que tienes es bastante grande y si quieres puedes usar viola - jones clasificador. Para esta, puede encontrar la implementación disponible
Bashar Haddad
0

Ya hay algunas buenas respuestas aquí. Solo pensé que agregaría una técnica más ya que pareces estar usando conjuntos de árboles. En muchos casos, busca optimizar la curva de elevación o el AUC para el ROC. Para esto, recomendaría el criterio de distancia de Hellinger para dividir las ramas en sus árboles. Al momento de escribir esto, no está en el paquete de aprendizaje desequilibrado, pero parece que hay un plan .

Keith
fuente
0

Cuando se trata de un problema de desequilibrio de clase, debe concentrarse principalmente en la métrica de error y debe elegir la puntuación F1 como métrica de error.

Después de elegir la métrica correcta, podemos usar diferentes técnicas para tratar este problema.

Si está interesado, puede consultar el siguiente blog, se explica muy bien sobre las técnicas utilizadas para resolver este problema de desequilibrio de clase:

https://knowledgengg.wordpress.com/2019/03/04/this-is-suresh/

saisubrahmanyam janapati
fuente