[PYTHON] Les débutants en apprentissage automatique tentent de contacter Naive Bayes (2) - Mise en œuvre

Cette page

La dernière fois, j'ai expliqué la théorie de Naive Bayes (formule mathématique) dans Les débutants en apprentissage automatique essayent de toucher Naive Bayes (1) - Théorie. fait.

Sur cette page, je vais essayer une implémentation simple en utilisant Python. Comme d'habitude, il est réalisé en imitant le site auquel j'ai fait référence, donc il vous sera expliqué & cette explication si vous êtes intéressé. Au fait, je n'ai pas du tout écrit Python, alors regardez avec des yeux chaleureux ...

L'exemple de code se trouve en bas.

Un petit examen

La formule Naive Bayes pourrait être exprimée comme suit:

P(cat|doc) = \log P(cat) + \prod_{i=0}^k \log P(word_k|cat)

Je ne sais pas si c'est un programme ... J'organiserai d'abord ce dont j'ai besoin.

< P(cat) >

< P(word|cat) >

La mise en oeuvre!

politique

nb = NaiveBayes()
nb.train(data)

Je veux l'utiliser comme ci-dessus, donc je le conçois comme une classe. Si vous déclarez ce dont vous avez besoin ci-dessus avec init, le code jusqu'à __init__ sera ..

class NaiveBayes:

    def __init__(self):
        self.vocabularies    = set() #Catégorie non dupliquée
        self.categories      = set() #Vocabulaire sans chevauchement
        self.category_count  = {}    #Nombre d'occurrences de la catégorie, category_count[cat]
        self.word_count      = {}    #Nombre d'occurrences de mot pour chaque catégorie, word_count[cat]
	    ...

Jusqu'à l'apprentissage

def train(self, data):
    self.category_count = defaultdict(lambda: 0)

    for d in data:
        category = d[0]
        self.categories.add(category) #Ajouter une catégorie
        self.category_count[category] += 1

        for word in d[1:]: #Ajouter du vocabulaire
            self.vocabularies.add(word)

    for category in self.categories:
        self.word_count[category]  = defaultdict(lambda: 0)

    for d in data:
        category = d[0]
        for word in d[1:]:
            self.word_count[category][word] += 1

Ceci est une préparation. Déjà ... c'est tout.

from collections import defaultdict

hash = {}
hash = defaultdict(lambda: 0)

Vous pouvez utiliser defaultdict pour spécifier la valeur initiale quand il n'y a pas de valeur. J'étais inquiet pour le lissage de Laplace, mais j'ai décidé d'ajouter «+ 1» au calcul.

P(word|cat)

\prod_{i=0}^k \log P(word_k|cat)

Définissez une fonction appelée word_probability pour calculer chaque terme de. Comment le trouver

P(word_k|cat) = \frac{Catégorie(cat)Mots dans(word)Nombre d'apparitions+ 1}{Catégorie(cat)Nombre total de mots qui apparaissent dans+Nombre total de mots}

C'était. Ici, nous appliquons «Laplace Smoothing».

def word_probability(self, word, category):
        '''Probabilité d'être une catégorie lorsqu'un mot est donné, P(word|cat)'''
        #Appliquer le lissage Laplace
        word_count       = self.word_count[category][word] + 1
        vocabulary_count = sum(self.word_count[category].values()) + len(self.vocabularies)
        return float(word_count) / float(vocabulary_count)

Calculer le score d'une phrase

Calculez P (cat | doc).

P(cat|doc) = \log P(cat) + \prod_{i=0}^k \log P(word_k|cat)

Lorsqu'une phrase est donnée, la fonction ci-dessus est utilisée pour créer une fonction qui calcule le score car la probabilité totale de chaque mot doit être calculée. Cependant, veuillez noter que la multiplication des journaux avec la même base est la somme de la somme et non la somme de la somme. De plus, puisque la base de «log est 10», ce sera une valeur négative lors du calcul. Personnellement, je n'ai pas aimé, alors j'ai fait x (-1) à la fin. Je pense que l'un ou l'autre est bien.

D'abord, mettez P (cat) dans score, puis ajoutez P (mot | chat) dans une boucle.

def score(self, words, category):
        '''des documents(mot)Probabilité d'être une catégorie donnée'''
        documents_count = sum(self.category_count.values())
        score = math.log(float(self.category_count[category]) / documents_count)

        for word in words:
            score += math.log(self.word_probability(word, category))

        #Parce que le bas du journal est 10, il sera négatif+À
        return score * (-1)

Classer

Eh bien, c'est finalement la classification. En réalité, je pense que vous appellerez cette fonction après l'entraînement.

def classify(self, words):
        '''P(cat|doc)Renvoie la plus grande catégorie'''
        best  = None
        value = 0

        for category in self.categories:
            v = self.score(words, category)
            if v > value:
                best  = category
                value = v
        return best

La structure est simple, elle calcule le score de toutes les catégories passées en phase d'apprentissage et renvoie la plus élevée.

Code complet

#coding:utf-8

from collections import defaultdict
import math

class NaiveBayes:

    def __init__(self):
        self.vocabularies    = set() #Catégorie non dupliquée
        self.categories      = set() #Vocabulaire sans chevauchement
        self.category_count  = {}    #Nombre d'occurrences de la catégorie, category_count[cat]
        self.word_count      = {}    #Nombre d'occurrences de mot pour chaque catégorie, word_count[cat]


    def train(self, data):
        self.category_count = defaultdict(lambda: 0)

        for d in data:
            category = d[0]
            self.categories.add(category) #Ajouter une catégorie
            self.category_count[category] += 1

            for word in d[1:]: #Ajouter du vocabulaire
                self.vocabularies.add(word)

        for category in self.categories:
            self.word_count[category]  = defaultdict(lambda: 0)

        for d in data:
            category = d[0]
            for word in d[1:]:
                self.word_count[category][word] += 1


    def word_probability(self, word, category):
        '''Probabilité d'être une catégorie lorsqu'un mot est donné, P(word|cat)'''
        #Appliquer le lissage Laplace
        word_count       = self.word_count[category][word] + 1
        vocabulary_count = sum(self.word_count[category].values()) + len(self.vocabularies)
        return float(word_count) / float(vocabulary_count)


    def score(self, words, category):
        '''des documents(mot)Probabilité d'être une catégorie donnée'''
        documents_count = sum(self.category_count.values())
        score = math.log(float(self.category_count[category]) / documents_count)

        for word in words:
            score += math.log(self.word_probability(word, category))

        #Parce que le bas du journal est 10, il sera négatif+À
        return score * (-1)


    def classify(self, words):
        '''P(cat|doc)Renvoie la plus grande catégorie'''
        best  = None
        value = 0

        for category in self.categories:
            v = self.score(words, category)
            if v > value:
                best  = category
                value = v
        return best


if __name__ == "__main__":
    data = [["yes", "Chinese", "Beijing", "Chinese"],
            ["yes", "Chinese", "Chinese", "Shanghai"],
            ["yes", "Chinese", "Macao"],
            ["no", "Tokyo", "Japan", "Chinese"]]

    #Former le classificateur Naive Bayes
    nb = NaiveBayes()
    nb.train(data)

    print "P(Chinese|yes) = ", nb.word_probability("Chinese", "yes")
    print "P(Tokyo|yes) = ", nb.word_probability("Tokyo", "yes")
    print "P(Japan|yes) = ", nb.word_probability("Japan", "yes")
    print "P(Chinese|no) = ", nb.word_probability("Chinese", "no")
    print "P(Tokyo|no) = ", nb.word_probability("Tokyo", "no")
    print "P(Japan|no) = ", nb.word_probability("Japan", "no")
    #
    # #Prédire les catégories de données de test
    test = ["Chinese", "Chinese", "Chinese", "Tokyo", "Japan"]
    print "log P(yes|test) =", nb.score(test, "yes")
    print "log P(no|test) =", nb.score(test, "no")
    print nb.classify(test)

référence

J'ai beaucoup parlé des pages suivantes. Merci beaucoup.

Recommended Posts

Les débutants en apprentissage automatique tentent de contacter Naive Bayes (2) - Mise en œuvre
Les débutants en apprentissage automatique tentent de contacter Naive Bayes (1) - Théorie
Les débutants en apprentissage automatique essaient de créer un arbre de décision
Les débutants en apprentissage automatique essaient la régression linéaire
Essayez de prédire la demande de puissance par l'apprentissage automatique
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
Introduction à l'apprentissage automatique
[Apprentissage automatique] Essayez de détecter des objets à l'aide de la recherche sélective
Tout pour que les débutants puissent faire du machine learning
Une introduction à l'apprentissage automatique
Un débutant en apprentissage automatique a essayé la RBM
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
Super introduction à l'apprentissage automatique
Essayez le machine learning à la légère avec Kaggle
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage ((1) Implémentation du blackjack)
Introduction à la rédaction de notes d'apprentissage automatique
[Apprentissage automatique] Étudions l'arbre de décision
SVM essayant l'apprentissage automatique avec scikit-learn
<Pour les débutants> bibliothèque python <Pour l'apprentissage automatique>
Présentation de la bibliothèque d'apprentissage automatique SHOGUN
[Apprentissage automatique] Essayez d'étudier une forêt aléatoire
les débutants en python ont essayé de le découvrir
Comment collecter des données d'apprentissage automatique
[Python] [Apprentissage automatique] Les débutants sans aucune connaissance essaient l'apprentissage automatique pour le moment
Méthode de mise en œuvre spécifique pour ajouter les données de performances passées des chevaux à la quantité de fonctionnalités d'apprentissage automatique
(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation
Les débutants en Python publient des applications Web à l'aide de l'apprentissage automatique [Partie 2] Introduction à Python explosif !!
Introduction à l'apprentissage automatique: fonctionnement du modèle
scikit-learn Comment utiliser le résumé (apprentissage automatique)
Enregistrez les étapes pour comprendre l'apprentissage automatique
Premiers pas pour les débutants en apprentissage automatique (IA)
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
Algorithme d'apprentissage automatique (implémentation de la classification multi-classes)
Résumé de la classification et de la mise en œuvre des algorithmes d'apprentissage automatique
Comment profiter de Coursera / Machine Learning (semaine 10)
Une introduction à Python pour l'apprentissage automatique
Essayez d'écrire du code à partir de 1 en utilisant le chainer du cadre d'apprentissage automatique (édition mnist)
Essayez de dessiner un "front de type carte météorologique" par apprentissage automatique basé sur des données météorologiques (5)
[Super Introduction] Apprentissage automatique utilisant Python - De la construction d'environnement à l'implémentation de perceptron simple-
Un débutant en apprentissage automatique a essayé de créer un modèle de prédiction de courses de chevaux avec python
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (1)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (4)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (2)
Est-il possible de manger avec les prévisions de cours de bourse par apprentissage automatique [Plan de mise en œuvre]