¿Cuál es el uso adecuado de scale_pos_weight en xgboost para conjuntos de datos desequilibrados?


26

Tengo un conjunto de datos muy desequilibrado. Estoy tratando de seguir los consejos y el uso de la optimización,scale_pos_weight pero no estoy seguro de cómo debo ajustarlo.

Puedo ver que RegLossObj.GetGradientsí:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

entonces un gradiente de una muestra positiva sería más influyente. Sin embargo, de acuerdo con el artículo xgboost , la estadística de gradiente siempre se usa localmente = dentro de las instancias de un nodo específico en un árbol específico:

  1. dentro del contexto de un nodo, para evaluar la reducción de pérdidas de una división candidata
  2. dentro del contexto de un nodo hoja, para optimizar el peso dado a ese nodo

Por lo tanto, no hay forma de saber de antemano qué sería bueno scale_pos_weight: es un número muy diferente para un nodo que termina con una relación 1: 100 entre instancias positivas y negativas, y para un nodo con una relación 1: 2.

¿Alguna pista?


Probablemente, puede ajustar el parámetro en CV con 5 veces 5 repeticiones. Pero, es posible que deba escribir el código para hacerlo.
user2149631

Respuestas:


22

Generalmente, el Scale_pos_weight es la relación entre el número de clase negativa y la clase positiva. Supongamos que el conjunto de datos tiene 90 observaciones de clase negativa y 10 observaciones de clase positiva, entonces el valor ideal de scale_pos_Weight debería ser 9. Puede verificar el siguiente enlace. http://xgboost.readthedocs.io/en/latest/parameter.html


1
¿Cómo se aplicaría eso a un conjunto de datos multiclase? ¿Qué tal 28 clases? Eso no está claro para mí
Gabriel Ziegler

1
@ Gabriel, creo que sería mejor ir a pesas de clase. Puede usar scale_pos_weight, utilizando el enfoque de uno contra el resto. Por ejemplo, crea muñecos para 28 clases. Entonces puede usar cada uno como un problema de clasificación binaria. De esa manera, se enfrentará a 28 modelos diferentes.
Harshit Mehta

Ya veo, pero cuando uso onevsrest, el clasificador tampoco me da una salida de múltiples etiquetas, ¿verdad? No solo una clase de los 28
Gabriel Ziegler

Cómo ?. Por ejemplo: las clases son A, B, C. Por lo tanto, puede tener un clasificador binario para clasificar (A / No A), otro sería (B / No B). Puede hacer esto para 'n' número de clases. Luego, entre todas las probabilidades correspondientes a cada clasificador, debe encontrar una manera de asignar clases.
Harshit Mehta

Estoy acostumbrado a usar onevsrest para multilabel, ¡pero lo intentaré! ¡Gracias!
Gabriel Ziegler

3

Toda la documentación dice que debe ser:

scale_pos_weight = count(negative examples)/count(Positive examples)

En la práctica, eso funciona bastante bien, pero si su conjunto de datos está extremadamente desequilibrado, recomendaría usar algo más conservador como:

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

Esto es útil para limitar el efecto de una multiplicación de ejemplos positivos por un peso muy alto.


1

Entiendo su pregunta y frustración, pero no estoy seguro de que esto sea algo que pueda calcularse analíticamente, más bien tendría que determinar una buena configuración empírica para sus datos, como lo hace para la mayoría de los hiperparámetros, utilizando la validación cruzada como @ user2149631 sugirió. He tenido cierto éxito al usar SelectFPR con Xgboost y la API sklearn para reducir el FPR para XGBoost a través de la selección de funciones, y luego ajustar aún más el scale_pos_weight entre 0 y 1.0. O.9 parece funcionar bien, pero como con cualquier cosa, YMMV depende de sus datos. También puede ponderar cada punto de datos individualmente cuando lo envíe a XGboost si mira sus documentos. Tienes que usar su API, no el envoltorio sklearn. De esa manera, puede ponderar un conjunto de puntos de datos mucho más alto que el otro, e impactará el algoritmo de refuerzo que utiliza.


0

También me topé con este dilema y aún busco la mejor solución. Sin embargo, le sugiero que utilice métodos como Grid Search (GridSearchCV en sklearn) para el mejor ajuste de parámetros para su clasificador. Sin embargo, si su conjunto de datos está altamente desequilibrado, vale la pena considerar los métodos de muestreo (especialmente los métodos de sobremuestreo aleatorio y SMOTE) y el conjunto de modelos en muestras de datos con diferentes proporciones de ejemplos de clases positivas y negativas. Aquí hay un tutorial agradable y útil (casi completo) sobre el manejo de conjuntos de datos desequilibrados.

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

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.