Je vais parcourir tout le processus Naive Bayes à partir de zéro, car je ne vois pas très bien où vous allez être suspendu.
Nous voulons trouver la probabilité qu'un nouvel exemple appartienne à chaque classe: ). Nous calculons ensuite cette probabilité pour chaque classe et choisissons la classe la plus probable. Le problème est que nous n'avons généralement pas ces probabilités. Cependant, le théorème de Bayes nous permet de réécrire cette équation sous une forme plus facile à gérer.P(class|feature1,feature2,...,featuren
Le statut de Bayes est simplement ou en termes de notre problème:
P(A|B)=P(B|A)⋅P(A)P(B)
P(class|features)=P(features|class)⋅P(class)P(features)
Nous pouvons simplifier cela en supprimant . Nous pouvons faire cela parce que nous allons classer pour chaque valeur de ; sera la même à chaque fois - cela ne dépend pas de la . Cela nous laisse avec
P(features)P(class|features)classP(features)classP(class|features)∝P(features|class)⋅P(class)
Les probabilités antérieures, , peuvent être calculées comme décrit dans votre question.P(class)
Cela laisse . Nous voulons éliminer la probabilité commune massive (et probablement très . Si chaque fonctionnalité est indépendante, alors Même si elles ne sont pas réellement indépendantes, nous pouvons supposer qu'elles le sont (c'est le " naïf "partie de naïf Bayes). Personnellement, j'estime qu'il est plus facile de penser à cela pour des variables discrètes (c'est-à-dire catégoriques), aussi utilisons une version légèrement différente de votre exemple. Ici, j'ai divisé chaque dimension d'objet en deux variables catégoriques.P(features|class)P(feature1,feature2,...,featuren|class)P(feature1,feature2,...,featuren|class)=∏iP(featurei|class)
.
Exemple: Former le classificateur
Pour former le classificateur, nous comptons divers sous-ensembles de points et les utilisons pour calculer les probabilités antérieures et conditionnelles.
Les a priori sont triviaux: il y a soixante points au total, quarante sont verts et vingt rouges. Ainsi,P(class=green)=4060=2/3 and P(class=red)=2060=1/3
Ensuite, nous devons calculer les probabilités conditionnelles de chaque valeur de fonction pour une classe. Ici, il existe deux fonctionnalités: et , chacune prenant l'une des deux valeurs (A ou B pour l'une, X ou Y pour l'autre). Nous devons donc connaître les éléments suivants: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)
- (au cas où ce ne serait pas évident, c'est toutes les paires possibles d'entité-valeur et de classe)
Celles-ci sont faciles à calculer en comptant et en divisant aussi. Par exemple, pour , nous regardons uniquement les points rouges et comptons leur nombre dans la région 'A' pour . Il y a vingt points rouges, qui sont tous dans la région 'A', donc . Aucun des points rouges ne se trouve dans la région B, donc . Ensuite, nous faisons la même chose, mais considérons seulement les points verts. Cela nous donne et . Nous répétons ce processus pour , pour la table de probabilité. En supposant que j'ai compté correctement, nous obtenonsP(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
Ces dix probabilités (les deux a priori et les huit conditions) sont notre modèle
Classer un nouvel exemple
Classons le point blanc de votre exemple. C'est dans la région "A" pour et la région "Y" pour . Nous voulons trouver la probabilité que cela soit dans chaque classe. Commençons par le rouge. En utilisant la formule ci-dessus, nous savons que:
Subbing dans les probabilités de la table, nous obtenonsfeature1feature2P(class=red|example)∝P(class=red)⋅P(feature1=A|class=red)⋅P(feature2=Y|class=red)
P(class=red|example)∝13⋅1⋅710=730
On fait de même pour le vert:
P(class=green|example)∝P(class=green)⋅P(feature1=A|class=green)⋅P(feature2=Y|class=green)
La sous-utilisation de ces valeurs nous donne 0 ( ). Enfin, nous examinons quelle classe nous a donné la probabilité la plus élevée. Dans ce cas, il s’agit clairement de la classe rouge, c’est pourquoi nous assignons le point.2/3⋅0⋅2/10
Remarques
Dans votre exemple d'origine, les fonctionnalités sont continues. Dans ce cas, vous devez trouver un moyen d’affecter P (feature = value | class) à chaque classe. Vous pourriez alors envisager de vous adapter à une distribution de probabilité connue (par exemple une gaussienne). Pendant la formation, vous trouverez la moyenne et la variance pour chaque classe le long de chaque dimension de la fonction. Pour classer un point, vous devez trouver en insérant la moyenne et la variance appropriées pour chaque classe. D'autres distributions pourraient être plus appropriées, en fonction des particularités de vos données, mais un gaussien serait un bon point de départ.P(feature=value|class)
Je ne connais pas trop le jeu de données DARPA, mais vous feriez essentiellement la même chose. Vous finirez probablement par calculer quelque chose comme P (attaque = VRAI | service = doigt), P (attaque = faux | service = doigt), P (attaque = VRAI | service = ftp), puis vous les combinerez dans le même manière que l'exemple. En remarque, une partie de l'astuce ici consiste à proposer de bonnes fonctionnalités. L'IP source, par exemple, va probablement être désespérément maigre - vous n'aurez probablement qu'un ou deux exemples pour une IP donnée. Vous feriez beaucoup mieux si vous géolocalisez l'adresse IP et utilisez "Source_in_same_building_as_dest (true / false)" ou quelque chose comme fonctionnalité.
J'espère que ça aide plus. Si quelque chose nécessite une clarification, je serais heureux d'essayer à nouveau!