Przejdę przez cały proces Naive Bayes od zera, ponieważ nie jest dla mnie całkowicie jasne, gdzie się rozłączasz.
Chcemy znaleźć prawdopodobieństwo, że nowy przykład należy do każdej klasy: ). Następnie obliczamy to prawdopodobieństwo dla każdej klasy i wybieramy najbardziej prawdopodobną klasę. Problem polega na tym, że zwykle nie mamy takich prawdopodobieństw. Twierdzenie Bayesa pozwala jednak przepisać to równanie w bardziej przystępnej formie.P(class|feature1,feature2,...,featuren
Jest tam po prostu lub pod względem naszego problemu:
P(A|B)=P(B|A)⋅P(A)P(B)
P(class|features)=P(features|class)⋅P(class)P(features)
Możemy to uprościć, usuwając . Możemy to zrobić, ponieważ będziemy klasyfikować dla każdej wartości ; będą za każdym razem takie same - nie zależy to od . Pozostaje nam
P(features)P(class|features)classP(features)classP(class|features)∝P(features|class)⋅P(class)
Wcześniejsze prawdopodobieństwa, , można obliczyć zgodnie z opisem w pytaniu.P(class)
Pozostawia to . Chcemy wyeliminować ogromne, i prawdopodobnie bardzo rzadkie, wspólne prawdopodobieństwo . Jeśli każda funkcja jest niezależna, to Nawet jeśli nie są one faktycznie niezależne, możemy założyć, że są (to jest „ naiwna „część naiwnych Bayesów). Osobiście uważam, że łatwiej jest przemyśleć to w przypadku zmiennych dyskretnych (tj. Kategorialnych), więc użyjmy nieco innej wersji twojego przykładu. Tutaj podzieliłem każdy wymiar cechy na dwie zmienne jakościowe.P(features|class)P(feature1,feature2,...,featuren|class)P(feature1,feature2,...,featuren|class)=∏iP(featurei|class)
.
Przykład: szkolenie klasowego
Aby wytrenować klasę, zliczamy różne podzbiory punktów i używamy ich do obliczania prawdopodobieństw wcześniejszych i warunkowych.
Priory są trywialne: Łącznie jest sześćdziesiąt punktów, czterdzieści jest zielonych, a dwadzieścia czerwonych. ZatemP(class=green)=4060=2/3 and P(class=red)=2060=1/3
Następnie musimy obliczyć prawdopodobieństwa warunkowe każdej wartości cechy dla danej klasy. Tutaj są dwie funkcje: i , z których każda przyjmuje jedną z dwóch wartości (A lub B dla jednej, X lub Y dla drugiej). Dlatego musimy wiedzieć, co następuje: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)
- (w przypadku, gdy nie jest to oczywiste, są to wszystkie możliwe pary wartości cech i klasy)
Można je łatwo obliczyć, licząc i dzieląc. Na przykład dla patrzymy tylko na czerwone punkty i liczymy, ile z nich znajduje się w regionie „A” dla . Jest dwadzieścia czerwonych punktów, z których wszystkie znajdują się w regionie „A”, więc . Żaden z czerwonych punktów nie znajduje się w regionie B, więc . Następnie robimy to samo, ale uwzględniamy tylko zielone punkty. To daje nam i . Powtarzamy ten proces dla , aby zaokrąglić tabelę prawdopodobieństwa. Zakładając, że policzyłem poprawnie, rozumiemyP(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
Te dziesięć prawdopodobieństw (dwa priorytety plus osiem warunków) są naszym modelem
Klasyfikacja nowego przykładu
Sklasyfikujmy biały punkt z twojego przykładu. Znajduje się w regionie „A” dla i regionie „Y” dla . Chcemy znaleźć prawdopodobieństwo, że jest w każdej klasie. Zacznijmy od czerwonego. Korzystając z powyższej formuły, wiemy, że:
Subbing według prawdopodobieństwa z tabeli otrzymujemyfeature1feature2P(class=red|example)∝P(class=red)⋅P(feature1=A|class=red)⋅P(feature2=Y|class=red)
P(class=red|example)∝13⋅1⋅710=730
Następnie robimy to samo dla zielonego:
P(class=green|example)∝P(class=green)⋅P(feature1=A|class=green)⋅P(feature2=Y|class=green)
Podanie tych wartości daje nam 0 ( ). Na koniec sprawdzamy, która klasa dała nam najwyższe prawdopodobieństwo. W tym przypadku jest to wyraźnie czerwona klasa, więc tutaj przypisujemy punkt.2/3⋅0⋅2/10
Notatki
W oryginalnym przykładzie funkcje są ciągłe. W takim przypadku musisz znaleźć sposób przypisania P (funkcja = wartość | klasa) dla każdej klasy. Możesz rozważyć dopasowanie do znanego rozkładu prawdopodobieństwa (np. Gaussa). Podczas treningu znajdowałbyś średnią i wariancję dla każdej klasy wzdłuż każdego wymiaru cechy. Aby sklasyfikować punkt, znajdź , wprowadzając odpowiednią średnią i wariancję dla każdej klasy. Inne rozkłady mogą być bardziej odpowiednie, w zależności od szczegółowych danych, ale Gaussian byłby dobrym punktem wyjścia.P(feature=value|class)
Nie znam się zbytnio na zestawie danych DARPA, ale zrobiłbyś w zasadzie to samo. Prawdopodobnie skończysz obliczać coś takiego jak P (atak = PRAWDA | usługa = palec), P (atak = fałsz | usługa = palec), P (atak = PRAWDA | usługa = ftp) itp., A następnie połącz je w tak samo jak w przykładzie. Na marginesie, część sztuczki polega na wymyśleniu dobrych funkcji. Na przykład źródłowe IP będzie prawdopodobnie beznadziejnie rzadkie - prawdopodobnie będziesz mieć tylko jeden lub dwa przykłady dla danego adresu IP. Możesz zrobić znacznie lepiej, jeśli geolokalizowałeś adres IP i użyłeś zamiast tego opcji „Source_in_same_building_as_dest (prawda / fałsz)” lub coś takiego.
Mam nadzieję, że to pomoże więcej. Jeśli coś wymaga wyjaśnienia, chętnie spróbuję ponownie!