2010-07-13 7 views
5

Qualcuno può raccomandare l'implementazione di un classificatore ad albero decisionale, in Python o Java, che può essere utilizzato in modo incrementale?Classificatore di albero decisionale interattivo

Tutte le implementazioni che ho trovato richiedono di fornire tutte le funzionalità al classificatore contemporaneamente per ottenere una classificazione. Tuttavia, nella mia applicazione, ho centinaia di funzionalità e alcune delle funzioni sono funzioni che possono richiedere molto tempo per essere valutate. Poiché non tutti i rami dell'albero possono utilizzare tutte le funzionalità, non ha senso fornire al classificatore tutte le funzionalità contemporaneamente. Mi piacerebbe che il classificatore su chiedesse le funzioni, una alla volta, nell'ordine in cui sono necessarie per ottenere la massima riduzione in entropia e fornire una classificazione finale.

+0

Nota, questa è una domanda simile: http://stackoverflow.com/questions/3411279/incremental-decision-tree-c-implementation – Cerin

risposta

2

Credo non ci sia una tale implementazione, ma gli alberi decisionali sono così semplici da implementare che non dovresti avere alcun problema con la scrittura di tale programma da solo.
D'altra parte non penso che l'idea di contare le funzionalità al volo possa aumentare la velocità, perché anche se alcune funzionalità sono state utilizzate per effettuare una precedente suddivisione, devono comunque essere considerate sul resto di esse, quindi per molti registra che verrebbe ricalcolata molte volte (tuttavia potrebbe risparmiare memoria). Questo potrebbe avere senso in caso di foresta casuale, dove solo un sottoinsieme casuale e limitato di caratteristiche è considerato su ogni divisione - ancora RF è utilizzabile solo come classificatore, non ti costruirà alberi decisionali belli, interpretabili dall'uomo.

+0

Grazie, ne avevo paura. Al momento ho scritto un algoritmo di base, ma non è ottimale, quindi speravo che ci potesse essere un lavoro preliminare. – Cerin

2

Di solito tali pacchetti (alberi J48 in Weka in particolare) consente di specificare un valore mancante al posto di un valore di funzione, che saranno trattati con lo stesso algoritmo C4.5 modo avrebbe fatto:

quando si raggiunge la scissione nodo che attributo con valore mancante, abbiamo inviare l'istanza giù ogni possibile ramo ponderato proporzionale al numero di istanze di formazione e si giù quei rami, eventualmente accumulando il risultato al foglio nodi.

Ovviamente si potrebbe avere un approccio più aggressivo e cambiare il modo in cui l'albero sceglie gli attributi da dividere durante la fase di addestramento. Un modo ingenuo sarebbe assegnare pesi agli attributi e moltiplicare il criterio di scissione (entropia, guadagno di informazioni, ..) per quel peso come coefficiente di penalità, in modo che gli "attributi costosi" avrebbero meno probabilità di essere scelti come nodo di divisione.

+0

Questo non mi sembra una soluzione pratica. Il mio dominio ha circa 1 milione di funzionalità, ma a ogni esempio potrebbero essere necessarie poche decine di volte per ottenere una classificazione corretta. Sarebbe assurdo dover aggiungere 1 milione - n "valori mancanti" solo per ottenere una classificazione. – Cerin

+0

@Chris S: per un numero così elevato di funzionalità, inizierei preelaborando i dati utilizzando una tecnica di riduzione della dimensionalità prima di applicare qualsiasi classificatore. – Amro

0

Sei preoccupato per questo durante il tempo di allenamento o al momento della classificazione? Dato che questi periodi sono separati, puoi giocare dei trucchi per evitare di valutarlo finché non è molto tardi, se è il dopo. Non ci sono scherzi che puoi giocare durante il tempo di allenamento. Devi fornire tutte le funzionalità al momento della formazione. Tuttavia, poiché ciò può accadere al di fuori del tuo programma, non devi preoccuparti del tempo di calcolo. Allenare l'albero è la parte più intensa.

Quindi suggerirei di riunire tutti i dati, addestrarli, prendere il prodotto dall'allenamento, quindi usare la valutazione pigra nei vostri oggetti quando li mandate giù dall'albero. Invita i tuoi oggetti a implementare un'interfaccia per ottenere valori che puoi usare come codice per valutare le cose. Se un oggetto non colpisce mai un nodo che richiede un valore costoso, non è necessario valutarlo.

I vostri calcoli costosi potrebbero non essere scelti come scelte da suddividere in modo da eliminare la necessità di valutarli al momento della classificazione. Probabilmente avrai solo 3-5 funzionalità statisticamente rilevanti una volta allenato e potato il tuo albero. Quindi è possibile ottimizzare solo quelle funzionalità con il caching e tale classificazione è veloce.

Se si desidera un allenamento incrementale che è un tutto un altro pallone di cera, e ci sono algoritmi per questo. Ma, non sono spiegate molto bene, e dovrete scavare nei documenti di ricerca per ottenerli.

+0

Sono preoccupato per questo durante il tempo di classificazione, poiché voglio rendere la classificazione "interattiva ". Pensa al gioco 20 domande. – Cerin

+0

Venti domande sono una classica applicazione per le decisioni. Puoi implementarlo con un albero decisionale abbastanza facilmente. Forse abbiamo i nostri fili incrociati, ma quando dico tempo di classificazione intendo che l'albero è già stato costruito, e tu stai semplicemente camminando su quella struttura. Allenamento significa che stai costruendo l'albero. Creare un meccanismo interattivo per camminare sarebbe facile. Ho pensato che stavi cercando di modificare la struttura ad albero durante la classificazione che non è facile da fare. – chubbsondubs

0

Quindi ecco cosa farei. Data la risposta alla mia domanda precedente, penso che tu abbia qualcosa di simile al seguente. Sembra che tu voglia implementare una sorta di 20 domande come approccio.

Con venti domande hai sì/no risposte quindi un binario funziona meglio. Tuttavia, è possibile eseguire il layer in più opzioni di scelta, ma l'utente sceglie una scelta. Quindi questo algoritmo presuppone che tu abbia addestrato il tuo albero in anticipo e che sia stato costruito da un set di dati che desideri utilizzare.

Dire per esempio che stiamo cercando di fare una diagnosi medica così i nostri dati potrebbero essere simile al seguente:

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 

In questo esempio, mal di testa, febbre, mal di schiena, Leg Pain, ecc sono la influencer e il nome della malattia è l'obiettivo. Ogni riga sarebbe una diagnosi reale di un singolo paziente, quindi una malattia potrebbe essere ripetuta nei dati più di una volta.

  1. Modificare un algoritmo di passeggiata per l'avvio nella radice.
  2. Se hai raggiunto una foglia, comunica all'utente le potenziali risposte.
  3. Prendere l'influenza per dividere questo nodo e presentarlo all'utente e chiedere la domanda "Sì/No" (Avete un mal di testa).
  4. Andare a sinistra se l'utente risponde Sì.
  5. Vai a destra se l'utente risponde no
  6. Goto Fase 2

Nei nodi foglia dovrete righe effettive che lo hanno fatto in quella posizione in modo da poter visualizzare all'utente voi dicendo potrebbe avere uno di questi:

mal di testa emicrania Testa Tagliata

prescrizione è: bla bla bla.

Con 1 milione di influenzatori ci vorrà un po 'per costruire l'albero. Se si volesse abbassare il valore, potrebbe essere possibile utilizzare influencer multivalore invece di sì/no. Anche se è davvero difficile pensare a 1 milione di domande sì/no uniche, anche per ogni condizione medica. Una volta costruito l'albero, può offrire tutte le diagnosi che vuoi.

+0

Grazie per l'elaborazione, ma penso che abbiate interpretato male la mia domanda. Al momento ho implementato una soluzione, ma non è terribilmente efficiente. Quello che sto cercando è un'implementazione preesistente che potrebbe facilmente supportare questo. – Cerin

0

Il pacchetto dell'albero decisionale Python a https://pypi.python.org/pypi/DecisionTree dispone di una modalità interattiva per l'utilizzo di un albero decisionale. Non è incrementale nel senso in cui ne hai bisogno. Tuttavia, potrebbe essere possibile modificare facilmente il codice nella funzione per l'operazione interattiva per consentire all'utente di vedere i risultati in modo incrementale.