Vou percorrer todo o processo do Naive Bayes do zero, já que não está totalmente claro para mim onde você está sendo desligado.
Queremos encontrar a probabilidade de um novo exemplo pertencer a cada classe: ). Em seguida, calculamos essa probabilidade para cada classe e escolhemos a classe mais provável. O problema é que geralmente não temos essas probabilidades. No entanto, o Teorema de Bayes nos permite reescrever essa equação de uma forma mais tratável.P(class|feature1,feature2,...,featuren
O ponto de partida de Bayes é simplesmente ou em termos de nosso problema:
P(A|B)=P(B|A)⋅P(A)P(B)
P(class|features)=P(features|class)⋅P(class)P(features)
Podemos simplificar isso removendo . Podemos fazer isso porque vamos classificar para cada valor da ; será o mesmo - não depende da . Isso nos deixa com
P(features)P(class|features)classP(features)classP(class|features)∝P(features|class)⋅P(class)
As probabilidades anteriores, , podem ser calculadas conforme descrito em sua pergunta.P(class)
Isso deixa . Queremos eliminar a probabilidade conjunta maciça e provavelmente muito esparsa . Se cada recurso for independente, Mesmo que não sejam realmente independentes, podemos assumir que são (esse é o " ingênuo "parte de ingênuo Bayes). Pessoalmente, acho que é mais fácil pensar nisso para variáveis discretas (ou seja, categóricas), então vamos usar uma versão ligeiramente diferente do seu exemplo. Aqui, dividi cada dimensão do recurso em duas variáveis categóricas.P(features|class)P(feature1,feature2,...,featuren|class)P(feature1,feature2,...,featuren|class)=∏iP(featurei|class)
.
Exemplo: Treinando o classifer
Para treinar o classificador, contamos vários subconjuntos de pontos e os usamos para calcular as probabilidades anteriores e condicionais.
Os anteriores são triviais: existem sessenta pontos no total, quarenta são verdes e vinte são vermelhos. Assim,P(class=green)=4060=2/3 and P(class=red)=2060=1/3
Em seguida, temos que calcular as probabilidades condicionais de cada valor de recurso, dada uma classe. Aqui, existem dois recursos: e , cada um com um de dois valores (A ou B para um, X ou Y para o outro). Portanto, precisamos saber o seguinte: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)
- (caso isso não seja óbvio, são todos os pares possíveis de valor e classe de recurso)
Estes são fáceis de calcular contando e dividindo também. Por exemplo, para , examinamos apenas os pontos vermelhos e contamos quantos deles estão na região 'A' para o . Existem vinte pontos vermelhos, todos na região 'A', então . Nenhum dos pontos vermelhos está na região B, então . Em seguida, fazemos o mesmo, mas consideramos apenas os pontos verdes. Isso nos dá e . Repetimos esse processo para o , para arredondar a tabela de probabilidades. Supondo que contei corretamente, obtemosP(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
Essas dez probabilidades (os dois anteriores e as oito condicionais) são o nosso modelo
Classificando um novo exemplo
Vamos classificar o ponto branco do seu exemplo. Está na região "A" para o e na região "Y" para o . Queremos encontrar a probabilidade de que esteja em cada classe. Vamos começar com vermelho. Usando a fórmula anterior, sabemos que:
Subbing nas probabilidades da tabela, obtemosfeature1feature2P(class=red|example)∝P(class=red)⋅P(feature1=A|class=red)⋅P(feature2=Y|class=red)
P(class=red|example)∝13⋅1⋅710=730
Em seguida, fazemos o mesmo com o verde:
P(class=green|example)∝P(class=green)⋅P(feature1=A|class=green)⋅P(feature2=Y|class=green)
Sub-agrupar esses valores nos leva a 0 ( ). Finalmente, procuramos ver qual classe nos deu a maior probabilidade. Nesse caso, é claramente a classe vermelha, então é aí que atribuímos o ponto.2/3⋅0⋅2/10
Notas
No seu exemplo original, os recursos são contínuos. Nesse caso, você precisa encontrar uma maneira de atribuir P (recurso = valor | classe) a cada classe. Você pode considerar ajustar-se a uma distribuição de probabilidade conhecida (por exemplo, um gaussiano). Durante o treinamento, você encontrará a média e a variação de cada classe ao longo de cada dimensão de recurso. Para classificar um ponto, você encontra inserindo a média e a variação apropriadas para cada classe. Outras distribuições podem ser mais apropriadas, dependendo dos detalhes de seus dados, mas um gaussiano seria um ponto de partida decente.P(feature=value|class)
Não estou muito familiarizado com o conjunto de dados DARPA, mas você faria essencialmente a mesma coisa. Você provavelmente acabará computando algo como P (ataque = VERDADEIRO | serviço = dedo), P (ataque = falso | serviço = dedo), P (ataque = VERDADEIRO | serviço = ftp), etc. e depois combiná-los no mesma maneira que o exemplo. Como uma observação lateral, parte do truque aqui é apresentar bons recursos. O IP de origem, por exemplo, provavelmente será irremediavelmente escasso - você provavelmente terá apenas um ou dois exemplos para um determinado IP. Você pode fazer muito melhor se você geolocalizou o IP e usa "Source_in_same_building_as_dest (true / false)" ou algo como um recurso.
Espero que ajude mais. Se alguma coisa precisar de esclarecimentos, ficarei feliz em tentar novamente!