Praktisches Tutorial zum maschinellen Lernen (7): Naive Bayes

Eine Einleitung

Der Naive-Bayes-Algorithmus ist ein überwachter Lernalgorithmus, der Klassifizierungsprobleme löst, z. B. ob Kunden verloren gehen, ob sie eine Investition wert sind, Bonitätsbeurteilung und andere Mehrfachklassifizierungsprobleme. Die Vorteile dieses Algorithmus bestehen darin, dass er einfach und leicht zu verstehen ist, eine hohe Lerneffizienz aufweist und bei Klassifizierungsproblemen in bestimmten Bereichen mit Entscheidungsbäumen und neuronalen Netzen vergleichbar sein kann. Da dieser Algorithmus jedoch auf der Annahme der Unabhängigkeit zwischen unabhängigen Variablen (bedingte Merkmalsunabhängigkeit) und der Normalität kontinuierlicher Variablen basiert, wird die Genauigkeit des Algorithmus in gewissem Maße beeinträchtigt.

2. Naive Bayes-Theorie

Teilen Sie den Probenraum in mehrere Situationen ein, die leicht zu untersuchen sind.

  • Die Gesamtwahrscheinlichkeitsformel (von der Ursache zum Ergebnis) untersucht die Wahrscheinlichkeit des Eintretens von Ereignis B im jeweiligen Fall und berechnet die Wahrscheinlichkeit von B.
  • Die Bayes-Formel (vom Ergebnis zur Ursache) untersucht die bedingte Wahrscheinlichkeit jeder Situation unter den Bedingungen, unter denen Ereignis B eintritt.

Bedingte Wahrscheinlichkeit

Formelableitung

Wir müssen verstehen, was bedingte Wahrscheinlichkeit ist (bedingte Wahrscheinlichkeit), die sich auf die Wahrscheinlichkeit bezieht, dass Ereignis A eintritt, wenn Ereignis B eintritt, dargestellt durch P (A | B).
Fügen Sie hier eine Bildbeschreibung ein
Aus dem Venn-Diagramm ist deutlich ersichtlich, dass beim Eintreten von Ereignis B die Wahrscheinlichkeit des Eintretens von Ereignis A P(A∩B) dividiert durch P(B) beträgt.
Fügen Sie hier eine Bildbeschreibung ein
Daher
Fügen Sie hier eine Bildbeschreibung ein
kennen wir auf die gleiche Weise gemäß der bedingten Wahrscheinlichkeit die Wahrscheinlichkeit von B, wenn A auftritt.
Fügen Sie hier eine Bildbeschreibung ein
Das heißt,
Fügen Sie hier eine Bildbeschreibung ein
dies ist die Berechnungsformel der bedingten Wahrscheinlichkeit.
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Berechnungsfall

Beispiel: Wirf einen Würfel mit gleichmäßiger Textur.

  1. Wie groß ist die Wahrscheinlichkeit, dass die Anzahl der Aufwärtspunkte eine gerade Zahl ist?
  2. Wie hoch ist die Wahrscheinlichkeit, dass die Anzahl der Aufwärtspunkte eine gerade Zahl und größer als 4 Zoll ist?
    Fügen Sie hier eine Bildbeschreibung ein
    Beispiel 2. Die Wahrscheinlichkeit, dass ein bestimmtes Tier nach der Geburt 20 Jahre alt wird, beträgt 0,7 und die Wahrscheinlichkeit, 25 Jahre alt zu werden, beträgt 0,56 Finden Sie heraus, wie lange dieses Tier, das jetzt 20 Jahre alt ist, wahrscheinlich 25 Jahre alt wird.
    Fügen Sie hier eine Bildbeschreibung ein

Gesamtwahrscheinlichkeitsformel

Zunächst müssen wir verstehen, was „Aufteilung des Probenraums“ [auch bekannt als „vollständige Ereignisgruppe““ ist.
Wir werden erfüllen (vorausgesetzt, der Probenraum Ω ist die Summe zweier Ereignisse A und A')

  1. A1, A2,…,An ist eine Reihe sich gegenseitig ausschließender Ereignisse
  2. A1 U A2 U,…,An=Ω

Eine solche Menge von Ereignissen wird als „vollständige Ereignisgruppe“ bezeichnet. Kurz gesagt, Ereignisse schließen sich gegenseitig aus und die Vereinigung aller Ereignisse ist der gesamte Probenraum (unvermeidliche Ereignisse).
Fügen Sie hier eine Bildbeschreibung ein
Die Wahrscheinlichkeit, dass B im gesamten Ω auftritt, beträgt:
Fügen Sie hier eine Bildbeschreibung ein

Formelableitung

Nehmen Sie an, dass der Probenraum S die Summe zweier Ereignisse A und A' ist.
Fügen Sie hier eine Bildbeschreibung ein
In der Abbildung oben ist der rote Teil das Ereignis A und der grüne Teil das Ereignis A‘, die zusammen den Probenraum S bilden.
In diesem Fall kann Ereignis B in zwei Teile geteilt werden.
Fügen Sie hier eine Bildbeschreibung ein
Das heißt,
Fügen Sie hier eine Bildbeschreibung ein
in der Ableitung des vorherigen Abschnitts wissen wir,
Fügen Sie hier eine Bildbeschreibung ein
dass es sich also
Fügen Sie hier eine Bildbeschreibung ein
um die Gesamtwahrscheinlichkeitsformel handelt. Dies bedeutet, dass, wenn A und A' eine Teilung des Stichprobenraums bilden, die Wahrscheinlichkeit des Ereignisses B gleich der Wahrscheinlichkeit von A und A' multipliziert mit der Summe der bedingten Wahrscheinlichkeiten von B für die beiden Ereignisse ist.

Berechnungsfall

Beispiel 1: Es gibt eine Charge von Produkten desselben Modells. Es ist bekannt, dass 30 % der Produkte von der ersten Fabrik, 50 % von der zweiten Fabrik und 20 % von der dritten Fabrik hergestellt werden Es ist auch bekannt, dass die Fehlerquote der Produkte dieser drei Fabriken jeweils 2 %, 1 % und 1 % beträgt. Wie hoch ist die Wahrscheinlichkeit, dass eines dieser Produkte fehlerhaft ist?
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Beispiel 2: Es gibt einen Hersteller elektronischer Geräte, der Komponenten von drei Komponentenherstellern verwendet. Den bisherigen Aufzeichnungen zufolge liegen folgende Daten vor:
Fügen Sie hier eine Bildbeschreibung ein
Es wird davon ausgegangen, dass die Produkte dieser drei Fabriken im Lager gleichmäßig gemischt sind und keine Unterscheidungsmerkmale aufweisen.

  1. Wählen Sie zufällig eine Komponente aus dem Lager aus und ermitteln Sie die Wahrscheinlichkeit, dass es sich um ein fehlerhaftes Produkt handelt.
  2. Wählen Sie zufällig eine Komponente aus dem Lager aus. Wenn bekannt ist, dass es sich bei der Komponente um ein fehlerhaftes Produkt handelt, analysieren Sie, aus welcher Fabrik das Produkt stammt und wie hoch die Wahrscheinlichkeit ist, dass das Produkt von drei Fabriken hergestellt wird. Finden Sie diese Wahrscheinlichkeiten.
    Fügen Sie hier eine Bildbeschreibung ein

Bayesianisch

Bayesianische Entscheidungsfindung

Angenommen, wir haben jetzt einen Datensatz, der aus zwei Datentypen besteht. Die Datenverteilung ist wie in der folgenden Abbildung dargestellt:
Fügen Sie hier eine Bildbeschreibung ein
Wir verwenden nun p1(x,y), um darzustellen, dass der Datenpunkt (x,y) zur Kategorie gehört 1 (in der Abbildung durch den roten Punkt gekennzeichnet) Kategorie), verwenden Sie p2(x,y), um die Wahrscheinlichkeit darzustellen, dass der Datenpunkt (x,y) zur Kategorie 2 gehört (die durch das blaue Dreieck in der Abbildung dargestellte Kategorie). , dann können Sie für einen neuen Datenpunkt (x,y) die folgenden Regeln verwenden, um seine Kategorie zu bestimmen:

  1. Wenn p1(x,y)>p2(x,y), dann ist die Kategorie 1
  2. Wenn p1(x,y)<p2(x,y), dann ist die Kategorie 2.
    Das heißt, wir wählen die Kategorie, die der hohen Wahrscheinlichkeit entspricht. Dies ist die Kernidee der Bayes'schen Entscheidungstheorie, die darin besteht, die Entscheidung mit der höchsten Wahrscheinlichkeit zu wählen. Wir haben die Kernidee der Bayes'schen Entscheidungstheorie bereits verstanden: Die Implementierung von Bayes' ist die Berechnung der Wahrscheinlichkeiten von p1 und p2.

Bayesianische Ableitung

Durch Verformen der bedingten Wahrscheinlichkeitsformel können Sie die folgende Form erhalten: Eine weitere Verformung der bedingten Wahrscheinlichkeit wird
Fügen Sie hier eine Bildbeschreibung ein
durch die Gesamtwahrscheinlichkeitsformel erhalten. In der bedingten Wahrscheinlichkeit nennen wir P (A) „vorherige Wahrscheinlichkeit“ (vorherige Wahrscheinlichkeit), das heißt, wann Ereignis B tritt ein. Vorher haben wir die Wahrscheinlichkeit von Ereignis A beurteilt. P(A|B) wird als „posteriore Wahrscheinlichkeit“ bezeichnet. Dies ist unsere Neubewertung der Wahrscheinlichkeit von Ereignis A nach dem Eintreten von Ereignis B. P(B|A)/P(B) wird als „Wahrscheinlichkeit“ bezeichnet, ein Anpassungsfaktor, der die geschätzte Wahrscheinlichkeit näher an die wahre Wahrscheinlichkeit heranführt. Daher kann die bedingte Wahrscheinlichkeit als die folgende Formel verstanden werden:
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein



后验概率 = 先验概率 x 调整因子

Das ist es, was Bayes'sche Folgerung bedeutet. Wir schätzen zunächst eine „vorherige Wahrscheinlichkeit“ und addieren dann die experimentellen Ergebnisse, um zu sehen, ob das Experiment die „vorherige Wahrscheinlichkeit“ erhöht oder schwächt, wodurch wir eine „hintere Wahrscheinlichkeit“ erhalten, die näher an der Wahrheit liegt.

Wenn hier die „Möglichkeitsfunktion“ P(B|A)/P(B)>1 ist, bedeutet dies, dass die „vorherige Wahrscheinlichkeit“ erhöht wird und die Wahrscheinlichkeit des Ereignisses A größer wird; wenn die „Möglichkeitsfunktion“ = 1 bedeutet Dieses Ereignis B hilft nicht bei der Beurteilung der Möglichkeit von Ereignis A. Wenn die „Möglichkeitsfunktion“ <1 ist, bedeutet dies, dass die „vorherige Wahrscheinlichkeit“ geschwächt ist und die Möglichkeit von Ereignis A kleiner wird.

Berechnungsfall

Um unser Verständnis der Bayes'schen Folgerung zu vertiefen, nehmen wir ein Beispiel.
Fügen Sie hier eine Bildbeschreibung ein
Es gibt zwei identische Schüsseln. Schüssel eins enthält 30 Fruchtbonbons und 10 Schokoladenbonbons, und Schüssel zwei enthält jeweils 20 Fruchtbonbons und 20 Schokoladenbonbons. Wählen Sie nun zufällig eine Schüssel aus, nehmen Sie eine Süßigkeit heraus und stellen Sie fest, dass es sich um Fruchtsüßigkeiten handelt. Wie groß ist die Wahrscheinlichkeit, dass diese Fruchtsüßigkeit aus Schale Nr. 1 stammt?

Wir gehen davon aus, dass H1 Schüssel Nr. 1 und H2 Schüssel Nr. 2 darstellt. Da die beiden Schalen gleich sind, gilt P (H1) = P (H2), dh vor dem Herausnehmen der Fruchtbonbons haben die beiden Schalen die gleiche Wahrscheinlichkeit, ausgewählt zu werden. Daher ist P(H1)=0,5, wir nennen diese Wahrscheinlichkeit „vorherige Wahrscheinlichkeit“, das heißt, vor der Durchführung des Experiments beträgt die Wahrscheinlichkeit, aus Schüssel Nr. 1 zu kommen, 0,5.

Nehmen wir weiter an, dass E Fruchtzucker darstellt, so stellt sich bei gegebenem E die Frage, wie hoch die Wahrscheinlichkeit ist, dass er aus Schale Nr. 1 stammt, d. h., finden Sie P(H1|E). Wir nennen diese Wahrscheinlichkeit „posteriore Wahrscheinlichkeit“, was die Korrektur von P(H1) nach dem Eintreten des Ereignisses E darstellt.

Gemäß der bedingten Wahrscheinlichkeitsformel ist
Fügen Sie hier eine Bildbeschreibung ein
bekannt, dass P(H1) gleich 0,5 ist und P(E|H1) die Wahrscheinlichkeit ist, Fruchtbonbons aus Schüssel Nr. 1 zu entnehmen, die 30 ÷ (30+) beträgt 10)=0,75. Finden Sie dann P(E), um die Antwort zu erhalten. Gemäß der Formel für die Gesamtwahrscheinlichkeit erhalten wir
Fügen Sie hier eine Bildbeschreibung ein
also, wenn
Fügen Sie hier eine Bildbeschreibung ein
wir die Zahlen in die ursprüngliche Gleichung einsetzen,
Fügen Sie hier eine Bildbeschreibung ein
Folgendes: Dies zeigt, dass die Wahrscheinlichkeit, aus Schüssel Nummer eins zu kommen, 0,6 beträgt. Mit anderen Worten: Nach der Entfernung von Fruktose erhöhte sich die Wahrscheinlichkeit eines H1-Ereignisses.

Denken Sie gleichzeitig über eine andere Frage nach: Wenn wir diesen Algorithmus verwenden, müssen wir nur die Kategorie kennen, wenn wir die spezifische Kategoriewahrscheinlichkeit nicht kennen müssen, d. h. P(H1|E)=0,6 oben Aus Schüssel Nr. 1 müssen wir P (E) berechnen. Ist das eine vollständige Wahrscheinlichkeit? Um das zu wissen, müssen wir nur die Größen von P(H1|E) und P(H2|E) vergleichen und die maximale Wahrscheinlichkeit ermitteln. In diesem Fall sind die Nenner beider gleich, sodass wir nur die Zähler vergleichen müssen. Das heißt, vergleichen Sie die Größen von P(E|H1)P(H1) und P(E|H2)P(H2). Um den Rechenaufwand zu reduzieren, muss daher nicht die vollständige Wahrscheinlichkeitsformel verwendet werden in der tatsächlichen Programmierung.

Die Analyse früherer Daten zeigt, dass die Erfolgsquote des Produkts bei einer guten Einstellung der Maschine 90 % beträgt, und wenn ein bestimmter Fehler in der Maschine auftritt, liegt die Erfolgsquote bei 30 %. Wenn die Maschine jeden Morgen gestartet wird, beträgt die Wahrscheinlichkeit, dass die Maschine gut eingestellt ist, 75 %. Wie groß ist die Wahrscheinlichkeit, dass die Maschine gut eingestellt ist, wenn bekannt ist, dass das erste Produkt am Morgen ein qualifiziertes Produkt ist?

Fügen Sie hier eine Bildbeschreibung ein
Die Inzidenzrate von Leberkrebs unter Bewohnern eines bestimmten Gebiets beträgt 0,0004, und für die Volkszählung wird derzeit die Alpha-Fetoprotein-Methode verwendet. Medizinische Untersuchungen zeigen, dass bei Labortests die Möglichkeit einer Fehldiagnose besteht. Es ist bekannt, dass 99 % der Testergebnisse von Menschen mit Leberkrebs positiv (erkrankt) sind, während 99,9 % der Testergebnisse von Menschen ohne Leberkrebs negativ (krankheitsfrei) sind. Wenn das Testergebnis von jemandem positiv ist, fragen Sie ihn wenn er wirklich erkrankt ist. Wie hoch ist die Wahrscheinlichkeit, an Leberkrebs zu erkranken? .
Fügen Sie hier eine Bildbeschreibung ein

Naiver Bayes

Naive Bayes ist ein einfacher, aber äußerst leistungsstarker Vorhersagemodellalgorithmus. Er wird Naive Bayes genannt, weil er davon ausgeht, dass jedes Merkmal unabhängig ist.
Wenn mehrere Merkmale zur Vorhersage einer bestimmten Klassifizierung vorhanden sind, kann jedes Merkmal, da davon ausgegangen wird, dass es unabhängig ist, in das Ergebnis der Wahrscheinlichkeitsberechnung der Klassifizierung unter einem einzelnen Merkmal zerlegt werden.
Wenn Sie beispielsweise eine Spam-E-Mail erhalten,

  • ist die Wahrscheinlichkeit von Immobilien,
  • ist die Kreditwahrscheinlichkeit
  • ist die Wahrscheinlichkeit von Immobilien und Krediten
    Fügen Sie hier eine Bildbeschreibung ein
    , vereinfacht zu:
    Fügen Sie hier eine Bildbeschreibung ein
    Das naive Bayes-Modell besteht aus zwei Arten von Wahrscheinlichkeiten
    1. Die Wahrscheinlichkeit jeder Kategorie P(CJ)
    2. Die bedingte Wahrscheinlichkeit jedes Attributs P(AI|CJ)

Formelableitung

Gemäß der Bayes'schen Formel (unter der Annahme von Merkmal X (mehrere X1, X2
... )
Weil Merkmal X mehrdimensional ist P ( Y
|X)=P(Y) * (P(( X1 , ( (Größe, Gewicht). Wenn zu diesem Zeitpunkt die X-Merkmale einer Person angegeben werden, um zu bestimmen, ob sie männlich oder weiblich ist, handelt es sich tatsächlich um einen Vergleich der angegebenen spezifischen Größe und des angegebenen Gewichts. Welches ist eher männlich oder weiblich? kann durch die Formel P(Y|(X1,X2…Xn))=P(Y) * (P(X1|Y) P(X2|Y) …P(Xn|Y) / P(X1) P bestimmt werden (X2) …P(Xn)) Im Fall von Mann oder Frau sind P(Y) [die vorhergesagten Wahrscheinlichkeiten von Mann und Frau sind 0,5 und 0,5] und P(X1) P(X2) … P(Xn) ) . Dasselbe. Tatsächlich müssen Sie nur die Wahrscheinlichkeiten von P(X1|Y) P(X2|Y) ...P(Xn|Y) vergleichen. Diejenige mit der größeren Wahrscheinlichkeit ist das Klassifizierungsergebnis.









Berechnungsfall

Die einzelnen Daten lauten wie folgt:
Fügen Sie hier eine Bildbeschreibung ein
Berechnung: Größe ist groß, Gewicht ist mittel, Schuhgröße ist mittel. Ist diese Person männlich oder weiblich?
X1: steht für Körpergröße.
X2: steht für Gewicht.
X3: steht für Schuhgröße.
Y: steht für Kategorie. Y1 steht für Männer, Y2 steht für Frauen. Unbekannte Darstellung Yj
P(Yj|X1,X2,X3) = P(Yj) * (P(X1|Yj) P(X2|Yj) …P(Xn|Yj) / P(X1) P(X2) …P (Xn))
Da die A-priori-Wahrscheinlichkeit und der Nenner beider Kategorien gleich sind, werden nur die Zähler verglichen

P(X1X2X3|Yj) = P(X1|Yj) P(X2|Yj) …P(Xn|Yj)

Angenommen, die Kategorie ist j=1. Y1 ist männlich

P(X1|Y1) = 2/4     就是男生(1-4行)中身高是高(1-2行)的概率
P(X2|Y1) = 2/4
P(X3|Y1) = 1/4
P(X1|Y1)P(X2|Y1) P(X3|Y1) = 2/4*2/4*1/4 = 1/16

Angenommen, die Kategorie ist j=2. Y1 ist weiblich

P(X1|Y2) = 0        就是女生(5-8行)中身高是高(没有)的概率
P(X2|Y2) = 2/4
P(X3|Y2) = 2/4
P(X1|Y2) P(X2|Y2)P(X3|Y2)) = 0*2/4*2/4 = 0
C1>C2

Daraus lässt sich schließen: Die Körpergröße ist hoch, das Gewicht ist mittel und die Schuhgröße ist mittel. Diese Person ist männlich. In diesem Fall ist die Beurteilung relativ einfach,
da es sich bei der angegebenen Körpergröße um bestimmte Daten handelt. Wenn ja sind kontinuierliche Daten

1. Diskreter Typ: Einige Zufallsvariablen haben eine begrenzte Anzahl möglicher unterschiedlicher Werte oder eine unendliche Anzahl möglicher Werte. Man kann auch sagen, dass die Wahrscheinlichkeit 1 nach einer bestimmten Regel auf verschiedene mögliche Werte verteilt wird.
2. Kontinuierlicher Typ: Der Wert der Zufallsvariablen X kann nicht einzeln aufgelistet werden, sondern kann nur ein beliebiger Punkt innerhalb eines bestimmten Intervalls auf der Zahlenachse sein.

Fügen Sie hier eine Bildbeschreibung ein
Voraussetzungen: Körpergröße 180 cm, Gewicht 120 cm, Schuhgröße 41. Ist diese Person männlich oder weiblich?
Die Formel ist immer noch dieselbe wie oben, aber Größe, Gewicht und Schuhgröße sind kontinuierliche Variablen und diskrete Methoden können nicht zur Berechnung der Wahrscheinlichkeit verwendet werden. Unter der Annahme, dass Körpergröße, Gewicht und Schuhgröße normal verteilt sind, werden Mittelwert und Varianz anhand von Stichproben berechnet und die Dichtefunktion der Normalverteilung erhalten. Mit der Dichtefunktion kann der Dichtefunktionswert eines Punktes berechnet werden. Wenn beispielsweise die durchschnittliche Körpergröße von Männern 179,5 beträgt und die Standardabweichung 3,697 beträgt, beträgt die Wahrscheinlichkeit, größer als 180 zu sein, 0,1069

Python-Implementierung

#%%
import numpy as np
import pandas as pd
df = pd.read_excel('连续性.xlsx',sheet_name="Sheet1",index_col=0)
# 计算男女在每个特征维度的方差和均值
df2 = df.groupby("性别").agg([np.mean, np.var])
print(df2)

#%%

male_high_mean = df2.loc["男","身高"]["mean"]
male_high_var = df2.loc["男","身高"]["var"]

male_weight_mean = df2.loc["男","体重"]["mean"]
male_weight_var = df2.loc["男","体重"]["var"]

male_code_mean = df2.loc["男","鞋码"]["mean"]
male_code_var = df2.loc["男","鞋码"]["var"]
from scipy import stats

# pdf ——概率密度函数标准形式是,算出在男性中身高180的概率
male_high = stats.norm.pdf(180,male_high_mean,male_high_var)
# 算出在男性中体重120的概率
male_weight = stats.norm.pdf(120, male_weight_mean, male_weight_var)
# 算出在男性中鞋码41的概率
male_code = stats.norm.pdf(41, male_code_mean, male_code_var)
fz=(male_high*male_weight*male_code)
print(fz)

female_high_mean = df2.loc["女","身高"]["mean"]
female_high_var = df2.loc["女","身高"]["var"]

female_weight_mean = df2.loc["女","体重"]["mean"]
female_weight_var = df2.loc["女","体重"]["var"]

female_code_mean = df2.loc["女","鞋码"]["mean"]
female_code_var = df2.loc["女","鞋码"]["var"]


#计算在女性分类中的三种特征的概率
female_high = stats.norm.pdf(180, female_high_mean, female_high_var)
female_weight = stats.norm.pdf(120, female_weight_mean, female_weight_var)
female_code = stats.norm.pdf(41, female_code_mean, female_code_var)
ffz=female_high*female_weight*female_code
print(ffz)
if fz>ffz:
    print("男性")
else :
    print("女性")

Drei Sprachfilter zum Üben

TF-IDF-Merkmalsvektor

TF-IDF-Prinzip

Der F-IDF-Merkmalsvektor ist eine Möglichkeit, Textdaten in eine numerische Darstellung umzuwandeln, wobei jede Dimension ein Wort darstellt und jede Stichprobe (d. h. ein Text) als Vektor dargestellt wird.

TF-IDF ist eine häufig verwendete Gewichtungstechnik zum Informationsabruf und Text-Mining.

TF-IDF (Term Frequency-Inverse Document Frequency) ist ein Algorithmus, der häufig beim Informationsabruf und bei der Textdatenanalyse verwendet wird. Er wird verwendet, um die Bedeutung eines Wortes für ein Dokument oder einen der Texte in einer Textsammlung zu messen.

TF (Term Frequency) bezieht sich auf die Worthäufigkeit, die angibt, wie oft das Wort in einem bestimmten Text vorkommt. IDF (Inverse Document Frequency) bezieht sich auf die inverse Dokumenthäufigkeit, mit der die Häufigkeit des Vorkommens des Wortes in der gesamten Textsammlung gemessen wird, also wie viele Texte das Wort vorkommt. Je häufiger ein Wort in einer Textsammlung vorkommt, desto geringer ist seine umgekehrte Dokumenthäufigkeit, was darauf hindeutet, dass das Wort für die Unterscheidung verschiedener Texte weniger wichtig ist.

Daher wird der TF-IDF-Wert durch Multiplikation der Termhäufigkeit (TF) und der inversen Dokumenthäufigkeit (IDF) erhalten. Für einen einzelnen Text gilt: Je höher der TF-IDF-Wert, desto wichtiger ist das Wort für den Text und desto repräsentativer ist das durch den Text dargestellte Thema; und in der gesamten Textsammlung ist der TF-IDF-Wert umso höher Dies bedeutet, dass das Wort verschiedene Texte gut unterscheiden kann und umso besser das durch die Textsammlung dargestellte Thema darstellen kann.

Der TF-IDF-Algorithmus wird häufig in der Informationsbeschaffung, Textklassifizierung, Schlüsselwortextraktion und anderen Bereichen eingesetzt.

Angenommen, wir haben die folgenden zwei Texte:

  1. Der schnelle Braunfuchs springt über den faulen Hund.
  2. Der Braunfuchs ist schnell und der Blauhund ist faul.

Zunächst müssen diese Texte vorverarbeitet werden, einschließlich der Entfernung von Satzzeichen, Stoppwörtern (the, is and) usw. und der Konvertierung jedes Textes in eine Wortliste. Für diese beiden Texte sind folgende Wortlisten möglich:

['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']
['brown', 'fox', 'quick', 'blue', 'dog', 'lazy']

Als nächstes müssen wir berechnen, wie oft jedes Wort in jeder Stichprobe vorkommt, also die Begriffshäufigkeit (TF, Begriffshäufigkeit). Dieser Prozess kann mithilfe der CountVectorizer-Klasse implementiert werden. Am Beispiel des ersten Beispiels lautet sein Worthäufigkeitsvektor:

[1, 1, 1, 1, 1, 1]

Das heißt, „quick“, „brown“, „fox“, „jumps“, „lazy“ und „dog“ erscheinen alle einmal im ersten Beispiel.
Als nächstes muss die inverse Dokumenthäufigkeit (IDF) berechnet werden, um die Wichtigkeit jedes Wortes zu messen. Die Berechnungsformel von IDF lautet:
Fügen Sie hier eine Bildbeschreibung ein
wobei N die Gesamtzahl der Dokumente darstellt, hier sind es 2 Texte, und df(t) die Anzahl der Dokumente darstellt, die das Wort t enthalten. Am Beispiel der beiden oben genannten Texte können wir den IDF-Wert jedes Wortes ermitteln:

[0.0, 0.0, 0.0, 0.6931471805599453, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.6931471805599453, 0.0, 0.0]

Unter diesen kommt „Sprünge“ nur einmal im ersten Beispiel und nur einmal in allen Dokumenten vor, sodass sein IDF-Wert
log (2/1) = 0,6931 ist. „quick“, „brown“, „fox“, „lazy“ und „dog“ kommen in beiden Dokumenten vor, daher sind ihre IDF-Werte 0.

Schließlich muss der TF-Vektor jedes Textes mit dem entsprechenden IDF-Vektor multipliziert werden, um den TF-IDF-Merkmalsvektor zu erhalten. Am Beispiel des ersten Textes lautet sein TF-IDF-Vektor:

[0.0, 0.0, 0.0, 0.6931471805599453, 0.0, 0.0]

Da „jumps“ einmal im ersten Text und nur einmal in allen Dokumenten vorkommt, ist sein TF-IDF-Wert
1*log(2/1), die TF-IDF-Werte anderer Wörter sind alle 0.

Analog können die TF-IDF-Merkmalsvektoren aller Texte ermittelt werden. Es ist zu beachten, dass die Merkmalsvektorabmessungen jedes Textes normalerweise gleich sind, sodass bei der Berechnung von TF-IDF alle Texte durchlaufen werden müssen.

Der Unterschied zwischen TfidfVectorizer und CountVectorizer

TfidfVectorizer berechnet die Wichtigkeit von Wörtern im Text, also den TF-IDF-Wert.
CountVectorizer zählt nur, wie oft ein Wort im Text vorkommt.

Im Folgenden wird der Unterschied zwischen TfidfVectorizer und CountVectorizer anhand realer Daten veranschaulicht:

Angenommen, wir haben die folgenden drei Dokumente:

  • Dokument A: Das Wetter ist klar, die Temperatur ist moderat und die Sonne scheint hell.
  • Dokument B: Das Wetter ist bewölkt, mit gemäßigten Temperaturen und gelegentlich leichtem Regen.
  • Dokument C: Das Wetter ist bewölkt, die Temperatur ist niedrig und es regnet.

Wir können TfidfVectorizer und CountVectorizer verwenden, um eine Merkmalsvektorisierung für diese drei Dokumente durchzuführen und ihre Worthäufigkeitsmatrizen zu erhalten.

Konkret können Sie mit CountVectorizer die folgende Worthäufigkeitsmatrix erhalten:

Wortschatz Dokument A Dokument B Dokument C
Wetter 1 1 1
Temperatur 1 1 1
geeignet 1 1 0
sonnig 1 0 0
Teilweise wolkig 0 1 0
Gelegentlich leichter Regen 0 1 0
bewölkter Tag 0 0 1
Auf der niedrigen Seite 0 0 1
Es regnet 0 0 1

Mit TfidfVectorizer können Sie die folgende Worthäufigkeitsmatrix erhalten:

Wortschatz Dokument A Dokument B Dokument C
Wetter 0,00 0,00 0,58
Temperatur 0,42 0,42 0,42
geeignet 0,58 0,58 0,00
sonnig 0,81 0,00 0,00
Teilweise wolkig 0,00 0,81 0,00
Gelegentlich leichter Regen 0,00 0,81 0,00
bewölkter Tag 0,00 0,00 0,58
Auf der niedrigen Seite 0,00 0,00 0,81
Es regnet 0,00 0,00 0,58

Wie aus der obigen Worthäufigkeitsmatrix ersichtlich ist, berücksichtigt CountVectorizer nur die Häufigkeit jedes Wortes im aktuellen Dokument, während TfidfVectorizer sowohl die Häufigkeit eines Wortes im aktuellen Trainingstext als auch die Anzahl anderer Trainingstexte berücksichtigt, die dieses Wort enthalten. Der Kehrwert von , sodass TfidfVectorizer die Unterschiede zwischen verschiedenen Dokumenten besser widerspiegeln kann.

TfidfVectorizer- und CountVectorizer-Instanzen

CountVectorizer zählt die Worthäufigkeit

#%%

postingList=['my my dog has flea problems help please',                #切分的词条
            'maybe not take him to dog park stupid',
             'my dalmation is so cute I love him',
             'stop posting stupid worthless garbage',
             'mr licks ate my steak how to stop him',
             'quit buying worthless dog food stupid']
classVec = [0,1,0,1,0,1]                                                                   #类别标签向量,1代表侮辱性词汇,0代表不是

from sklearn.feature_extraction.text import CountVectorizer
# 初始化CountVectorizer并进行文本特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(postingList)

# 显示特征向量和对应的单词
print(X.toarray())
print(vectorizer.get_feature_names())

Ausgabe

[[0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 2 0 0 1 0 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0]
 [0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1]
 [1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0]
 [0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1]]
['ate', 'buying', 'cute', 'dalmation', 'dog', 'flea', 'food', 'garbage', 'has', 'help', 'him', 'how', 'is', 'licks', 'love', 'maybe', 'mr', 'my', 'not', 'park', 'please', 'posting', 'problems', 'quit', 'so', 'steak', 'stop', 'stupid', 'take', 'to', 'worthless']
12

Beachten Sie, dass alle Wörter dedupliziert und als Merkmalsspalten verwendet werden. Die Datenzeile ist das aktuelle Dokument und die Daten in der Zeile geben an, wie oft dieses Merkmalswort vorkommt.

TfidfVectorizer-Statistiken tf-idf

#%%
from sklearn.feature_extraction.text import TfidfVectorizer

# 初始化TfidfVectorizer
tvectorizer = TfidfVectorizer(stop_words='english')

# 转换文本数据到词袋模型
X_train = tvectorizer.fit_transform(postingList)
# 显示特征向量和对应的单词
print(X_train.toarray())
print(vectorizer.get_feature_names())

Ausgabe

[[0.         0.         0.         0.         0.37115593 0.53611046
  0.         0.         0.53611046 0.         0.         0.
  0.         0.         0.         0.53611046 0.         0.
  0.         0.         0.        ]
 [0.         0.         0.         0.         0.40249409 0.
  0.         0.         0.         0.         0.         0.58137639
  0.         0.58137639 0.         0.         0.         0.
  0.         0.40249409 0.        ]
 [0.         0.         0.57735027 0.57735027 0.         0.
  0.         0.         0.         0.         0.57735027 0.
  0.         0.         0.         0.         0.         0.
  0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.
  0.         0.51136725 0.         0.         0.         0.
  0.         0.         0.51136725 0.         0.         0.
  0.41932846 0.3540259  0.41932846]
 [0.46262479 0.         0.         0.         0.         0.
  0.         0.         0.         0.46262479 0.         0.
  0.46262479 0.         0.         0.         0.         0.46262479
  0.37935895 0.         0.        ]
 [0.         0.46468841 0.         0.         0.32170956 0.
  0.46468841 0.         0.         0.         0.         0.
  0.         0.         0.         0.         0.46468841 0.
  0.         0.32170956 0.38105114]]
['ate', 'buying', 'cute', 'dalmation', 'dog', 'flea', 'food', 'garbage', 'has', 'help', 'him', 'how', 'is', 'licks', 'love', 'maybe', 'mr', 'my', 'not', 'park', 'please', 'posting', 'problems', 'quit', 'so', 'steak', 'stop', 'stupid', 'take', 'to', 'worthless']

Trainieren Sie einen Naive-Bayes-Klassifikator

Wir erhalten zunächst den Termvektor

import numpy as np
postingList=['my dog has flea problems help please',                #切分的词条
            'maybe not take him to dog park stupid',
             'my dalmation is so cute I love him',
             'stop posting stupid worthless garbage',
             'mr licks ate my steak how to stop him',
             'quit buying worthless dog food stupid']
classVec = np.array([0,1,0,1,0,1])    

from sklearn.feature_extraction.text import CountVectorizer
# 初始化CountVectorizer并进行文本特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(postingList)

# 显示特征向量和对应的单词
v=np.array(X.toarray())
print(v)
fn=np.array(vectorizer.get_feature_names())
print(fn)

Ausgabe


[[0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0]
 [0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1]
 [1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0]
 [0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1]]
['ate' 'buying' 'cute' 'dalmation' 'dog' 'flea' 'food' 'garbage' 'has'
 'help' 'him' 'how' 'is' 'licks' 'love' 'maybe' 'mr' 'my' 'not' 'park'
 'please' 'posting' 'problems' 'quit' 'so' 'steak' 'stop' 'stupid' 'take'
 'to' 'worthless']

Als nächstes können wir einen naiven Bayes-Klassifikator mithilfe der Termvektoren trainieren.

"""
  通过传入单词向量和分类结果训练数据集获取到每个特征在不同分类下的条件概率,以及对应分类的先验概率。
  利用贝叶斯分类器对文档进行分类时,要计算多个概率的乘积以获得文档属于某个类别的概率,
  即计算p(w0|1)p(w1|1)p(w2|1)。
  如果其中有一个概率值为0,那么最后相乘的结果也为0
  这样是不合理的,为了降低这种影响,可以将所有词的出现数初始化为1,并将分母初始化为2。这种做法就叫做拉普拉斯平滑(Laplace Smoothing)又被称为加1平滑,
  是比较常用的平滑方法,它就是为了解决0概率问题,具体参考拉普拉斯平滑目录。
"""
def trainData(vecList,classVec):
    #获取先验概率P(侮辱类),    P(非侮辱类)=1-P(侮辱类)
    PϹ侮辱类先验Ͻ=np.sum(classVec)/len(classVec)
    #找到所有classVec==0非侮辱类索引行并取得数据行。
    vec0=vecList[np.where(classVec==0)]
    #找到所有classVec==1侮辱类索引行并取得数据行。
    vec1=vecList[np.where(classVec==1)]
    #设置拉普拉斯平滑因子为1: ,分类的种类是2中所有分子+1,分母+2
    a=1
    #让分子都加上1
    vec0=np.add(vec0,a)
    vec1=np.add(vec1,a)
    #计算每个特征在对应分类下的条件概率,分母加上2
    PϹ特征l非侮辱类Ͻ=np.sum(vec0,axis=0)/(np.sum(vec0)+a*2)
    PϹ特征l侮辱类Ͻ=np.sum(vec1,axis=0)/(np.sum(vec1)+a*2)
    return PϹ特征l侮辱类Ͻ,PϹ特征l非侮辱类Ͻ,PϹ侮辱类先验Ͻ

PϹ特征l侮辱类Ͻ,PϹ特征l非侮辱类Ͻ,PϹ侮辱类先验Ͻ=(trainData(v,classVec))
print(PϹ特征l非侮辱类Ͻ,PϹ特征l侮辱类Ͻ,PϹ侮辱类先验Ͻ)

Ausgabe:

[0.03389831 0.02542373 0.03389831 0.03389831 0.03389831 0.03389831
 0.02542373 0.02542373 0.03389831 0.03389831 0.04237288 0.03389831
 0.03389831 0.03389831 0.03389831 0.02542373 0.03389831 0.05084746
 0.02542373 0.02542373 0.03389831 0.02542373 0.03389831 0.02542373
 0.03389831 0.03389831 0.03389831 0.02542373 0.02542373 0.03389831
 0.02542373]

 [0.02631579 0.03508772 0.02631579 0.02631579 0.04385965 0.02631579
 0.03508772 0.03508772 0.02631579 0.02631579 0.03508772 0.02631579
 0.02631579 0.02631579 0.02631579 0.03508772 0.02631579 0.02631579
 0.03508772 0.03508772 0.02631579 0.03508772 0.02631579 0.03508772
 0.02631579 0.02631579 0.03508772 0.05263158 0.03508772 0.03508772
 0.04385965] 
0.5

Referenz für Laplace-Glättungskonzepte und Beispiele: https://github.com/lzeqian/machinelearntry/tree/master/sklearn_bayes/%E6%8B%89%E6%99%AE%E6%8B%89%E6%96 %AF %E5%B9%B3%E6%BB%91

  • P (Merkmal l Nicht-Beleidigungskategorie) ist die Wahrscheinlichkeit eines Merkmals unter der Nicht-Beleidigungskategorie, die der Zähler der bedingten Wahrscheinlichkeit von P (Nicht-Beleidigungskategorie) ist. Das fünfte Merkmal ist Hund, was die Wahrscheinlichkeit von ist P (Hund | Nicht-Beleidigungskategorie) beträgt 0,03389831.
  • P (Merkmal l Beleidigungsklasse) ist die Wahrscheinlichkeit eines bestimmten Merkmals unter der Beleidigungsklasse, die der Zähler der bedingten Wahrscheinlichkeit von P (Nicht-Beleidigungsklasse) ist. Das fünfte Merkmal ist Hund, das ist P (Hund | Beleidigungsklasse). ). Die Wahrscheinlichkeit beträgt 0,04385965 .
  • P (Priorität der Beleidigungsklasse) ist die A-priori-Wahrscheinlichkeit der Beleidigungsklasse.

Klassifizieren Sie mithilfe von Trainingsdaten

Nachdem Sie P (Feature-L-Nicht-Beleidigungsklasse), P (Feature-L-Beleidigungsklasse) und P (Beleidigungsklasse-Priorität), P (Nicht-Beleidigungsklasse-Priorität) = 1-P (Prioritäts-Beleidigungsklasse) erhalten haben, können Sie es später verwenden Diese Daten und das eingehende neue Vokabular werden zur Bestimmung der Klassifizierung verwendet.

'''
  注意求条件概率是找到对应的单词下在对应的分类的乘积,比如
  you    are     a     dog       as               b
  0.001 0.0005  0.03   0.666     0.3             0.99
  
  传入的矩阵就是
  1       1      1      1        0               0
   
  实际条件侮辱类概率就是
  P(you|侮辱类)*P(are|侮辱类)*P(a|侮辱类)*P(dog|侮辱类)
  乘积小数位太多就可能导致小数位溢出,需要使用两个乘数的log来防止溢出
  log(P(you|侮辱类)*P(are|侮辱类)*P(a|侮辱类)*P(dog|侮辱类))=log(P(you|侮辱类))+log(P(are|侮辱类))+log(P(a|侮辱类))+log(P(dog|侮辱类))
  为了通过计算直接获取到对应的这些特征单词的和,可以先求出所有特征的log值和传入的矩阵乘积在求和就是上面的结果
'''
def classResult(wordVec,PϹ特征l侮辱类Ͻ,PϹ特征l非侮辱类Ͻ,PϹ侮辱类先验Ͻ):
    PϹ侮辱类Ͻ=np.sum(np.log(PϹ特征l侮辱类Ͻ)*wordVec)+np.log(PϹ侮辱类先验Ͻ)
    PϹ非侮辱类Ͻ=np.sum(np.log(PϹ特征l非侮辱类Ͻ)*wordVec)+np.log(1-PϹ侮辱类先验Ͻ)
    return 1 if PϹ侮辱类Ͻ>PϹ非侮辱类Ͻ else 0
#测试的词汇
text=["you are a dog"]
testX = vectorizer.transform(text)
testV=np.array(testX.toarray())
print(classResult(testV,PϹ特征l侮辱类Ͻ,PϹ特征l非侮辱类Ͻ,PϹ侮辱类先验Ͻ))

Achten Sie auf die Multiplikation mehrerer Dezimalstellen und verwenden Sie die Protokollfunktion, um einen Dezimalüberlauf zu verhindern. Theoretische Referenz: https://github.com/lzeqian/machinelearntry/blob/master/sklearn_bayes/%E4%B8%8B%E6%BA% A2%E5% 87%BA/%E4%B9%98%E7%A7%AF%E7%BB%93%E6%9E%9C%E5%8F%96%E8%87%AA%E7%84%B6 %E5%AF %B9%E6%95%B0%E9%98%B2%E6%AD%A2%E4%B8%8B%E6%BA%A2%E5%87%BA.png

Vier-Naive-Bayes-Datenklassifizierung (sklearn)

Der Naive Bayes-Klassifikator ist ein Klassifikator für Klassifizierungsprobleme mit kleinen Merkmalsdimensionen und einer großen Anzahl von Trainingsmustern. Er geht davon aus, dass alle Merkmale unabhängig voneinander sind, sofern die Kategorie bekannt ist. Beim Erstellen eines Klassifikators muss lediglich die Verteilung der Trainingsstichproben jeder Kategorie auf jedem Dimensionsmerkmal einzeln geschätzt werden. Anschließend kann die bedingte Wahrscheinlichkeitsdichte jeder Kategorie ermittelt werden, wodurch die Anzahl der erforderlichen Parameter erheblich reduziert wird geschätzt werden. Das heißt, die gemeinsame Wahrscheinlichkeit der Beobachtung der Merkmale x1, x2, ..., xn bei gegebenem Zielmerkmalswert der Stichprobe ist gleich dem Produkt der Wahrscheinlichkeiten jedes einzelnen Merkmals.

In scikit-learn gibt es drei Klassen des Naive-Bayes-Klassifizierungsalgorithmus. Sie sind GaußianNB, MultinomialNB und BernoulliNB.

  • GaussianNB ist Naive Bayes, dessen Priorität die Gaußsche Verteilung ist.
  • MultinomialNB ist Naive Bayes mit A-priori-Multinomialverteilung.
  • BernoulliNB ist Naive Bayes mit apriorischer Bernoulli-Verteilung.

Wenn die Verteilung der Stichprobenmerkmale hauptsächlich aus kontinuierlichen Werten besteht, ist es besser, GaussianNB zu verwenden.
Wenn die meisten Stichprobenmerkmale multivariate diskrete Werte sind, ist MultinomialNB besser geeignet.
Wenn es sich bei den Stichprobenmerkmalen um binäre diskrete Werte oder sehr spärliche multivariate diskrete Werte handelt, sollte BernoulliNB verwendet werden.
Das zuvor erläuterte Prior-Wahrscheinlichkeitsmodell ist Naive Bayes, wobei die Prior-Wahrscheinlichkeit eine Polynomverteilung ist.

Bei der Nachrichtenklassifizierung handelt es sich um ein Mehrfachklassifizierungsproblem. Wir können MultinamialNB() verwenden, um unser Nachrichtenklassifizierungsproblem zu lösen. Die Nutzung der beiden anderen Funktionen wird vorerst nicht erweitert und kann selbst erlernt werden. MultinomialNB geht davon aus, dass die A-priori-Wahrscheinlichkeit des Merkmals eine Polynomverteilung ist, die der folgenden Formel entspricht:
Fügen Sie hier eine Bildbeschreibung ein
wobei P(Xj = Xjl | Y = Ck) die bedingte Wahrscheinlichkeit des l-ten Werts des Merkmals der j-ten Dimension von k ist -te Kategorie. mk ist die Anzahl der Proben im Trainingssatz, die die k-te Klasse ausgeben. λ ist eine Konstante größer als 0 und nimmt häufig den Wert 1 an, was einer Laplace-Glättung entspricht, und kann auch andere Werte annehmen.

Schauen wir uns als Nächstes die MultinamialNB-Funktion an, die nur drei Parameter hat:

Fügen Sie hier eine Bildbeschreibung ein

Die Parameterbeschreibung lautet wie folgt:

  • Alpha: optionaler Gleitkomma-Parameter, der Standardwert ist 1,0, wodurch tatsächlich eine Laplace-Glättung hinzugefügt wird, die in der obigen Formel λ ist. Wenn dieser Parameter auf 0 gesetzt ist, wird keine Glättung hinzugefügt;
  • fit_prior: Boolescher optionaler Parameter, standardmäßig True. Der boolesche Parameter fit_prior gibt an, ob die Prior-Wahrscheinlichkeit berücksichtigt werden soll. Wenn er falsch ist, haben alle Ausgaben der Stichprobenkategorie die gleiche Prior-Wahrscheinlichkeit der Kategorie. Andernfalls können Sie den dritten Parameter class_prior verwenden, um die Prior-Wahrscheinlichkeit selbst einzugeben, oder den dritten Parameter class_prior nicht eingeben und MultinomialNB die Prior-Wahrscheinlichkeit aus den Trainingssatzproben berechnen lassen. Die Prior-Wahrscheinlichkeit beträgt zu diesem Zeitpunkt P(Y=Ck) =mk /m. Dabei ist m die Gesamtzahl der Trainingssatzproben und mk die Anzahl der Trainingssatzproben, deren Ausgabe die k-te Kategorie ist.
  • class_prior: Optionaler Parameter, Standard ist None.
    Die Zusammenfassung lautet wie folgt:
    Fügen Sie hier eine Bildbeschreibung ein
    Darüber hinaus verfügt MultinamialNB über einige Methoden, die wir verwenden können:
    Fügen Sie hier eine Bildbeschreibung ein

Eine wichtige Funktion von MultinomialNB ist die Methode „partial_fit“. Diese Methode wird im Allgemeinen verwendet, wenn die Trainingssatzdaten sehr groß sind und nicht auf einmal in den Speicher geladen werden können. Zu diesem Zeitpunkt können wir den Trainingssatz in mehrere gleiche Teile aufteilen und partielle_fit wiederholt aufrufen, um den Trainingssatz Schritt für Schritt zu lernen, was sehr praktisch ist. GaußianNB und BernoulliNB haben ebenfalls ähnliche Funktionen. Nachdem wir die Daten mit der Fit-Methode oder der Partial_Fit-Methode von MultinomialNB angepasst haben, können wir Vorhersagen treffen. Derzeit gibt es drei Vorhersagemethoden, darunter Predict, Predict_log_proba und Predict_proba. Die Vorhersagemethode ist unsere am häufigsten verwendete Vorhersagemethode, die direkt die vorhergesagte Kategorieausgabe des Testsatzes liefert. predict_proba ist unterschiedlich und gibt die vorhergesagte Wahrscheinlichkeit für jede Kategorie der Testsatzstichprobe an. Es ist leicht zu verstehen, dass die Kategorie, die dem maximalen Wert der Wahrscheinlichkeit jeder von Predict_Proba vorhergesagten Kategorie entspricht, die Kategorie ist, die durch die Predict-Methode erhalten wird. Predict_log_proba ähnelt Predict_proba und liefert eine logarithmische Transformation der vorhergesagten Wahrscheinlichkeit jeder Kategorie der Testsatzstichprobe. Nach der Konvertierung ist die Kategorie, die dem Maximalwert der logarithmischen Wahrscheinlichkeit jeder von Predict_log_proba vorhergesagten Kategorie entspricht, die Kategorie, die von der Predict-Methode erhalten wird. Die spezifischen Details werden nicht erläutert. Bitte lesen Sie das offizielle Website-Handbuch.

Verwendung von Skearn zur Klassifizierung von Sina-Nachrichten

Daten werden geladen

Beispielquelle: https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html
Im Folgenden sind die Kategorien der Nachrichtenklassifizierung aufgeführt

C000008	财经
C000010	IT
C000013	健康
C000014	体育
C000016	旅游
C000020	教育
C000022	招聘
C000023	文化
C000024	军事

Artikeldaten befinden sich in mehreren Artikeln unter jedem Kategorieverzeichnis
Fügen Sie hier eine Bildbeschreibung ein

Datensatz-Download: https://github.com/lzeqian/machinelearntry/tree/master/sklearn_bayes/%E6%96%B0%E9%97%BB%E5%88%86%E7%B1%BB%E6%95 %B0%E6%8D%AE
lädt den Datensatz (die Wörter im Artikel müssen als separate Merkmale verwendet und segmentiert werden, hier wird Jieba verwendet)

Wortsegmentierungssortierung

Der Datensatz ist fertig, kommen wir gleich zur Sache. Teilen Sie chinesische Anweisungen auf und schreiben Sie den folgenden Code:

import os
import jieba
'''
  判断字符串是否为数字,清理包括:1,1.5,023,34%等特别的数字字符串
'''
def isNumber(num):
    if(num.isdigit() or num.isnumeric() or num.isdecimal()):
        return True
    if num.endswith('%'):
        num_str = num[:-1]  # 去掉百分号
        return isNumber(num_str)
    try:
        _ = float(num)
        return True
    except ValueError:
        return False
    return False
'''
  将某个字符串通过jieba分词后通过空格拼接,因为CountVectorizer统计词频传入的是带空格的字符串
'''
def wordToVec(word):
        word_cut = jieba.cut(word, cut_all = False) 
        filtered_words = filter(lambda w: w is not None and len(w.strip()) > 0 and not isNumber(w.strip()), list(word_cut))  # 过滤掉空字符串
        word_list=" ".join(filtered_words)
        return word_list
'''
 读取新闻分类数据/Sample目录下的所有数据
'''
def TextProcessing(folder_path):
    folder_list = os.listdir(folder_path)                        #查看folder_path下的文件
    data_list = []                                                #训练集
    class_list = []
 
    #遍历每个子文件夹
    for folder in folder_list:
        new_folder_path = os.path.join(folder_path, folder)        #根据子文件夹,生成新的路径
        files = os.listdir(new_folder_path)                        #存放子文件夹下的txt文件的列表
        j = 1
        #遍历每个txt文件
        for file in files:
            if j > 100:                                            #每类txt样本数最多100个
                break
            with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f:    #打开txt文件
                raw = f.read()
            word_list=wordToVec(raw)
            data_list.append(word_list)
            class_list.append(folder)
            j += 1
    print("词条行:",data_list)
    print("分类:",class_list)
    return data_list,class_list
    

Vektorisieren Sie mit CountVectorizer und drucken Sie die 50 häufigsten Vorkommen davon aus

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
if __name__ == '__main__':
    #文本预处理
    folder_path = './新闻分类数据/Sample'                #训练集存放地址
    data_list1,class_list1=TextProcessing(folder_path)
    stop_words="";
    with open(os.path.join("./新闻分类数据", "stopwords_cn.txt"), 'r', encoding = 'utf-8') as f:    #打开txt文件
                stop_words = f.read()
    stop_words_array=stop_words.split("\n") 
    #除了停止词外,单个字母的都会被自动过滤掉
    vectorizer = CountVectorizer(stop_words=stop_words_array)
    X = vectorizer.fit_transform(data_list1)
    fn=np.array(vectorizer.get_feature_names())
    print("特征列:",fn)
    v=np.array(X.toarray())
    print("词条向量:\n",v)
    
    top=50
    wordcount=v.sum(axis=0)[0:top]
    print("获取单词出现次数:",wordcount)
    print("排序索引:",np.argsort(wordcount)[::-1])
    print("排序特征:",fn[np.argsort(wordcount)[::-1]])
    print("排序词频:",wordcount[np.argsort(wordcount)[::-1]])

Ausgabe:

特征列: ['04vs' '110min' '125min' ... '龙岗' '龙江' '龙珠']
词条向量:
 [[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]
获取单词出现次数: [ 1  1  1  1  1  1  2  1  1  1  1  1  3  2  1  2  6  6  5  1  1  1  1  1
  3  1  1  1  1  2  4  2  1  1  1  7  2  1  1  1  2  1  1  1  1  1  1  1
 10  5]
排序索引: [48 35 16 17 49 18 30 12 24 40  6 15 13 31 29 36  4  5  3  7 44  8  9 10
 11 47  2 14  1 46 45 20 19 39 38 37 41 34 33 32 42 28 27 26 25 43 23 22
 21  0]
排序特征: ['ceo' 'bbc' 'ak' 'an' 'cfo' 'and' 'ax' 'ac' 'armed' 'bittorrent' '3g'
 'ah' 'academic' 'a股' 'aw' 'bbn' '3d' '3dmax' '16i' '5140i' 'brings'
 '80mb' '95min' 'ab' 'abc' 'cbs' '125min' 'adj' '110min' 'career'
 'brothers' 'anti' 'answer' 'bennett' 'begins' 'be' 'bjeea' 'band' 'b09'
 'b06' 'bot' 'availwidth' 'availheight' 'assessment' 'army' 'bravo' 'area'
 'are' 'applications' '04vs']
排序词频: [10  7  6  6  5  5  4  3  3  2  2  2  2  2  2  2  1  1  1  1  1  1  1  1
  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
  1  1]

Teilen Sie die Daten in einen Trainingssatz und einen Testsatz auf (beachten Sie, dass der Datensatz zuerst verschlüsselt werden muss, da alle aktuellen Datensätze durch Klassifizierung gelesen werden, dh nach Verteilung sortiert werden. Es ist möglich, dass 20 % der extrahierten Daten Der Satz wird ein bestimmter Wert sein. Alle Daten unter der Klassifizierung wurden entfernt, was zu keinem Training unter dieser Klassifizierung führt, was zu einer geringen Genauigkeit führt.)

    from sklearn.utils import shuffle
    from sklearn.model_selection import train_test_split
    X, y = shuffle(v, class_list1, random_state=42)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Testen Sie die Genauigkeit des Trainers

classifier = MultinomialNB().fit(X_train, y_train)
    test_accuracy = classifier.score(X_test, y_test)
    print(test_accuracy)

Ausgabe: 0,7222222222222222

Geben Sie einfach eine Zeichenfolge ein und sagen Sie sie voraus

v1=vectorizer.transform([wordToVec("身体是革命的本钱")]).toarray();
print(classifier.predict(v1))

Ausgabe: ['C000020'], also: Bildung

Supongo que te gusta

Origin blog.csdn.net/liaomin416100569/article/details/129282823
Recomendado
Clasificación