Processing math: 100%

10 votos

Utilizando SMOTE la clasificación del conjunto de validación es mala

Quiero hacer la clasificación con 2 clases. Cuando clasifico sin smote Lo entiendo:

Precision       Recall            f-1
0,640950987     0,815410434       0,714925374

Cuando uso smote (sobremuestreo de la clase minoritaria en 200% y k = 5)

Precision        Recall           f-1
0,831024643      0,783434343      0,804894232

Como puede ver, esto funciona bien.

Sin embargo, cuando pruebo este modelo entrenado en los datos de validación (que no tienen datos sintéticos)

Precision        Recall           f-1
0,644335755      0,799044453      0,709791138

que es horrible. Utilicé un bosque de decisión aleatorio para clasificar.

¿Alguien tiene idea de por qué ocurre esto? Cualquier consejo útil en relación con las pruebas adicionales que puedo tratar de obtener más información son bienvenidos también.

Más información: No toco la clase mayoritaria. Trabajo en Python con scikit-learn y este algoritmo por "smote".

La matriz de confusión en los datos de prueba (que tiene datos sintéticos): enter image description here

La matriz de confusión en los datos de validación con el mismo modelo (datos reales, que no fueron generados por SMOTE)

enter image description here


Editar: He leído que el problema radica posiblemente en el hecho de que se crearon enlaces Tomek. Por lo tanto, escribí algún código para eliminar los enlaces de Tomek. Aunque esto no mejora los resultados de la clasificación.

Edición 2: He leído que el problema posiblemente radica en que hay demasiado solapamiento. Una solución para esto es un algoritmo de generación de muestras sintéticas más inteligente. Por lo tanto, he implementado

ADASYN: Enfoque de muestreo sintético adaptativo para el aprendizaje desequilibrado

Mi aplicación se puede encontrar aquí . Se desempeñó peor que smote.

12voto

John Richardson Puntos 1197

Si sobremuestrea los datos de entrenamiento para cambiar las frecuencias de clase relativas en el conjunto de entrenamiento, implícitamente le está diciendo al clasificador que espere que el conjunto de validación tenga esas mismas frecuencias de clase. Como las frecuencias de clase influyen en el límite de decisión, si las frecuencias de clase del conjunto de validación son diferentes, el límite de clasificación será erróneo y el rendimiento no será óptimo.

Ahora bien, es cierto que para algunos clasificadores, tener clases desequilibradas puede provocar un mal rendimiento, y el remuestreo de los datos puede ayudar a corregirlo. Sin embargo, si se sobremuestrea demasiado la clase minoritaria, se corregirá en exceso y el rendimiento no será óptimo porque la diferencia de frecuencias de clase entre los conjuntos de entrenamiento y validación es mayor que la necesaria para corregir el problema de desequilibrio.

Mi receta sería entonces utilizar la validación cruzada para elegir el grado de sobremuestreo necesario para sólo compensar el "problema de desequilibrio de clases" experimentado por su clasificador, pero no más. Sin embargo, hay que tener en cuenta que esto supone un parámetro adicional que hay que ajustar, lo que conlleva un mayor gasto computacional y una mayor probabilidad de sobreajuste en la selección del modelo (si el número total de parámetros ajustables no es despreciable).

0 votos

Este parámetro extra del que hablas, ¿es el % que uso? (en mi caso 200%). No puedo elegir uno más pequeño, tienen que ser en pasos de 100. Aunque si entiendo bien, si hago un conjunto de validaciones que esté equilibrado como el conjunto de entrenamiento, ¿dará mejores resultados?

0 votos

Sí, el %age era efectivamente el parámetro al que me refería; es una pena que el software sólo permita cambiarlo en pasos de 100. Algunos algoritmos de aprendizaje automático (por ejemplo, el SVM) permiten ponderar los patrones positivos y negativos de manera diferente (para el SVM tienen un valor diferente del parámetro C para cada clase). Esto es directamente equivalente a SMOTE en el caso de la SVM, por lo que puede ser otra forma de sortear el problema.

0 votos

He probado la solución SVM. En sci-kit learn es posible establecer los pesos inversamente proporcionales a las frecuencias de clase (automáticamente). Aunque esto da muy malos resultados ( para kernel lineal, polinómico, rbf y sigmoide)

2voto

Luke Puntos 92

¿Ha considerado utilizar la implementación en R de los bosques aleatorios a través de Rpy? Tiene una opción que te permite elegir tanto el tamaño de la muestra con la que se entrena cada árbol como la fracción que cae en cada clase. He descubierto que es la forma más eficaz de tratar el desequilibrio cuando se utiliza el bosque aleatorio.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X