2010-07-11 9 views
7

Tengo un dataset de clase binario (0/1) con una gran inclinación hacia la clase "0" (aproximadamente 30000 vs 1500). Hay 7 funciones para cada instancia, no hay valores perdidos.¿Cómo se sobreutilizan deliberadamente los clasificadores de árboles Weka?

Cuando uso el J48 o cualquier otro clasificador de árbol, obtengo casi todas las instancias "1" mal clasificadas como "0".

Configurando el clasificador a "sin podar", estableciendo el número mínimo de instancias por hoja en 1, estableciendo el factor de confianza en 1, agregando un atributo ficticio con número de ID de instancia - todo esto no ayudó.

¡No puedo crear un modelo que sobrepase mis datos!

También probé casi todos los otros clasificadores que Weka proporciona, pero obtuve resultados similares.

El uso de IB1 obtiene el 100% de precisión (trainset en el tren) por lo que no es un problema de varias instancias con los mismos valores de características y diferentes clases.

¿Cómo puedo crear un árbol completamente sin podar? ¿O forzar a Weka a sobreajustar mis datos?

Gracias.

Actualización: De acuerdo, esto es absurdo. He usado sólo alrededor de 3100 y 1200 negativos ejemplos positivos, y este es el árbol llegué (sin podar!):

J48 unpruned tree 
------------------ 

F <= 0.90747: 1 (201.0/54.0) 
F > 0.90747: 0 (4153.0/1062.0) 

Ni que decir tiene, IB1 todavía da el 100% de precisión.

Actualización 2: No sé cómo lo eché de menos - sin podar SimpleCart funciona y le da el 100% de precisión en el tren en tren; Poda SimpleCart no está tan sesgada como J48 y tiene un índice decente positivo y negativo decente.

+0

posible pregunta relacionada: http://stackoverflow.com/ preguntas/2519997/diferentes-pesos-de-falso-positivo-y-falso-negativo-en-red-neuronal – Amro

Respuesta

2

La solución rápida y sucia es volver a muestrear. Bote todos menos 1500 de sus ejemplos positivos y entrene en un conjunto de datos equilibrado. Estoy bastante seguro de que hay un componente de remuestreo en Weka para hacer esto.

La otra solución es utilizar un clasificador con un costo variable para cada clase. Estoy bastante seguro de que libSVM te permite hacer esto y sé que Weka puede ajustar libSVM. Sin embargo, no he usado Weka desde hace un tiempo, así que no puedo ser de mucha ayuda práctica aquí.

+0

Gracias. No estoy seguro de que el remuestreo funcione, de los experimentos que hice parece que incluso en un conjunto de datos bastante equilibrado (1000 ejemplos para cada clase) J48 y otros clasificadores (excepto SimpleCart) obtienen resultados ridículos, ya sea FP o FN muy altos para la clase " 0 "o muy alto para la clase" 1 "(y la otra clase se clasifica principalmente). Con respecto a la clasificación sensible a los costos, me olvidé por completo de ella, la investigaré pronto. ¡Gracias! – Haggai

+0

El enfoque sensible a los costos funcionó. Todavía no entiendo por qué J48 sin podar no me dará el 100% de precisión en el conjunto de entrenamiento, o por qué un conjunto de datos bastante equilibrado con J48 aún produce resultados ridículos. Pero al menos ahora tengo algo con lo que trabajar. ¡Gracias! – Haggai

5

Weka contiene dos meta-clasificadores de interés:

Ellos le permite hacer cualquier algoritmo sensibles a los costes (no restringido a SVM) y para especificar una matriz de costos (penalización de los diversos errores); le daría una multa más alta por clasificar incorrectamente las instancias 1 como 0 de lo que daría por clasificar erróneamente 0 como 1.

El resultado es que el algoritmo sería entonces tratar de:

minimizar el coste de clasificación errónea esperado (en lugar de la clase más probable)

+1

Gracias, esa es exactamente la solución que he usado. – Haggai

Cuestiones relacionadas