Actualmente estoy usando XGBoost para la predicción de riesgos, parece estar haciendo un buen trabajo en el departamento de clasificación binaria, pero los resultados de probabilidad están muy lejos, es decir, cambiar el valor de una característica en una observación en una cantidad muy pequeña puede hacer que la probabilidad Salto de salida de 0.5 a 0.99.
Apenas veo salidas en el rango de 0.6-0.8. En todos los casos, la probabilidad es inferior a 0,99 o 1.
Conozco los métodos de calibración posteriores al entrenamiento, como el escalado de Platt y la corrección logística, pero me preguntaba si hay algo que pueda modificar en el proceso de entrenamiento de XGBoost.
Llamo a XGBoost desde diferentes idiomas usando FFI, por lo que sería bueno si puedo solucionar este problema sin introducir otras bibliotecas de calibración, por ejemplo, cambiando la métrica de evaluación de AUC a pérdida de registro.
fuente
XGBoost
es bastante robusto frente a los valores atípicos, cuando se compara con otros métodos de vainilla comoSVM
.Respuestas:
XGBoost no está naturalmente calibrado en probabilidades. Necesitas usar algo como:
para asegurarse de que la salida del modelo se pueda interpretar como una probabilidad. De lo contrario, solo puede obtener puntajes, que solo se pueden usar para clasificar instancias. Como la mayoría de las métricas de rendimiento se pueden calcular a partir de las puntuaciones, es un error común usar lo que parecen probabilidades (asociadas con buenas métricas de rendimiento) en lugar de probabilidades 'reales'.
En cuanto a la inestabilidad del modelo (aquí en el sentido de que un ligero cambio en la variable explicativa cambia mucho la predicción), debe volver a verificar todo el proceso de calibración: selección de variables, partición de entrenamiento / prueba, ajuste de hiperparámetros / validación cruzada, rendimiento métricas utilizadas, para garantizar que su modelo no se ajuste demasiado.
fuente
Sí, verifique la distribución de pérdida de registro a medida que aumenta el número de iteraciones. Si comienza a dispararse antes de su iteración de impulso final, entonces es demasiado ajustado.
fuente
Lo primero que preguntaría sería "¿Qué son las relaciones positivas / negativas?". Solo porque tuve un problema similar varias veces cuando las clases estaban muy desequilibradas. Si es su caso, puede intentar equilibrar el conjunto de datos o intentar jugar con el
scale_pos_weight
parámetro de XGboost. En el caso de las proporciones de 50/50 clases, las probabilidades podrían estar más o menos normalizadas.Además, es muy probable que tenga un sobreajuste al mismo tiempo. Intente ajustar la tasa de aprendizaje, los parámetros de muestreo y los parámetros de regularización (reg_alpha, reg_lambda).
fuente
Primero, debe asegurarse de que sus datos sean lo suficientemente grandes cuando trabaje con algoritmos basados en árboles como XGBoost y LightGBM, tales cambios repentinos pueden indicar un sobreajuste. (10,000 muestras al menos, regla general)
Segundo, ¿cómo es tu cardinalidad? si tiene 3-4 funciones, se esperaría que un cambio de función cause tal efecto.
Tercero, ¿cuál es su selección de hiperparámetros? Los modelos basados en árboles son muy sensibles a los cambios de los parámetros. Asegúrese de implementar cuidadosamente su ajuste de hiperparámetro.
Por último, cuando se trata de clasificación binaria; las métricas de error se vuelven realmente importantes. Puede hacer una combinación de pérdida de registro binario y error binario (XGBoost le permite elegir múltiples); también asegúrese de implementar la detención temprana eligiendo early_stopping_rounds = N en el método de tren de XGBoost, donde N es la selección de iteraciones. Con eso, su algoritmo se detendrá temprano en un punto razonable donde su pérdida se detendrá para disminuir, evitando el sobreajuste.
fuente