Sugerencias para el aprendizaje sensible al costo en un entorno altamente desequilibrado


15

Tengo un conjunto de datos con unos pocos millones de filas y ~ 100 columnas. Me gustaría detectar aproximadamente el 1% de los ejemplos en el conjunto de datos, que pertenecen a una clase común. Tengo una restricción de precisión mínima, pero debido al costo muy asimétrico, no estoy muy interesado en ningún retiro en particular (¡siempre y cuando no me queden 10 coincidencias positivas!)

¿Cuáles son algunos enfoques que recomendaría en esta configuración? (enlaces a documentos de bienvenida, enlaces a implementaciones apreciados)

Respuestas:


15

He encontrado que Él y García (2009) son una revisión útil del aprendizaje en problemas de clase desequilibrados. Aquí hay algunas cosas que definitivamente no son exhaustivas para tener en cuenta:

Enfoques basados ​​en datos:

Se puede submuestrear la clase mayoritaria o sobremuestrear la clase minoritaria. (Breiman señaló que esto es formalmente el equivalente a asignar costos de clasificación erróneos no uniformes). Esto puede causar problemas: la submuestreo puede hacer que el alumno pierda aspectos de la clase mayoritaria; el sobremuestreo aumenta el riesgo de sobreajuste.

Existen métodos de "submuestreo informado" que reducen estos problemas. Uno de ellos es EasyEnsemble , que muestrea independientemente varios subconjuntos de la clase mayoritaria y crea múltiples clasificadores combinando cada subconjunto con todos los datos de la clase minoritaria.

SMOTE (Técnica de sobremuestreo de minorías sintéticas) o SMOTEBoost (que combina SMOTE con refuerzo) crea instancias sintéticas de la clase minoritaria al hacer vecinos más cercanos en el espacio de características. SMOTE se implementa en R en el paquete DMwR (que acompaña al libro de Luis Torgo "Minería de datos con R, aprendizaje con estudios de casos" CRC Press 2016 ).

Enfoques de ajuste del modelo

Aplique pesos específicos de clase en su función de pérdida (pesos mayores para casos minoritarios).

Para los enfoques basados ​​en árboles, puede usar la distancia de Hellinger como una función de impureza de nodo, como se recomienda en Cieslak et al. "Los árboles de decisión de distancia Hellinger son robustos e insensibles a la inclinación" ( código Weka aquí ).

Utilice un clasificador de una clase , aprendiendo (según el modelo) una densidad de probabilidad o límite para una clase y tratando la otra clase como valores atípicos.

Por supuesto, no use la precisión como métrica para la construcción de modelos. El kappa de Cohen es una alternativa razonable.

Enfoques de evaluación modelo

Si su modelo devuelve probabilidades pronosticadas u otros puntajes, elija un punto de corte de decisión que realice una compensación adecuada de errores (utilizando un conjunto de datos independiente de la capacitación y las pruebas). En R, el paquete OptimalCutpoints implementa una serie de algoritmos, incluidos los sensibles al costo, para decidir un límite.


Gracias por la respuesta detallada. He intentado subestimar y he fallado miserablemente. Los modelos muestran un excelente rendimiento en la muestra, pero el desequilibrio todavía está presente en el conjunto de pruebas (y los datos del mundo real que eventualmente usaré), por lo que la precisión OOS de los modelos es horrible. También probé pesos específicos de clase, pero mi aplicación implica un costo mayor fácilmente cuantificable para falsos positivos que para falsos negativos. En cuanto a los clasificadores de una clase, intenté ajustar un svm lineal (los no lineales son demasiado lentos) y eso tiene precisión 0 incluso en la muestra ...
em70

1
Lo siento por ti. La alta precisión es difícil si la gran mayoría de sus casos son negativos. Usaría pesos específicos de clase (como inversamente proporcional a la fracción de casos en la clase) para aprender y guardar los pesos específicos de tipo de error para determinar el umbral de decisión. Esperemos que esté utilizando la validación cruzada con la precisión de kappa de Cohen no para la selección del modelo. Visualizaría la densidad de probabilidades para las clases en los datos de calibración junto con la precisión lateral y el enriquecimiento (precisión / proporción de casos positivos) en todos los puntos de corte para comprender realmente las compensaciones disponibles.
MattBagg

Gran respuesta, gracias. He estado utilizando una técnica similar a la mencionada EasyEnsemble durante bastante tiempo, pero dudaba de ello (a pesar del rendimiento sensible en datos simulados). Ahora sé que tiene sentido.
ayorgo

5

Según tengo entendido, esta es un área activa de investigación en la comunidad de aprendizaje automático y no hay grandes respuestas, sino un número grande y creciente de posibles soluciones. Es probable que obtenga mejores respuestas si especifica los algoritmos específicos que está considerando.

Si está utilizando un modelo paramétrico (regresión logística), esto debería ser un problema menor y solo puede variar el umbral en función de su función de pérdida (costo de falsos negativos a falsos positivos)

Si está utilizando algoritmos de aprendizaje automático, esto podría ser más complicado. Max Kuhn hace un intento justo de resumir el problema en el Capítulo 16 de "Modelado predictivo aplicado". Pero es un tema desafiante para resumir. Si no desea comprar el libro, el código R está disponible en el paquete AppliedPredictiveModeling para este capítulo y puede ser suficiente dependiendo de su familiaridad con R y los algoritmos utilizados.

Por lo general, la discusión gira en torno al submuestreo / sobremuestreo +/- algoritmos sensibles al costo. Con variaciones como jous-boost también es posible.
Un ejemplo de este tipo de discusión: Chen et al "Uso del bosque aleatorio para aprender datos desequilibrados" http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf


El problema al variar el umbral es que es como cambiar la intersección de un modelo de regresión. En realidad, es posible que desee cambiar el vector de peso para tener en cuenta el costo. Pero si hago eso, dado el desequilibrio ya severo, ¡termino con 0 precisión! No me he decidido por ningún algoritmo y tengo recursos para implementar ideas de investigación de vanguardia, si son prometedoras. Echaré un vistazo al libro que sugirió.
em70

El capítulo es más o menos. Esfuerzo sólido, pero tema difícil de resumir. Muchas reclamaciones no admitidas publicadas en varios métodos. Creo que el submuestreo estratificado en bosques aleatorios es un buen comienzo desde una perspectiva de aprendizaje automático. El código está en el paquete del libro.
Charles

0

Puedes echar un vistazo a la implementación de scikit-learn. preste atención al argumento class_ weight que puede tener valores de un diccionario de ponderaciones de clase o 'auto':

class sklearn.svm.SVC (C = 1.0, kernel = 'rbf', degree = 3, gamma = 0.0, coef0 = 0.0, shrinking = True, probabilidad = False, tol = 0.001, cache_size = 200, class_weight = None, verbose = Falso, max_iter = -1, random_state = Ninguno)

Puedes jugar con el valor del argumento class_weight, que puede ser un diccionario de ponderación de clase o 'auto'. En el modo 'automático', el algoritmo de aprendizaje asignará automáticamente pesos a cada clase en función del número de muestras dentro de cada una de ellas.

scikit-learn tiene varios otros algoritmos de clasificación, algunos de los cuales aceptan ponderaciones de clase.


¿Puedes decir más sobre cómo se pueden usar los pesos de la clase para lograr los objetivos del OP? Creo que eso está implícito en tu publicación, pero aún no es una respuesta.
gung - Restablece a Monica

Sí, el argumento class_weight puede tener un valor 'auto' si alguno examina la documentación o puede tener un valor de diccionario que tenga los pesos de la clase. En el caso de 'auto', el algoritmo de aprendizaje mismo encuentra el peso de cada clase de acuerdo con el número de muestras en cada una.
Ash
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.