High Recall: baja precisión para el conjunto de datos no balanceado

11

Actualmente me encuentro con algunos problemas al analizar un conjunto de datos de tweets con máquinas de vectores de soporte. El problema es que tengo un conjunto de entrenamiento de clase binaria desequilibrado (5: 2); que se espera que sea proporcional a la distribución de clase real. Al predecir, obtengo una precisión baja (0,47) para la clase minoritaria en el conjunto de validación; recordar es 0.88. Traté de usar varios métodos de sobremuestreo y submuestreo (realizados en el conjunto de entrenamiento) que no mejoraron la precisión ya que el conjunto de validación también está desequilibrado para reflejar la distribución de la clase real. También implementé diferentes costos en la máquina de vectores de soporte, lo que ayudó. Ahora parece que ya no puedo mejorar mi rendimiento.

¿Alguien de ustedes tiene algún consejo sobre lo que podría hacer para mejorar mi precisión sin dañar mi recuerdo? Además, ¿alguien tiene idea de por qué obtengo más falsos positivos que falsos negativos (positivo es la clase minoritaria)?

Filippo Scopel
fuente
3
Al menos parte del problema es evaluar el modelo sobre la base de una regla de puntuación incorrecta.
Sycorax dice Reinstate Monica
Mediante "métodos de sobremuestreo y submuestreo", ¿ha probado SMOTE (Técnica de sobremuestreo de minorías sintéticas)? Desde mi experiencia, mejoró mi tasa de clasificación de la clase minoritaria para un conjunto de datos desequilibrado 300: 1.
Matthew Lau
Hola Matthew, gracias por tu respuesta. Probé varios métodos de sobremuestreo, submuestreo e incluso de ensamblaje, incluyendo todo tipo de técnicas SMOTE.
Filippo Scopel
2
Dado que está utilizando scikit, intente árboles impulsados ​​por gradiente en sus datos. Probablemente obtendrá mejores AUC de recuperación de precisión desde el primer momento. Los SVC, como usted señala, no son realmente prácticos para nada más que conjuntos de datos muy pequeños.
rinspy
1
Hola filippo Actualmente estoy lidiando, diría, exactamente el mismo problema que usted describe :-) Probé todas las cosas habituales (sobremuestreo / submuestreo, SMOTE, peso de clase) e incluso probé varios alumnos diferentes (SVM, Random Forest, Redes neuronales completamente conectadas), pero el efecto es el mismo en todas partes: alta recuperación de la clase minoritaria después de aplicar SMOTE o peso de clase, pero muy baja precisión. ¿Al final encontraste una solución?
u_b

Respuestas:

6

¿Alguien tiene idea de por qué obtengo más falsos positivos que falsos negativos (positivo es la clase minoritaria)? ¡Gracias de antemano por tu ayuda!

Porque positivo es la clase minoritaria. Hay muchos ejemplos negativos que podrían convertirse en falsos positivos. Por el contrario, hay menos ejemplos positivos que podrían convertirse en falsos negativos.

Recordemos que Recordar = Sensibilidad =TPAGS(TPAGS+Fnorte)

La sensibilidad (tasa positiva verdadera) está relacionada con la tasa positiva falsa (especificidad 1) como se visualiza mediante una curva ROC. En un extremo, llamas a cada ejemplo positivo y tienes una sensibilidad del 100% con un FPR del 100%. En otro, no llama a ningún ejemplo positivo y tiene una sensibilidad del 0% con un 0% de FPR. Cuando la clase positiva es la minoría, incluso un FPR relativamente pequeño (que puede tener porque tiene un alto recuerdo = sensibilidad = TPR) terminará causando una gran cantidad de FP (porque hay tantos ejemplos negativos).

Ya que

Precisión =TPAGS(TPAGS+FPAGS)

Incluso con un FPR relativamente bajo, el FP abrumará al TP si el número de ejemplos negativos es mucho mayor.

Alternativamente,

Clasificador positivo: C+

Ejemplo positivo: O+

Precisión = PAGS(O+El |C+)=PAGS(C+El |O+)PAGS(O+)PAGS(C+)

P (O +) es bajo cuando la clase positiva es pequeña.

¿Alguien de ustedes tiene algún consejo sobre lo que podría hacer para mejorar mi precisión sin dañar mi recuerdo?

Como mencionó @rinspy, GBC funciona bien en mi experiencia. Sin embargo, será más lento que SVC con un núcleo lineal, pero puede hacer árboles muy poco profundos para acelerarlo. Además, más funciones o más observaciones podrían ayudar (por ejemplo, puede haber alguna característica actualmente no analizada que siempre se establece en algún valor en todos sus FP actuales).

También podría valer la pena trazar curvas ROC y curvas de calibración. Podría darse el caso de que, aunque el clasificador tenga poca precisión, podría conducir a una estimación de probabilidad muy útil. Por ejemplo, solo saber que un disco duro podría tener una probabilidad 500 veces mayor de fallar, aunque la probabilidad absoluta es bastante pequeña, podría ser información importante.

Además, una baja precisión significa esencialmente que el clasificador devuelve muchos falsos positivos. Sin embargo, esto podría no ser tan malo si un falso positivo es barato.

usuario0
fuente
2

Métodos para probar:

Submuestreo:

Sugiero usar técnicas de muestreo bajo y luego entrenar a su clasificador.

El aprendizaje desequilibrado proporciona una API de estilo de aprendizaje scikit para el conjunto de datos desequilibrados y debería ser un buen punto de partida para probar y algoritmos para probar.

Biblioteca : https://imbalanced-learn.readthedocs.io/en/stable/

SVM basado en rango:

Esto ha demostrado que mejora el retiro del mercado de los sistemas de alta precisión y Google lo utiliza para detectar malos anuncios. Recomiendo probarlo.

Documento de referencia para SVM:

https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37195.pdf

Vibhu Jawa
fuente
1

El enfoque estándar sería ponderar su error en función de la frecuencia de la clase. Por ejemplo, si lo estaba haciendo en Python con sklearn:

model = sklearn.svm.SVC(C=1.0, kernel='linear', class_weight='balanced')
model.fit(X, y)
mprat
fuente
Hola mprat, gracias por tu respuesta. Ya usé class_weight = balanceado.
Filippo Scopel