2010-07-13 22 views
5

¿Alguien puede recomendar una implementación de clasificador de árbol de decisión, en Python o Java, que se puede usar de forma incremental?Clasificador de árbol de decisión interactiva

Todas las implementaciones que he encontrado requieren que proporciones todas las características al clasificador a la vez para obtener una clasificación. Sin embargo, en mi aplicación, tengo cientos de funciones, y algunas de ellas son funciones que pueden demorar mucho tiempo en evaluarse. Como no todas las ramas del árbol pueden usar todas las características, no tiene sentido darle al clasificador todas las características a la vez. Me gustaría que el clasificador pregunte por características, una a la vez, en el orden en que son necesarias para hacer la máxima reducción en entropía y proporcionar una clasificación final.

+0

Nota, esta es una pregunta similar: http://stackoverflow.com/questions/3411279/incremental-decision-tree-c-implementation – Cerin

Respuesta

2

Creo que no existe tal implementación, pero los árboles de decisión son tan simples de implementar que no debería tener ningún problema al escribir dicho programa por su cuenta.
Por otro lado, no creo que la idea de contar funciones sobre la marcha pueda aumentar la velocidad, porque incluso si alguna característica se usó para hacer una división previa, aún debe considerarse en el resto de ellas, por lo que para muchos registra que se recalculará muchas veces (aunque puede ahorrar memoria). Esto podría tener sentido en el caso de un bosque aleatorio, donde solo se considera un subconjunto de características al azar y limitado en cada división; aun así, la RF solo se puede utilizar como clasificador, no construirá árboles de decisión agradables e interpretables por humanos.

+0

Gracias, tenía miedo de eso. Actualmente escribí un algoritmo básico, pero no es óptimo, así que esperaba que pudiera haber algo de trabajo previo. – Cerin

2

Por lo general, este tipo de paquetes (árboles J48 en Weka en particular) le permite especificar un valor que falta en lugar de un valor de función, que será tratado con la misma C4.5 manera haría:

cuando se llega a la división de nodos por ese atributo con el valor que falta, que enviar la instancia abajo cada posible rama ponderado proporcional al número de instancias de formación que van abajo de esas ramas, con el tiempo acumular el resultado en la hoja nodos.

Por supuesto, podría tener un enfoque más agresivo y cambiar la forma en que el árbol elige los atributos para dividir durante la fase de entrenamiento. Una forma ingenua sería asignar ponderaciones a los atributos y multiplicar el criterio de división (entropía, ganancia de información, ...) por ese peso como un coeficiente de penalización, de modo que sería menos probable que se escogieran los "atributos caros" como un nodo divisor.

+0

Esto no me parece una solución práctica. Mi dominio tiene alrededor de 1 millón de funciones, pero cada ejemplo solo necesita unas pocas docenas para llegar a una clasificación correcta. Sería una locura tener que agregar 1 millón - n "valores perdidos" solo para obtener una clasificación. – Cerin

+0

@Chris S: Para un número tan grande de características, comenzaría preprocesando los datos usando alguna técnica de reducción de dimensionalidad antes de aplicar cualquier clasificador .. – Amro

0

¿Le preocupa esto durante el tiempo de entrenamiento o en el tiempo de clasificación? Como esos períodos están separados, puedes jugar trucos para evitar evaluarlos hasta que sea muy tarde si es el último. No hay truco que puedas jugar durante el tiempo de entrenamiento. Debes proporcionar todas las características en el momento del entrenamiento. Sin embargo, dado que eso puede suceder fuera de su programa, no tiene que preocuparse por el tiempo de cálculo. El entrenamiento del árbol es la parte más intensa.

Así que te sugiero que juntes todos tus datos, lo entrenes, saques el producto del entrenamiento y luego utilices la evaluación diferida en tus objetos mientras los envías al árbol. Haga que sus objetos implementen alguna interfaz para obtener valores que puedan usar el código para evaluar cosas perezosamente. Si un objeto nunca llega a un nodo que requiere un valor caro, entonces no tiene que evaluarlo.

Es posible que sus costosos cálculos no se elijan como selecciones para dividir, por lo que se elimina la necesidad de evaluarlos en el momento de la clasificación. Probablemente solo tendrá 3-5 características que son estadísticamente relevantes una vez que entrene y pode su árbol. Luego, puede optimizar solo esas funciones con el almacenamiento en caché, por lo que la clasificación es rápida.

Si quieres un entrenamiento incremental, es una bola de cera completamente diferente, y hay algoritmos para eso. Pero, no se explican muy bien, y tendrás que buscar en documentos de investigación para obtenerlos.

+0

Me preocupa esto durante el tiempo de clasificación, ya que quiero hacer la clasificación "interactiva" ". Piensa en el juego 20 preguntas. – Cerin

+0

Veinte preguntas es una aplicación de árbol de decisión clásica. Puede implementar eso con un árbol de decisión con bastante facilidad. Tal vez tenemos nuestros cables cruzados, pero cuando digo el tiempo de clasificación quiero decir que el árbol ya ha sido construido, y que estás caminando por esa estructura. El entrenamiento significa que estás construyendo el árbol. Crear un mecanismo de caminata interactivo sería fácil. Pensé que intentabas modificar la estructura del árbol durante la clasificación, lo que no es fácil de hacer. – chubbsondubs

0

Así que esto es lo que haría. Dada la respuesta a mi pregunta anterior, creo que tienes algo como lo siguiente. Parece que quieres implementar un tipo de 20 preguntas como enfoque.

Con veinte preguntas, usted tiene respuestas sí/no para que un árbol binario funcione mejor. Sin embargo, puede aplicar capas en opciones de opciones múltiples, pero el usuario elige una opción. Por lo tanto, este algoritmo supone que ha entrenado su árbol con anticipación y que ha sido creado a partir de un conjunto de datos que desea utilizar.

decir, por ejemplo que estamos tratando de hacer un diagnóstico médico para que nuestros datos podrían tener el siguiente aspecto:

Disease Name Head Ache Fever Back Pain Leg Pain Blurry Vision Hearing Loss 
Common Cold Yes   Yes No   No  No    No 
Migraine  Yes   No  No   No  Yes   No 
Herpes  No   Yes No   No  No    No 

En este ejemplo, dolor principal, fiebre, dolor de espalda, dolor de piernas, etc, son el influenciadores, y el Nombre de la enfermedad es el objetivo. Cada fila sería un diagnóstico real de un solo paciente por lo que una enfermedad podría repetirse en los datos más de una vez.

  1. Modifique un algoritmo de recorrido para comenzar desde la raíz.
  2. Si ha llegado a una hoja, dígale al usuario las posibles respuestas.
  3. Tome el influencer utilizado para dividir este nodo y preséntelo al usuario y haga la pregunta "Sí/No" (¿Tiene un dolor de cabeza?).
  4. Ir a la izquierda si el usuario responde Sí.
  5. Ir derecho si el usuario responde Nº
  6. Goto Paso 2

En los nodos hoja que tendrá que filas reales que llegaron a ese lugar para que pueda mostrar al usuario diciendo que podría tener uno de estos:

dolor de cabeza migraña Cabeza cortada

prescripción es: bla, bla, bla.

Con 1 millón de personas influyentes tomará un tiempo construir el árbol. Si quisiera reducir eso, podría ser posible usar influenciadores de múltiples valores en lugar de sí/no. Aunque es realmente difícil pensar en 1 millón de preguntas únicas sí/no, incluso para cada condición médica. Una vez que construya el árbol, puede ofrecer tantos diagnósticos como desee.

+0

Gracias por la elaboración, pero creo que ha leído mal mi pregunta. Actualmente implementé una solución, pero no es terriblemente eficiente. Lo que estoy buscando es una implementación preexistente que lo respalde fácilmente. – Cerin

0

El paquete del árbol de decisión de Python en https://pypi.python.org/pypi/DecisionTree tiene un modo interactivo para usar un árbol de decisión. No es incremental en el sentido que necesita. Sin embargo, es posible cambiar fácilmente el código en la función de operación interactiva para que pueda ver los resultados de forma incremental.

Cuestiones relacionadas