Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.

Überblick

Ich werde den Algorithmus des Naive Bayes-Klassifikators (Beckenfilter) anhand konkreter numerischer Werte erläutern. Ich habe es auch in Python implementiert. Ich habe es als mein eigenes Studienmemo geschrieben, aber ich hoffe, es wird anderen Menschen nützlich sein.

Was ist ein Naive Bays-Klassifikator?

Es ist eine der überwachten Lernmethoden des maschinellen Lernens, mit der Sie bestimmen können, zu welcher Kategorie bestimmte Daten (Sätze) gehören. Es wird häufig für Spam-Mail-Filter und die Kategorisierung von WEB-Nachrichtenartikeln verwendet.

Schwierigkeit

Es ist eine einfache Methode, die den Satz von Bayes verwendet, und der Schwierigkeitsgrad ist niedrig. Ich habe versucht zu erklären, ohne so viele mathematische Formeln wie möglich zu verwenden.

Berechnung des Naive Bayes Klassifikators

Ich werde die Berechnungslogik zur Bestimmung der Kategorie, in die der Zielsatz fällt, anhand konkreter numerischer Werte erläutern.

Wenn die Trainingsdaten wie folgt sind, berechnen Sie, in welche Kategorie der Zielsatz fällt.

** Lerndaten **

*Fußball[Ball|Sport|Weltmeisterschaft|Ball] *Baseball[Ball|Sport|Handschuhe|Schläger] *Tennis[Ball|Schläger|Mantel]

** Zieldokument ** "Ballsport"

** 1. Berechnung der Kategorieerscheinungsrate P (C) **

Der Wert, der durch Teilen der Anzahl der Dokumente in jeder Kategorie von Trainingsdaten durch die Gesamtzahl der Dokumente erhalten wird, ist definiert als "** Erscheinungsrate der Kategorie P (C) **".

Fußball Baseball Tennis
Wahrscheinlichkeit des Auftretens der Kategorie \frac{2}{4} \frac{1}{4} \frac{1}{4}

** 2. Berechnung der Dokumenterscheinungsrate in Kategorie P (D | C) **

Zählen Sie die Anzahl der Wörter in jeder Kategorie in den Trainingsdaten. Duplikate sind nicht ausgeschlossen und Fußball ist total.

Fußball Baseball Tennis
Anzahl der Wörter 6 4 3

Zählen Sie die Anzahl der Vorkommen in jeder Kategorie von "Ball" und "Sport" und dividieren Sie durch die Anzahl der Wörter in jeder oben gezählten Kategorie. Dies sei "** Wortvorkommensrate P (Wn | C) ** in der Kategorie".

Fußball Baseball Tennis
Ball \frac{3}{6} \frac{1}{4} \frac{1}{3}
Sport \frac{2}{6} \frac{1}{4} \frac{0}{3}

Der Wert, der durch Multiplizieren des berechneten "Ballwerts" und "Sportwerts" erhalten wird, ist definiert als "** Dokumenterscheinungsrate in Kategorie P (D | C) **".

Fußball Baseball Tennis
Erscheinungsrate des Dokuments in der Kategorie \frac{6}{36} \frac{1}{16} \frac{0}{9}

** 3. Berechnung der Kategorieerscheinungsrate in Sätzen P (C | D) **

1 oben.Und 2.Ausgestellt in "Kategorie Erscheinungsrate P.(C)"Wann"**Dokumentpräsentationsrate in Kategorie P.(D|C)**Wahrscheinlichkeit, dass das Produkt von "" zu jeder Kategorie für das Dokument gehört (文章内のKategorie Erscheinungsrate P.(C|D)) ist.

Der mit dem höchsten Wert wird als Zieldokumentkategorie klassifiziert.

Fußball Baseball Tennis
Kategorie Erscheinungsrate in Sätzen $\frac{2}{4} \times \frac{6}{36} $ $\frac{1}{4} \times \frac{1}{16} $ $\frac{1}{4} \times \frac{0}{9} $
Berechnungsergebnis \frac{1}{12} \frac{1}{64} \frac{0}{36}

Infolgedessen wurde "Ballsport" als "Fußball" eingestuft! !!

(Da es nur ein Beispiel ist, ist es alles Ballsport)

** 4. Nullfrequenzproblem **

In diesem Beispiel beträgt die Tenniswahrscheinlichkeit jetzt $ 0 $. Dies liegt daran, dass das Wort "Sport" nicht in den Lerndaten für "Tennis" enthalten war.

Wenn es ein neues Wort gibt, das in den Trainingsdaten nicht vorhanden ist, beträgt die Wahrscheinlichkeit der Kategorie $ 0 $. Dies wird als "** Nullfrequenzproblem **" bezeichnet.

Um dies zu lösen, verwenden wir eine Methode namens additive Glättung zur Neuberechnung.

** Mit zusätzlicher Glättung neu berechnet **

Fügen Sie einfach die unten fett gedruckte Verarbeitung zum Berechnungsteil "Wortauftrittsrate P (Wn | C) in Kategorie" in 2 hinzu.

Zählen Sie die Anzahl der Vorkommen jeder Kategorie von "Ball" und "Sport" und addieren Sie ** 1 ** und dividieren Sie durch ** die Anzahl der Wörter in jeder oben gezählten Kategorie plus ** die Gesamtzahl der Lerndatenwörter ** ..

Die Gesamtzahl der Wörter in den Trainingsdaten beträgt 8, da sie dedupliziert sind.

"Wortauftrittsrate P (Wn | C) in Kategorie" ist in der Tabelle erneut zusammengefasst.

Fußball Baseball Tennis
Ball \frac{(3 + 1)}{(6 + 8)} \frac{(1 + 1)}{(4 + 8)} \frac{(1 + 1)}{(3 + 8)}
Sport \frac{(2 + 1)}{(6 + 8)} \frac{(1 + 1)}{(4 + 8)} \frac{(0 + 1)}{(3 + 8)}

Berechnen Sie den Bruch.

Fußball Baseball Tennis
Ball \frac{4}{14} \frac{2}{12} \frac{2}{11}
Sport \frac{3}{14} \frac{2}{12} \frac{1}{11}

Dies zeigt, dass selbst wenn das Wort "Sport" nicht in den Trainingsdaten für "Tennis" enthalten ist, die Wahrscheinlichkeit nicht Null ist.

Berechnen Sie dann die Fortsetzung so wie sie ist.

Die in 1. berechnete "Kategorieerscheinungsrate P (C)" bleibt gleich. "Dokumenterscheinungsrate P (D | C) in Kategorie" ist das Produkt der Werte von "Ball" und "Sport", berechnet in den obigen Brüchen.

Fußball Baseball Tennis
Wahrscheinlichkeit des Auftretens der Kategorie \frac{2}{4} \frac{1}{4} \frac{1}{4}
Erscheinungsrate des Dokuments in der Kategorie \frac{12}{196} \frac{4}{144} \frac{2}{121}
Kategorie Erscheinungsrate in Sätzen \frac{2}{4} × \frac{12}{196} \frac{1}{4} × \frac{4}{144} \frac{1}{4}× \frac{2}{121}
Berechnungsergebnis \frac{3}{98} \frac{1}{144} \frac{1}{242}

Das Ergebnis wurde als Fußball eingestuft, wobei die Wahrscheinlichkeit, dass Tennis nicht $ 0 $ beträgt, beträgt! !!

Ich denke jedoch, dass sich die Genauigkeit der additiven Glättung aufgrund des großen Effekts des Werts der "Kategorie-Erscheinungsrate P (C)" verschlechtert. Dies muss bei der Einstellung der Trainingsdaten sorgfältig berücksichtigt werden.

** 5. Unterlaufmaßnahmen **

Aus Gründen der Übersichtlichkeit haben wir die Anzahl der Wörter und Datensätze im Beispiel reduziert, aber es handelt sich tatsächlich um mehr Wörter. Daher wird der Nenner des Berechnungsergebnisses zu einer sehr großen Zahl, und es besteht eine hohe Wahrscheinlichkeit, dass ein Unterlauf auftritt.

Die Problemumgehung ist die ** logarithmische Vergleichsmethode **.

$ 0.001 $ kann auch ausgedrückt werden als $ \ frac {1} {10} $ × $ \ frac {1} {10} $ × $ \ frac {1} {10} $, was $ 10 $ für die $ -3 $ Potenz entspricht. Gut, ** -3 ** ist der Logarithmus von $ 0,001 $. (Unten ist $ 10 $) $ 0,0001 $ kann auch als $ \ frac {1} {10} $ × $ \ frac {1} {10} $ × $ \ frac {1} {10} $ × $ \ frac {1} {10} $ ausgedrückt werden Ja, es heißt $ 10 $ für die $ -4 $ Potenz und ** - 4 ** ist der Logarithmus von $ 0,001 $. (Unten ist $ 10 $)

Die Größenrelation von $ X $, $ Y $ und $ Z $ ist dieselbe wie die Größenrelation des Logarithmus von $ X $, des Logarithmus von $ Y $ und des Logarithmus von $ Z $. (Wenn der Boden gleich und größer als 1 ist) Der Logarithmus ist größer als der ursprüngliche Wert. (Wenn der Wert kleiner als 1 ist und die Basis größer als 1 ist)

Die Größe der Wertemultiplikation entspricht auch der Größe der logarithmischen Addition. 2 x 2 x 2: Protokoll 3 2 x 2 x 2 ** x 2 **: Log 3 ** + 1 **

Die Geschichte geht auf das Beispiel zurück "Dokumenterscheinungsrate in Kategorie P.(D|C)"Ball" und "Sport" "Wortauftrittsrate in Kategorie P"(Wn|C)Berechnet als Addition des Logarithmus der "Kategorie Erscheinungswahrscheinlichkeit P"(C)Ich werde es dem Logarithmus von hinzufügen.

Fußball Baseball Tennis
Wahrscheinlichkeit des Auftretens der Kategorie \log {\frac{2}{4}} \log {\frac{1}{4}} \log {\frac{1}{ 4}}
Wortauftrittsrate in der Kategorie(Ball) \log {\frac{4}{14}} \log {\frac{2}{12}} \log {\frac{2}{11}}
Wortauftrittsrate in der Kategorie(Sport) \log {\frac{3}{14}} \log {\frac{2}{12}} \log {\frac{1}{11}}
Kategorie Erscheinungsrate in Sätzen \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}}

Damit ist der Naive Bayes-Klassifikator vervollständigt! !!

Ich habe es in Python geschrieben

Ich habe es tatsächlich in Python mit Bezug auf die folgende Seite geschrieben. http://yaju3d.hatenablog.jp/entry/2016/10/31/222307

Ich habe versucht, in den Kommentaren so viel wie möglich zu beschreiben, wo die oben erläuterten Werte übereinstimmen. Ich benutze Janome für die morphologische Analyse.

naivebayes.py


class NaiveBayes:

    #Konstrukteur
    def __init__(self):

        #Ein Satz aller Wörter von Trainingsdaten(Für zusätzliche Glättung)
        self.vocabularies = set()

        #Für Wortsätze für jede Kategorie von Trainingsdaten
        self.word_count = {}

        #Für eine Reihe von Dokumenten für jede Kategorie von Trainingsdaten
        self.category_count = {}

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

        #Morphologische Analyse von Lerndokumenten
        ma = MorphologicalAnalysis()
        word_list = ma.get_word_list(document)

        for word in word_list:

            #Erhöhen Sie die Anzahl der Wortvorkommen in einer Kategorie
            self.__word_count_up(word, category)

        #Erhöhen Sie die Anzahl der Dokumente in der Kategorie
        self.__category_count_up(category)

    #Erhöhen Sie die Anzahl der Wortvorkommen in der Trainingsdatenkategorie
    def __word_count_up(self, word, category):

        #Wenn neue Kategorie hinzufügen
        self.word_count.setdefault(category, {})

        #Fügen Sie der Kategorie neue Wörter hinzu
        self.word_count[category].setdefault(word, 0)

        #Erhöhen Sie die Anzahl der Wortvorkommen in einer Kategorie
        self.word_count[category][word] += 1

        #Zum gesamten Wortsatz der Trainingsdaten hinzufügen(Deduplizierung)
        self.vocabularies.add(word)

    #Erhöhen Sie die Anzahl der Dokumente in der Kategorie Trainingsdaten
    def __category_count_up(self, category):

        #Wenn neue Kategorie hinzufügen
        self.category_count.setdefault(category, 0)

        #Erhöhen Sie die Anzahl der Dokumente in der Kategorie
        self.category_count[category] += 1

    #Einstufung
    def classifier(self, document):

        #Nächste Kategorie
        best_category = None

        #Stellen Sie den minimalen ganzzahligen Wert ein
        max_prob = -sys.maxsize

        #Morphologische Analyse des Zieldokuments
        ma = MorphologicalAnalysis()
        word_list = ma.get_word_list(document)

        #Erscheinungsrate der Kategorie in Dokumenten für jede Kategorie P.(C|D)Ich suche
        for category in self.category_count.keys():

            #Erscheinungsrate der Kategorie im Dokument P.(C|D)Ich suche
            prob = self.__score(word_list, category)

            if prob > max_prob:
                max_prob = prob
                best_category = category

        return best_category

    #Erscheinungsrate der Kategorie im Dokument P.(C|D)Berechnung
    def __score(self, word_list, category):

        #Kategorie Erscheinungsrate P.(C)Erhalten(Nehmen Sie eine logarithmische Messung gegen Unterlauf und fügen Sie hinzu)
        score = math.log(self.__prior_prob(category))

        #Suchen Sie die Häufigkeit von Wörtern in einer Kategorie für alle Wörter in einem Dokument
        for word in word_list:

            #Wortauftrittsrate in Kategorie P.(Wn|C)Berechnung(Nehmen Sie eine logarithmische Messung gegen Unterlauf und fügen Sie hinzu)
            score += math.log(self.__word_prob(word, category))

        return score

    #Kategorie Erscheinungsrate P.(C)Berechnung
    def __prior_prob(self, category):

        #Anzahl der Dokumente in der Zielkategorie der Trainingsdaten/Gesamtzahl der Trainingsdatendokumente
        return float(self.category_count[category] / sum(self.category_count.values()))

    #Wortauftrittsrate in Kategorie P.(Wn|C)Berechnung
    def __word_prob(self, word, category):

        #Anzahl der Vorkommen in einer Wortkategorie+ 1 /Anzahl der Wörter in der Kategorie+Gesamtzahl der Wörter in Trainingsdaten(Additionsglättung)
        prob = (self.__in_category(word, category) + 1.0) / (sum(self.word_count[category].values())
                                                             + len(self.vocabularies) * 1.0)
        return prob

    #Gibt zurück, wie oft ein Wort in einer Kategorie vorkommt
    def __in_category(self, word, category):

        if word in self.word_count[category]:
            #Anzahl der Vorkommen in einer Wortkategorie
            return float(self.word_count[category][word])
        return 0.0

Ich habe das Lernen und Klassifizieren der oben genannten Klassen aus Sicht aufgerufen.

view.py



def matching(request):

    if request.method == 'POST':

        #Erfassung des Zieldokuments
        words = request.POST['words']

        nb = NaiveBayes()

        #Trainingsdatensatz
        nb.train('Ball Sport WM Ball', 'Fußball')
        nb.train('Ballsporthandschuhschläger', 'Baseball')
        nb.train('Ballschlägerplatz', 'Tennis')
        nb.train('Ballsport', 'Fußball')

        #Holen Sie sich das Klassifizierungsergebnis
        category = nb.classifier(words)

        dictionary = {'category': category}

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

    elif request.method == 'GET':

        return render(request, 'matching.html')

Ende

Maschinelles Lernen fängt gerade erst an zu lernen und es gibt viele Dinge, die ich nicht verstehe. Da ich Python seit einigen Tagen verwende, kann der Schreibstil auch seltsam sein.

Wenn Sie in der obigen Erklärung Fehler finden, würde ich mich freuen, wenn Sie darauf hinweisen könnten.

Außerdem hat Janome die Wörter, die Katakana folgen, nicht getrennt. Ich wollte mein eigenes Memo sein, aber ich hoffe, es hilft jemandem: erröten:

Recommended Posts

Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.
Ich habe versucht, es sorgfältig zu verstehen, während ich den Algorithmus Adaboost beim maschinellen Lernen implementiert habe (+ ich habe mein Verständnis der Array-Berechnung vertieft)
[Basic Information Engineer Examination] Ich habe den Algorithmus der euklidischen Methode der gegenseitigen Teilung in Python geschrieben.
Berechnen Sie mithilfe des in Python 3.3 implementierten Naive Bayes-Klassifikators die Ähnlichkeit aus der Häufigkeit des gleichzeitigen Auftretens von Wörtern in Sätzen und Zeichenfolgen.
[Maschinelles Lernen] "Erkennung von Abnormalitäten und Erkennung von Änderungen" Zeichnen wir die Abbildung von Kapitel 1 in Python.
Das Ergebnis des maschinellen Lernens von Java-Ingenieuren mit Python www
Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
[Maschinelles Lernen] Verstehen Sie aus der Mathematik, dass Standardisierung zu einem Durchschnitt von 0 und einer Standardabweichung von 1 führt.
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Python: Vorverarbeitung beim maschinellen Lernen: Umgang mit fehlenden / Ausreißern / unausgeglichenen Daten
[Basic Information Engineer Examination] Ich habe einen Algorithmus für den Maximalwert eines Arrays in Python geschrieben.
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
Ich habe ein Buch geschrieben, in dem Sie maschinelle Lernimplementierungen und -algorithmen auf ausgewogene Weise lernen können.
Ein Memo, das ich schnell in Python geschrieben habe
Sprechen Sie über die Funktionen, für die Pandas und ich im Projekt verantwortlich waren
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Ich habe eine Klasse in Python3 und Java geschrieben
Liste der wichtigsten Wahrscheinlichkeitsverteilungen, die beim maschinellen Lernen und in der Statistik verwendet werden, sowie Code in Python
[Python] Ich habe die Theorie und Implementierung der Support Vector Machine (SVM) ausführlich erklärt.
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
[CodeIQ] Ich habe die Wahrscheinlichkeitsverteilung von Würfeln geschrieben (aus dem CodeIQ-Mathematikkurs für maschinelles Lernen [Wahrscheinlichkeitsverteilung]).
Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe
Ich habe die Geschwindigkeit der Referenz des Pythons in der Liste und die Referenz der Wörterbucheinbeziehung aus der In-Liste verglichen.
Ich möchte die Variablen in der Python-Vorlagendatei ersetzen und in einer anderen Datei in Massenproduktion herstellen
Mayungos Python-Lernhinweis: Liste der Geschichten und Links
Tool MALSS (Anwendung), das maschinelles Lernen in Python unterstützt
Verstehen Sie die Exponentialverteilung sorgfältig und zeichnen Sie in Python
Tool MALSS (Basic), das maschinelles Lernen in Python unterstützt
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Zeichnen und verstehen Sie die multivariate Normalverteilung in Python
Ich habe mir die Versionen von Blender und Python angesehen
Verstehe die Poisson-Distribution sorgfältig und zeichne in Python
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
Ich untersuchte den stärkenden Lernalgorithmus des Algorithmushandels
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
Ich habe eine Klasse geschrieben, die das Schreiben erleichtert, indem ich die Teiltexte spezifiziere, wenn ich Mecab mit Python verwende
Ich habe python3.4 in .envrc mit direnv geschrieben und es zugelassen, aber ich habe einen Syntaxfehler erhalten
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt
[Maschinelles Lernen] Schreiben Sie die Methode des nächsten Nachbarn in Python selbst und erkennen Sie handgeschriebene Zahlen.
[Python] Ich habe einen Test von "Streamlit" geschrieben, der das Erstellen von Visualisierungsanwendungen erleichtert.
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe die Methode des maschinellen Lernens und ihre Implementierungssprache anhand der Tag-Informationen von Qiita betrachtet
Umfrage zum Einsatz von maschinellem Lernen in realen Diensten
Ich habe die grundlegende Grammatik von Python in Jupyter Lab geschrieben
Ich habe die Grundoperation von Seaborn im Jupyter Lab geschrieben
Ich bin froh, dass ich 2015 studiert habe und was ich 2016 lernen möchte
Was ich über KI / maschinelles Lernen mit Python gelernt habe (4)
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Bubble Sort)
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python