Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.

Aperçu

J'expliquerai l'algorithme du classifieur Naive Bayes (Basin filter) en utilisant des valeurs numériques concrètes. Je l'ai également implémenté en Python. Je l'ai rédigé comme mon propre mémo d'étude, mais j'espère qu'il sera utile à d'autres personnes.

Qu'est-ce qu'un classificateur Naive Bays?

C'est l'une des méthodes d'apprentissage supervisé de l'apprentissage automatique qui vous permet de déterminer à quelle catégorie appartient certaines données (phrase). Il est souvent utilisé pour les filtres de courrier indésirable et la catégorisation des articles de presse WEB.

difficulté

C'est une méthode simple utilisant le théorème de Bayes, et le niveau de difficulté est faible. J'ai essayé d'expliquer sans utiliser autant que possible des formules mathématiques.

Calcul du classificateur Naive Bayes

Je vais expliquer la logique de calcul pour déterminer dans quelle catégorie la phrase cible appartient, en utilisant des valeurs numériques concrètes.

Si les données d'apprentissage sont les suivantes, calculez dans quelle catégorie appartient la phrase cible.

** Données d'apprentissage **

*Football[Balle|Des sports|Coupe du monde|Balle] *base-ball[Balle|Des sports|Gants|chauve souris] *tennis[Balle|raquette|manteau]

** Document cible ** "Sports de balle"

** 1. Calcul du taux d'apparition de la catégorie P (C) **

La valeur obtenue en divisant le nombre de documents dans chaque catégorie de données de formation par le nombre total de documents est définie comme «** Taux d'apparition de la catégorie P (C) **».

Football base-ball tennis
Probabilité d'apparition de catégorie \frac{2}{4} \frac{1}{4} \frac{1}{4}

** 2. Calcul du taux d'apparition des documents dans la catégorie P (D | C) **

Comptez le nombre de mots de chaque catégorie dans les données d'entraînement. Les doublons ne sont pas exclus et le football est total.

Football base-ball tennis
Nombre de mots 6 4 3

Comptez le nombre d'occurrences dans chaque catégorie de «balle» et «sports» et divisez par le nombre de mots de chaque catégorie comptés ci-dessus. Soit "** taux d'occurrence de mot P (Wn | C) ** dans la catégorie".

Football base-ball tennis
Balle \frac{3}{6} \frac{1}{4} \frac{1}{3}
Des sports \frac{2}{6} \frac{1}{4} \frac{0}{3}

La valeur obtenue en multipliant la «valeur de balle» et la «valeur sportive» calculées est définie comme «** taux d'apparition des documents dans la catégorie P (D | C) **».

Football base-ball tennis
Taux d'apparition des documents dans la catégorie \frac{6}{36} \frac{1}{16} \frac{0}{9}

** 3. Calcul du taux d'apparition des catégories dans les phrases P (C | D) **

1 ci-dessus.Et 2.Émis en "Taux d'apparition de la catégorie P(C)"Quand"**Taux d'apparition des documents dans la catégorie P(D|C)**Probabilité que le produit de "" appartienne à chaque catégorie du document (文章内のTaux d'apparition de la catégorie P(C|D))est.

Celui avec la valeur la plus élevée est classé comme catégorie de document cible.

Football base-ball tennis
Taux d'apparition de la catégorie dans les phrases $\frac{2}{4} \times \frac{6}{36} $ $\frac{1}{4} \times \frac{1}{16} $ $\frac{1}{4} \times \frac{0}{9} $
Résultat du calcul \frac{1}{12} \frac{1}{64} \frac{0}{36}

En conséquence, les "sports de balle" ont été classés comme "football"! !!

(Puisqu'il ne s'agit que d'un exemple, c'est à travers que ce sont tous les sports de balle)

** 4. Problème de fréquence zéro **

Dans cet exemple, la probabilité de tennis est maintenant de 0 $. C'est parce que le mot «sport» n'a pas été inclus dans les données d'apprentissage pour «tennis».

S'il y a un nouveau mot qui n'existe pas dans les données d'apprentissage, la probabilité de la catégorie sera de 0 $. C'est ce qu'on appelle le "** problème de fréquence zéro **".

Pour résoudre ce problème, nous utilisons une méthode appelée lissage additif pour recalculer.

** Recalculé avec un lissage supplémentaire **

Ajoutez simplement le traitement en gras ci-dessous à la partie de calcul "Taux d'apparition des mots P (Wn | C) en catégorie" en 2.

Comptez le nombre d'occurrences de chaque catégorie de "balle" et "sports" et ajoutez ** 1 **, et divisez par le nombre de mots dans chaque catégorie comptés ci-dessus plus ** le nombre total de mots de données d'apprentissage ** ..

Le nombre total de mots dans les données d'apprentissage est de 8 car il est dédupliqué.

Le "taux d'apparition des mots P (Wn | C) dans la catégorie" est à nouveau résumé dans le tableau.

Football base-ball tennis
Balle \frac{(3 + 1)}{(6 + 8)} \frac{(1 + 1)}{(4 + 8)} \frac{(1 + 1)}{(3 + 8)}
Des sports \frac{(2 + 1)}{(6 + 8)} \frac{(1 + 1)}{(4 + 8)} \frac{(0 + 1)}{(3 + 8)}

Calculez la fraction.

Football base-ball tennis
Balle \frac{4}{14} \frac{2}{12} \frac{2}{11}
Des sports \frac{3}{14} \frac{2}{12} \frac{1}{11}

Cela montre que même si le mot «sports» ne figure pas dans les données d'entraînement pour «tennis», la probabilité ne sera pas nulle.

Ensuite, calculez la suite telle qu'elle est.

Le «taux d'apparition de catégorie P (C)» calculé en 1. reste le même. «Taux d'apparition des documents P (D | C) dans la catégorie» est le produit des valeurs de «balle» et «sports» calculées ci-dessus.

Football base-ball tennis
Probabilité d'apparition de catégorie \frac{2}{4} \frac{1}{4} \frac{1}{4}
Taux d'apparition des documents dans la catégorie \frac{12}{196} \frac{4}{144} \frac{2}{121}
Taux d'apparition de la catégorie dans les phrases \frac{2}{4} × \frac{12}{196} \frac{1}{4} × \frac{4}{144} \frac{1}{4}× \frac{2}{121}
Résultat du calcul \frac{3}{98} \frac{1}{144} \frac{1}{242}

Le résultat a été classé comme football, avec une probabilité de tennis de 0 $! !!

Cependant, je pense que la précision du lissage additif se détériore en raison du grand effet de la valeur du "taux d'apparition de catégorie P (C)". Il est nécessaire d'en tenir compte attentivement lors de la définition des données d'entraînement.

** 5. Mesures de sous-dépassement **

Par souci de clarté, nous avons réduit le nombre de mots et d'ensembles de données dans l'exemple, mais nous avons en fait plus de mots. Par conséquent, le dénominateur du résultat du calcul devient un très grand nombre et il y a une forte possibilité qu'un sous-débordement se produise.

La solution de contournement est la méthode de ** comparaison logarithmique **.

0,001 $ peut également être exprimé comme $ \ frac {1} {10} $ × $ \ frac {1} {10} $ × $ \ frac {1} {10} $, ce qui équivaut à 10 $ élevé à la puissance $ -3 $. Bon, ** -3 ** est le logarithmique de 0,001 $. (Le bas est de 10 $) $ 0,0001 $ peut également être exprimé comme $ \ frac {1} {10} $ × $ \ frac {1} {10} $ × $ \ frac {1} {10} $ × $ \ frac {1} {10} $ Oui, il est appelé 10 $ à la puissance de -4 $, et ** - 4 ** est le logarithme de 0,001 $. (Le bas est de 10 $)

La relation de grandeur de $ X $, $ Y $ et $ Z $ est la même que la relation de grandeur du logarithme de $ X $, du logarithme de $ Y $ et du logarithme de $ Z $. (Si le fond est le même et supérieur à 1) Le logarithme est supérieur à la valeur d'origine. (Si la valeur est inférieure à 1 et la base est supérieure à 1)

En outre, l'amplitude de la multiplication de la valeur est la même que celle de l'addition logarithmique. 2 x 2 x 2: bûche 3 2 x 2 x 2 ** x 2 **: Bûche 3 ** + 1 **

L'histoire revient à l'exemple "Taux d'apparition des documents dans la catégorie P(D|C)"Balle" et "Sports" "Taux d'apparition des mots dans la catégorie P"(Wn|C)Calculé comme l'addition du logarithme de "Probabilité d'apparition de catégorie P"(C)Je vais l'ajouter au logarithme de.

Football base-ball tennis
Probabilité d'apparition de catégorie \log {\frac{2}{4}} \log {\frac{1}{4}} \log {\frac{1}{ 4}}
Taux d'apparition des mots dans la catégorie(Balle) \log {\frac{4}{14}} \log {\frac{2}{12}} \log {\frac{2}{11}}
Taux d'apparition des mots dans la catégorie(Des sports) \log {\frac{3}{14}} \log {\frac{2}{12}} \log {\frac{1}{11}}
Taux d'apparition de la catégorie dans les phrases \log {\frac{2}{4}} + \log {\frac{4}{14}} + \log {\frac{3}{14}} \log {\frac{1}{4}} + \log {\frac{2}{12}} + \log {\frac{2}{12}} \log {\frac{1}{ 4}} + \log {\frac{2}{11}} + \log {\frac{1}{11}}

Ceci complète le classificateur Naive Bayes! !!

Je l'ai écrit en Python

Je l'ai en fait écrit en python en référence au site suivant. http://yaju3d.hatenablog.jp/entry/2016/10/31/222307

J'ai essayé de décrire dans les commentaires autant que possible où les valeurs expliquées ci-dessus correspondent. J'utilise janome pour l'analyse morphologique.

naivebayes.py


class NaiveBayes:

    #constructeur
    def __init__(self):

        #Un ensemble de tous les mots de données d'entraînement(Pour un lissage supplémentaire)
        self.vocabularies = set()

        #Pour les ensembles de mots pour chaque catégorie de données d'entraînement
        self.word_count = {}

        #Pour un ensemble de documents pour chaque catégorie de données d'entraînement
        self.category_count = {}

    #Apprentissage
    def train(self, document, category):

        #Analyse morphologique des documents d'apprentissage
        ma = MorphologicalAnalysis()
        word_list = ma.get_word_list(document)

        for word in word_list:

            #Augmenter le nombre d'occurrences de mots dans une catégorie
            self.__word_count_up(word, category)

        #Augmenter le nombre de documents dans la catégorie
        self.__category_count_up(category)

    #Augmenter le nombre d'occurrences de mot dans la catégorie de données d'entraînement
    def __word_count_up(self, word, category):

        #Ajouter si nouvelle catégorie
        self.word_count.setdefault(category, {})

        #Ajouter de nouveaux mots dans la catégorie
        self.word_count[category].setdefault(word, 0)

        #Augmenter le nombre d'occurrences de mots dans une catégorie
        self.word_count[category][word] += 1

        #Ajouter à l'ensemble de mots de données d'entraînement(Déduplication)
        self.vocabularies.add(word)

    #Augmenter le nombre de documents dans la catégorie des données de formation
    def __category_count_up(self, category):

        #Ajouter si nouvelle catégorie
        self.category_count.setdefault(category, 0)

        #Augmenter le nombre de documents dans la catégorie
        self.category_count[category] += 1

    #Classification
    def classifier(self, document):

        #Catégorie la plus proche
        best_category = None

        #Définir la valeur entière minimale
        max_prob = -sys.maxsize

        #Analyse morphologique du document cible
        ma = MorphologicalAnalysis()
        word_list = ma.get_word_list(document)

        #Taux d'apparition des catégories dans les documents pour chaque catégorie P(C|D)Cherchant
        for category in self.category_count.keys():

            #Taux d'apparition des catégories dans le document P(C|D)Cherchant
            prob = self.__score(word_list, category)

            if prob > max_prob:
                max_prob = prob
                best_category = category

        return best_category

    #Taux d'apparition des catégories dans le document P(C|D)Calculer
    def __score(self, word_list, category):

        #Taux d'apparition de la catégorie P(C)Avoir(Prenez une mesure logarithmique contre le sous-débit et ajoutez)
        score = math.log(self.__prior_prob(category))

        #Rechercher le taux d'occurrence des mots dans une catégorie pour tous les mots d'un document
        for word in word_list:

            #Taux d'apparition des mots dans la catégorie P(Wn|C)Calculer(Prenez une mesure logarithmique contre le sous-débit et ajoutez)
            score += math.log(self.__word_prob(word, category))

        return score

    #Taux d'apparition de la catégorie P(C)Calculer
    def __prior_prob(self, category):

        #Nombre de documents dans la catégorie cible des données d'entraînement/Nombre total de documents de données de formation
        return float(self.category_count[category] / sum(self.category_count.values()))

    #Taux d'apparition des mots dans la catégorie P(Wn|C)Calculer
    def __word_prob(self, word, category):

        #Nombre d'occurrences dans une catégorie de mots+ 1 /Nombre de mots dans la catégorie+Nombre total de mots dans les données d'entraînement(Lissage d'addition)
        prob = (self.__in_category(word, category) + 1.0) / (sum(self.word_count[category].values())
                                                             + len(self.vocabularies) * 1.0)
        return prob

    #Renvoie le nombre de fois qu'un mot apparaît dans une catégorie
    def __in_category(self, word, category):

        if word in self.word_count[category]:
            #Nombre d'occurrences dans une catégorie de mots
            return float(self.word_count[category][word])
        return 0.0

J'ai appelé l'apprentissage et la classification des classes ci-dessus de View.

view.py



def matching(request):

    if request.method == 'POST':

        #Acquisition du document cible
        words = request.POST['words']

        nb = NaiveBayes()

        #Ensemble de données de formation
        nb.train('Ballon de la Coupe du monde', 'Football')
        nb.train('Batte de gant de sport de balle', 'base-ball')
        nb.train('Terrain de raquette de balle', 'tennis')
        nb.train('Sports de balle', 'Football')

        #Obtenez le résultat de la classification
        category = nb.classifier(words)

        dictionary = {'category': category}

        return render(request, 'matching.html', dictionary)

    elif request.method == 'GET':

        return render(request, 'matching.html')

fin

L'apprentissage automatique ne fait que commencer à étudier et il y a beaucoup de choses que je ne comprends pas. De plus, depuis que j'utilise Python depuis quelques jours, le style d'écriture peut être étrange.

Si vous trouvez des erreurs dans l'explication ci-dessus, je vous serais reconnaissant de bien vouloir les signaler.

De plus, Janome n'a pas séparé les mots qui suivent Katakana. J'avais l'intention d'être une note personnelle, mais j'espère que cela aidera quelqu'un: rougissez:

Recommended Posts

Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
Notez que je comprends l'algorithme des moindres carrés. Et je l'ai écrit en Python.
J'ai essayé de bien le comprendre en implémentant l'algorithme Adaboost en machine learning (+ j'ai approfondi ma compréhension du calcul de tableaux)
[Examen d'ingénieur d'information de base] J'ai écrit l'algorithme de la méthode de division mutuelle euclidienne en Python.
À l'aide du classificateur Naive Bayes implémenté dans Python 3.3, calculez la similitude à partir de la fréquence de cooccurrence des mots dans les phrases et les chaînes.
[Apprentissage automatique] "Détection d'anomalies et détection de changement" Dessinons la figure du chapitre 1 en Python.
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Je l'ai écrit en langage Go pour comprendre le principe SOLID
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai écrit le code pour écrire le code Brainf * ck en python
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
[Apprentissage automatique] Comprenez à partir des mathématiques que la normalisation se traduit par une moyenne de 0 et un écart type de 1.
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Python: prétraitement en machine learning: gestion des données manquantes / aberrantes / déséquilibrées
[Examen d'ingénieur d'information de base] J'ai écrit un algorithme pour la valeur maximale d'un tableau en Python.
(Apprentissage automatique) J'ai essayé de comprendre attentivement l'algorithme EM dans la distribution gaussienne mixte avec l'implémentation.
J'ai écrit un livre qui vous permet d'apprendre les implémentations et les algorithmes d'apprentissage automatique de manière équilibrée.
Un mémo que j'ai écrit un tri rapide en Python
Parlez des fonctionnalités dont les pandas et moi étions en charge dans le projet
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
J'ai écrit une classe en Python3 et Java
Liste des principales distributions de probabilité utilisées en apprentissage automatique et statistiques et code en python
[Python] J'ai expliqué en détail la théorie et l'implémentation de la machine à vecteurs de support (SVM).
[Note] À propos du rôle du trait de soulignement "_" en Python
Touchons une partie de l'apprentissage automatique avec Python
[CodeIQ] J'ai écrit la distribution de probabilité des dés (du cours de mathématiques CodeIQ pour l'apprentissage automatique [Distribution de probabilités])
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
J'ai comparé la vitesse de la référence du python dans la liste et la référence de l'inclusion du dictionnaire faite à partir de la liste dans.
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Note d'apprentissage Python de Mayungo: liste d'histoires et de liens
Outil MALSS (application) qui prend en charge l'apprentissage automatique en Python
Comprenez attentivement la distribution exponentielle et dessinez en Python
Outil MALSS (basique) qui prend en charge l'apprentissage automatique en Python
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
Tracer et comprendre la distribution normale multivariée en Python
J'ai vérifié les versions de Blender et Python
Comprendre attentivement la distribution de Poisson et dessiner en Python
[Python] J'ai créé un classificateur pour les iris [Machine learning]
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
Résumé du flux de base de l'apprentissage automatique avec Python
J'ai étudié l'algorithme d'apprentissage de renforcement du trading d'algorithmes
MALSS (introduction), un outil qui prend en charge l'apprentissage automatique en Python
J'ai écrit une classe qui facilite l'écriture en spécifiant les paroles de la partie lors de l'utilisation de Mecab avec python
J'ai écrit python3.4 dans .envrc avec direnv et je l'ai autorisé, mais j'ai eu une erreur de syntaxe
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
[Apprentissage automatique] Ecrivez vous-même la méthode k-plus proche voisin en python et reconnaissez les nombres manuscrits.
[Python] J'ai écrit un test de "Streamlit" qui facilite la création d'applications de visualisation.
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai considéré la méthode d'apprentissage automatique et son langage d'implémentation à partir des informations de balise de Qiita
Enquête sur l'utilisation du machine learning dans les services réels
J'ai écrit la grammaire de base de Python dans Jupyter Lab
J'ai écrit le fonctionnement de base de Seaborn dans Jupyter Lab
Ce que je suis content d'avoir étudié en 2015 et ce que je pense apprendre en 2016
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (4)
Implémentation de l'algorithme de "Algorithm Picture Book" en Python3 (Bubble Sort)
[Note] Importation de fichiers dans le répertoire parent en Python