Con la clase no balanceada, ¿tengo que usar bajo muestreo en mis conjuntos de datos de validación / prueba?

13

Soy un principiante en el aprendizaje automático y me enfrento a una situación. Estoy trabajando en un problema de oferta en tiempo real, con el conjunto de datos IPinYou y estoy tratando de hacer una predicción de clics.

El hecho es que, como ya sabrá, el conjunto de datos está muy desequilibrado: alrededor de 1300 ejemplos negativos (sin clic) para 1 ejemplo positivo (clic).

Esto es lo que hago:

  1. Cargar los datos
  2. Divida el conjunto de datos en 3 conjuntos de datos: A = Entrenamiento (60%) B = Validación (20%) C = Prueba (20%)
  3. Para cada conjunto de datos (A, B, C), realice un submuestreo en cada clase negativa para tener una relación de 5 (5 ejemplos negativos para 1 ejemplo positivo). Esto me da 3 nuevos conjuntos de datos que están más equilibrados: A 'B' C '

Luego entreno mi modelo con el conjunto de datos A 'y la regresión logística.

Mi pregunta es:

  1. ¿Qué conjunto de datos debo usar para la validación? B o B '?

  2. ¿Qué conjunto de datos debo usar para las pruebas? C o C '

  3. ¿Qué métricas son las más relevantes para evaluar mi modelo? F1Score parece ser una métrica bien utilizada. Pero aquí, debido a la clase desequilibrada (si uso los conjuntos de datos B y C), la precisión es baja (por debajo de 0.20) y el F1Score está muy influenciado por la baja memoria / precisión. ¿Sería más preciso usar aucPR o aucROC?

  4. Si quiero trazar la curva de aprendizaje, ¿qué métricas debo usar? (sabiendo que el% de error no es relevante si uso el conjunto de datos B 'para validar)

Gracias de antemano por tu tiempo !

Saludos.

jmvllt
fuente

Respuestas:

9

Gran pregunta ... Aquí hay algunas respuestas específicas a sus preguntas numeradas:

1)Debería realizar una validación cruzada en B, no en B`. De lo contrario, no sabrá qué tan bien está funcionando su equilibrio de clase. No estaría de más hacer una validación cruzada tanto en B como en B` y será útil según la respuesta a 4 a continuación.

2) Debe probar tanto en C como en C` en base a 4 a continuación.

3)Me quedaría con F1 y podría ser útil usar ROC-AUC y esto proporciona un buen control de cordura. Ambos tienden a ser útiles con clases desequilibradas.

4)Esto se pone realmente complicado. El problema con esto es que el mejor método requiere que reinterpretes el aspecto de las curvas de aprendizaje o que utilices los conjuntos de datos re-muestreados y originales.

La interpretación clásica de las curvas de aprendizaje es:

  • Sobreajuste : las líneas no se unen del todo;
  • Underfit : las líneas se unen pero con un puntaje de F1 demasiado bajo;
  • Justo a la derecha : las líneas se unen con un puntaje razonable de F1.

Ahora, si estás entrenando en A` y probando en C, las líneas nunca se unirán por completo. Si está entrenando en A` y probando en C`, los resultados no serán significativos en el contexto del problema original. Entonces, ¿Qué haces?

La respuesta es entrenar en A` y probar en B`, pero también probar en B. Obtener el puntaje F1 para B` donde quieres que esté, luego verifica el puntaje F1 para B. Luego haz tu prueba y genera curvas de aprendizaje para C. Las curvas nunca se unirán, pero tendrá una idea del sesgo aceptable ... es la diferencia entre F1 (B) y F1 (B`).

Ahora, la nueva interpretación de sus curvas de aprendizaje es:

  • Sobreajuste : las líneas no se juntan y están más separadas que F1 (B`) -F1 (B);
  • Underfit : las líneas no se unen, pero la diferencia es menor que F1 (B`) -F1 (B) y la puntuación F1 (C) está por debajo de F1 (B);
  • Justo a la derecha : las líneas no se unen, pero la diferencia es menor que F1 (B`) -F1 (B) con una puntuación F1 (C) similar a F1 (B).

General : sugiero enérgicamente que para las clases desequilibradas, primero intente ajustar los pesos de su clase en su algoritmo de aprendizaje en lugar de sobre / submuestreo, ya que evita todo el rigor moral que hemos descrito anteriormente. Es muy fácil en bibliotecas como scikit-learn y código bastante fácil de manejar en cualquier cosa que use una función sigmoide o un voto mayoritario.

¡Espero que esto ayude!

AN6U5
fuente
Muchas gracias @ AN605. Que amable de tu parte ! Tengo algunas preguntas: para el 4) - Cuando dices "entrenar en A 'y probar en B'", ¿quieres decir validar? - "generar curvas de aprendizaje para C" y "La puntuación F1 (C) está por debajo / es similar a F1 (B)". Pensé que, para la curva de aprendizaje, teníamos que trazar la métrica de error para el conjunto de entrenamiento (A o A 'aquí) y la métrica de error solo para el conjunto de validación (B o B'). ¿No estás "validando" en C aquí?
jmvllt
Acerca del uso de los "pesos de clase", corrígeme si me equivoco (solo he echado un vistazo rápido al respecto), pero este truco implica "modificar" la función de costo agregando un coeficiente / peso "k" delante del clase desequilibrada, ¿verdad? : 􏲏 Costo (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) De esa manera, el algoritmo debería considerar una clasificación errónea de la clase positiva como más importante. Pero la cosa es que "tengo que" usar Apache Spark y MLlib para construir mi modelo completo. Y no estoy seguro de que pueda modificar fácilmente mi función de costo con chispa. De todos modos, gracias por su time!
jmvllt
5

Para 1)y 2)quieres

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

Entonces, para esos conjuntos de datos, no debería necesitar equilibrar las clases.

También puede intentar usar ponderaciones de clase en lugar de submuestreo / sobremuestreo, ya que esto se encarga de esta decisión por usted.

Por 3)lo más probable desea optimizar el uso de cualquier métrica se le califica en (si se trata de una competición). Pero si eso no es una consideración, todos esos modelos son buenas opciones. F1 puede verse influenciado por la baja precisión, pero desea que se capture. Es precisamente cuando los modelos ingenuos (como adivinar la clase mayoritaria) pueden obtener buenos puntajes según algunas métricas que puntajes como F1 son relevantes.

En cuanto a que 4)no hay nada de malo en mostrar cualquier métrica que termine optimizando.

jamesmf
fuente
Hola @jamesmf, gracias por esa respuesta genial. Para el F1Score, el problema que tuve es que me gustaría centrarme más en eliminar el Falso Positivo más que el Falso Negativo. ¿Sería correcto agregar un "peso" diferente para FP y FN en la computación de precisión y recuperación?
jmvllt
Eso tiene sentido para mí. También su descripción de ponderación clase es correcta, y yo no lo veo implementado en MLIB, pero podría valer la pena una solicitud de función
jamesmf
Ok, gracias james! Actualmente estoy tratando de hacerlo por mí mismo ampliando la clase LogisticGradient y sobrescribiendo el método de cálculo. Le haré saber si esto me da buenos resultados. Tenga un buen día.
jmvllt