Eseguirò l'intero processo Naive Bayes da zero, dal momento che non mi è del tutto chiaro dove vieni impiccato.
Vogliamo trovare la probabilità che un nuovo esempio appartenga a ciascuna classe: ). Quindi calcoliamo quella probabilità per ogni classe e scegliamo la classe più probabile. Il problema è che di solito non abbiamo queste probabilità. Tuttavia, il teorema di Bayes ci consente di riscrivere quell'equazione in una forma più trattabile.P(class|feature1,feature2,...,featuren
Il Bayom 'Thereom è semplicemente o in termini di nostro problema:
P(A|B)=P(B|A)⋅P(A)P(B)
P(class|features)=P(features|class)⋅P(class)P(features)
Possiamo semplificarlo rimuovendo . Possiamo farlo perché classificheremo per ogni valore di ; sarà lo stesso ogni volta - non dipende dalla . Questo ci lascia con
P(features)P(class|features)classP(features)classP(class|features)∝P(features|class)⋅P(class)
Le probabilità precedenti, , possono essere calcolate come descritto nella domanda.P(class)
Questo lascia . Vogliamo eliminare l'enorme, e probabilmente molto scarsa, probabilità congiunta . Se ogni funzione è indipendente, allora Anche se non sono effettivamente indipendenti, possiamo supporre che lo siano (questo è il " ingenua "parte dell'ingenua Bayes). Personalmente penso che sia più facile pensarci su per variabili discrete (cioè categoriche), quindi usiamo una versione leggermente diversa del tuo esempio. Qui, ho diviso ciascuna dimensione della funzione in due variabili categoriali.P(features|class)P(feature1,feature2,...,featuren|class)P(feature1,feature2,...,featuren|class)=∏iP(featurei|class)
.
Esempio: addestramento del classifer
Per addestrare il classifer, contiamo vari sottoinsiemi di punti e li usiamo per calcolare le probabilità precedenti e condizionali.
I priori sono banali: ci sono sessanta punti in totale, quaranta in verde e venti in rosso. QuindiP(class=green)=4060=2/3 and P(class=red)=2060=1/3
Successivamente, dobbiamo calcolare le probabilità condizionali di ogni valore-funzione dato una classe. Qui ci sono due funzioni: e , ognuna delle quali accetta uno dei due valori (A o B per uno, X o Y per l'altro). Pertanto abbiamo bisogno di sapere quanto segue:feature1feature2
- P(feature1=A|class=red)
- P(feature1=B|class=red)
- P(feature1=A|class=green)
- P(feature1=B|class=green)
- P(feature2=X|class=red)
- P(feature2=Y|class=red)
- P(feature2=X|class=green)
- P(feature2=Y|class=green)
- (nel caso in cui non sia ovvio, si tratta di tutte le possibili coppie di valore-funzione e classe)
Questi sono facili da calcolare contando e dividendo anche. Ad esempio, per , osserviamo solo i punti rossi e contiamo quanti di essi si trovano nella regione 'A' per . Esistono venti punti rossi, tutti nella zona 'A', quindi . Nessuno dei punti rossi si trova nella regione B, quindi . Successivamente, facciamo lo stesso, ma consideriamo solo i punti verdi. Questo ci dà e . Ripetiamo questo processo per , per completare la tabella delle probabilità. Supponendo che abbia contato correttamente, otteniamoP(feature1=A|class=red)feature1P(feature1=A|class=red)=20/20=1P(feature1|class=red)=0/20=0P(feature1=A|class=green)=5/40=1/8P(feature1=B|class=green)=35/40=7/8feature2
- P(feature1=A|class=red)=1
- P(feature1=B|class=red)=0
- P(feature1=A|class=green)=1/8
- P(feature1=B|class=green)=7/8
- P(feature2=X|class=red)=3/10
- P(feature2=Y|class=red)=7/10
- P(feature2=X|class=green)=8/10
- P(feature2=Y|class=green)=2/10
Queste dieci probabilità (i due priori più gli otto condizionali) sono il nostro modello
Classificare un nuovo esempio
Classifichiamo il punto bianco dal tuo esempio. Si trova nella regione "A" per e nella regione "Y" per . Vogliamo trovare la probabilità che sia in ogni classe. Cominciamo con il rosso. Usando la formula sopra, sappiamo che:
Subbing nelle probabilità dalla tabella, otteniamofeature1feature2P(class=red|example)∝P(class=red)⋅P(feature1=A|class=red)⋅P(feature2=Y|class=red)
P(class=red|example)∝13⋅1⋅710=730
Facciamo lo stesso per il verde:
P(class=green|example)∝P(class=green)⋅P(feature1=A|class=green)⋅P(feature2=Y|class=green)
Sommergendo questi valori ci ottiene 0 ( ). Infine, guardiamo per vedere quale classe ci ha dato la più alta probabilità. In questo caso, è chiaramente la classe rossa, quindi è lì che assegniamo il punto.2/3⋅0⋅2/10
Appunti
Nel tuo esempio originale, le funzionalità sono continue. In tal caso, è necessario trovare un modo per assegnare P (feature = value | class) per ogni classe. Potresti quindi considerare di adattarti a una distribuzione di probabilità nota (ad esempio, un gaussiano). Durante l'allenamento, troverai la media e la varianza per ogni classe lungo ciascuna dimensione caratteristica. Per classificare un punto, dovresti trovare inserendo la media e la varianza appropriate per ogni classe. Altre distribuzioni potrebbero essere più appropriate, a seconda dei dettagli dei dati, ma un gaussiano sarebbe un discreto punto di partenza.P(feature=value|class)
Non ho familiarità con il set di dati DARPA, ma essenzialmente faresti la stessa cosa. Probabilmente finirai per calcolare qualcosa come P (attacco = VERO | servizio = dito), P (attacco = falso | servizio = dito), P (attacco = VERO | servizio = ftp), ecc. E poi combinali nel allo stesso modo dell'esempio. Come nota a margine, parte del trucco qui è trovare buone funzionalità. L'IP di origine, ad esempio, probabilmente sarà irrimediabilmente scarso - probabilmente avrai solo uno o due esempi per un dato IP. Potresti fare molto meglio se hai geolocalizzazione l'IP e usi invece "Source_in_same_building_as_dest (true / false)" o qualcosa come funzionalità.
Spero che aiuti di più. Se qualcosa necessita di chiarimenti, sarei felice di riprovare!