[PYTHON] [Maschinelles Lernen] Überwachtes Lernen mithilfe der Kernel-Dichteschätzung Teil 3

Überwachtes Lernen mithilfe der Kernel-Dichteschätzung

Dieser Artikel wurde von Anfängern des maschinellen Lernens verfasst. Bitte beachten Sie.

Der erste Artikel ist hier. Der zweite Artikel ist hier.

In diesem Artikel werde ich den Hintergrund der Idee anhand mathematischer Formeln erläutern.

Wahrscheinlichkeitsdichte und Wahrscheinlichkeit

Die Kerndichteschätzung bestand darin, die Wahrscheinlichkeitsdichtefunktion mit der Kernelfunktion zu schätzen. Was genau ist die Wahrscheinlichkeitsdichtefunktion?

Die Wahrscheinlichkeitsdichtefunktion repräsentiert die Verteilung der Zugänglichkeit ***. *** Für Ereignis A bedeutet ein Wert x mit einer hohen Wahrscheinlichkeitsdichte ***, dass beim Auftreten von Ereignis A die Wahrscheinlichkeit, dass der Wert zu diesem Zeitpunkt x ist, relativ hoch ist ***. Ersetzen wir "Ereignis A" durch "Label 0". "Bei Wert x ist die Wahrscheinlichkeitsdichte von Label 0 hoch" bedeutet "wenn einige Daten Label 0 sind, ist die Wahrscheinlichkeit, dass die Daten Wert x sind, relativ hoch".

Es ist hier zu beachten, dass Wahrscheinlichkeitsdichte ≠ Wahrscheinlichkeit. Die Wahrscheinlichkeitsdichte ist "relative Leichtigkeit des Auftretens für ein bestimmtes Ereignis", und es gibt keine Garantie dafür, dass sie mit der Wahrscheinlichkeitsdichte anderer Ereignisse verglichen werden kann. Erstens ist die Wahrscheinlichkeit, dass ein bestimmter Wert in fortlaufenden Daten erscheint, nicht definiert. Die Wahrscheinlichkeit kann ohne einen bestimmten Bereich nicht berechnet werden.

P(X=x)=0 \\ P(X \leqq x)=p

Durch Integrieren der Wahrscheinlichkeitsdichtefunktion kann die Wahrscheinlichkeit in diesem Intervall (oder Bereich, wenn es zwei oder mehr Dimensionen sind) erhalten werden. So kann wahrscheinlich die Wahrscheinlichkeit eines bestimmten Wertes "nahe" berechnet werden. Je höher die Wahrscheinlichkeitsdichte des Wertes x ist, desto höher ist die Wahrscheinlichkeit, dass der Wert x "nahe" erscheint, und je niedriger die Wahrscheinlichkeitsdichte des Wertes x ist, desto geringer ist die Wahrscheinlichkeit, dass der Wert x "nahe" erscheint.

Ich möchte Ihnen ein Beispiel geben. Beim Wert x ist die Wahrscheinlichkeitsdichte von Label 1 höher als die Wahrscheinlichkeitsdichte von Label 0. In diesem Moment,

Welches ist höher? Es ist nicht genau, aber intuitiv scheint letzteres höher zu sein (Verschiedenes). In Zukunft werden wir mit Diskussionen fortfahren, vorausgesetzt, diese Intuition ist korrekt.

Schreiben Sie "label 0" als "y = 0" und "label 1" als "y = 1" um. Dann die Geschichte bisher

 Wahrscheinlichkeitsdichte von Label 0 bei Wert x \ leqq Wahrscheinlichkeitsdichte von Label 1 bei Wert x \\
 \ Rightarrow Wahrscheinlichkeit des Wertes x bei y = 0 \ leqq Wahrscheinlichkeit des Wertes x bei y = 1 \\
 \Rightarrow P(x|y=0) \leqq P(x|y=1)

Es ist zusammengefasst als. Es ist jedoch genau der Wert x "nahe".

Bedingte Wahrscheinlichkeit und Bayes-Theorem

Für den Wert x

 P(y=0|x) \leqq P(y=1|x)

Wenn ja, ist es sinnvoll, Etikett 1 anstelle von Etikett 0 zuzuweisen. Wenn Sie also die Wahrscheinlichkeit von "Label 0 oder Label 1" und die bedingte Wahrscheinlichkeit unter der Bedingung "Extrahieren des Werts x" finden, werden Sie gewinnen.

Schreiben wir diese Ungleichung mit dem Satz von Bayes um.

 P(y=0|x) \leqq P(y=1|x) \\ \Leftrightarrow
 \frac{P(x|y=0)P(y=0)}{P(x)} \leqq \frac{P(x|y=1)P(y=1)}{P(x)}

Der Nenner P (x) ist gemeinsam und größer oder gleich 0. Nach alldem

 P(x|y=0)P(y=0) \leqq P(x|y=1)P(y=1)

Wenn du zeigen kannst

 P(y=0|x) \leqq P(y=1|x)

Kann gesagt werden zu halten. Jetzt mit Kernel-Dichteschätzung

 P(x|y=0) \leqq P(x|y=1)

Ich weiß das. Wenn wir also die Werte von P (y = 0) und P (y = 1) kennen, wird es abgerechnet.

Schätzung des Etikettenverhältnisses

P (y = 0) kann interpretiert werden als "die Wahrscheinlichkeit, dass einige Daten ausgewählt sind und die Bezeichnung 0 haben".

Es ist nicht einfach, die Population P (y = 0) und P (y = 1) zu finden. Daher sei das Zusammensetzungsverhältnis des Etiketts der Lehrerdaten der geschätzte Wert von P (y = 0) und P (y = 1). Von 100 Lehrerdaten sind 40 Label 0 und 60 Label 1.

P(y=0)=0.4\\ P(y=1)=0.6

Ich nehme an.

Tatsächlich haben die Klassifizierer, die ich in früheren Artikeln implementiert habe, die Auswirkungen von P (y = 0) und P (y = 1) ignoriert. Er ging stark davon aus, dass das Verhältnis jedes Etiketts gleich war.

Neuimplementierung

Basierend auf der bisherigen Erklärung werden wir den objektorientierten Klassifikator erneut implementieren.

import numpy as np

class GKDEClassifier(object):
    
    def __init__(self, bw_method="scotts_factor", weights="None"):
 # Kernelbandbreite
        self.bw_method = bw_method
 # Kerngewicht
        self.weights = weights
        
    def fit(self, X, y):
 Anzahl der Etiketten für # y
        self.y_num = len(np.unique(y))   
 # Berechnung des Etikettenverhältnisses
        self.label, y_count = np.unique(y, return_counts=True)
        self.y_rate = y_count/y_count.sum()
 # Liste mit geschätzten Wahrscheinlichkeitsdichtefunktionen
        self.kernel_ = []
 # Speichern Sie die Wahrscheinlichkeitsdichtefunktion
        for i in range(self.y_num):
            kernel = gaussian_kde(X[y==self.label[i]].T)
            self.kernel_.append(kernel)
        return self

    def predict(self, X):
 # Liste zum Speichern von Vorhersageetiketten
        pred = []
 #Ndarray, das die Wahrscheinlichkeit von Testdaten nach Label speichert
        self.p_ = np.empty([self.y_num, len(X)])
 # Speichern Sie die Wahrscheinlichkeit nach Etikett
        for i in range(self.y_num):
            self.p_[i] = self.kernel_[i].evaluate(X.T)
 # Multiplizieren Sie das Etikettenverhältnis
        for j in range(self.y_num):
            self.p_[j] = self.p_[j] * self.y_rate[j]
 # Zuweisung von Vorhersageetiketten
        for k in range(len(X)):
            pred.append(self.label[np.argmax(self.p_.T[k])])
        return pred

Die hinzugefügten und geänderten Teile werden unten erläutert.

Berechnung des Etikettenverhältnisses

self.label, y_count = np.unique(y, return_counts=True)
self.y_rate = y_count/y_count.sum()

Der Teil zur Berechnung des Beschriftungsverhältnisses von Lehrerdaten zur Anpassungsmethode wurde hinzugefügt. Der Gesamtwert von y_rate wird auf 1 gesetzt, indem die Anzahl der Auftritte von y_count für jedes Etikett durch den Gesamtwert dividiert wird. Wenn Sie y_count unverändert verwenden, ohne durch den Gesamtwert zu dividieren, ändert sich das Ergebnis nicht.

Darüber hinaus wird die Aufteilung von *** Beschriftungen (0, 1 oder Zeichenkette) als Listenbeschriftung ausgegeben. ***(wichtig)

Berechnung der Wahrscheinlichkeitsdichtefunktion

Hier ist der neue Code. Behoben, um verschiedenen Beschriftungen zu entsprechen.

for i in range(self.y_num):
    kernel = gaussian_kde(X[y==self.label[i]].T)
    self.kernel_.append(kernel)

Dies ist der bisherige Code ↓ ↓

kernel = gaussian_kde(X[y==i].T)

Ursprünglich wurde "Daten mit Label i" angegeben, aber es wurde geändert, um "Daten mit Label vom Typ i" anzugeben. Durch Angabe in der Ausgabebezeichnung entspricht dies einer Bezeichnung (Zeichenfolge usw.), die keine nicht negative Ganzzahl ist.

Etikettenverhältnis widerspiegeln

for j in range(self.y_num):
    self.p_[j] = self.p_[j] * self.y_rate[j]

Der Vorhersagemethode wurde ein Teil hinzugefügt, der die Wahrscheinlichkeitsdichte mit dem Beschriftungsverhältnis multipliziert.

Zuweisung von Vorhersageetiketten

Hier ist der neue Code.

for k in range(len(X)):
    pred.append(self.label[np.argmax(self.p_.T[k])])

Durch Angabe der zugewiesenen Bezeichnung aus der Listenbezeichnung werden auch andere Bezeichnungen als nicht negative Ganzzahlen unterstützt.

Andere

Ich habe den chaotischen Teil der Vorhersagemethode mit numpy umgeschrieben. Indem wir zuerst das ndarray erstellen und dann das Ergebnis ersetzen, versuchen wir, die Lesbarkeit und die Berechnungsgeschwindigkeit zu verbessern.

Schließlich

Ich habe es geschafft, das Schreiben in meinem Gehirn bis zum Ende zu beenden. Vielen Dank für Ihre Beziehung. Wir hoffen, dass diejenigen, die den Artikel lesen, ihn noch ein wenig interessanter finden.

(Korrigiert am 5. August 2020)

Recommended Posts

[Maschinelles Lernen] Überwachtes Lernen mithilfe der Kernel-Dichteschätzung Teil 2
[Maschinelles Lernen] Überwachtes Lernen mithilfe der Kernel-Dichteschätzung Teil 3
[Maschinelles Lernen] Überwachtes Lernen mithilfe der Kernel-Dichteschätzung
Maschinelles Lernen: Betreut --AdaBoost
Maschinelles Lernen: Überwacht - Lineare Regression
Python: Überwachtes Lernen: Hyperparameter Teil 1
Schätzung der Kerneldichte in Python
Maschinelles Lernen: Überwacht - Zufälliger Wald
Python: Überwachtes Lernen: Hyperparameter Teil 2
Maschinelles Lernen: Überwacht - Support Vector Machine
Überwachtes maschinelles Lernen (Klassifikation / Regression)
Maschinelles Lernen: Überwacht - Entscheidungsbaum
Python-Anfänger veröffentlichen Web-Apps mithilfe von maschinellem Lernen [Teil 1] Einführung
Maschinelles Lernen: Überwacht - Lineare Diskriminanzanalyse
Anwendungsentwicklung mit Azure Machine Learning
Aktienkursprognose mit maschinellem Lernen (Scikit-Learn)
Vorhersage des Strombedarfs durch maschinelles Lernen Teil 2
[Maschinelles Lernen] LDA-Themenklassifizierung mit Scikit-Learn
[Maschinelles Lernen] FX-Vorhersage unter Verwendung des Entscheidungsbaums
Maschinelles Lernen
Python-Anfänger veröffentlichen Web-Apps mit maschinellem Lernen [Teil 2] Einführung in explosives Python !!
Aktienkursprognose mit maschinellem Lernen (Return Edition)
[Maschinelles Lernen] Regressionsanalyse mit Scicit Learn
EV3 x Pyrhon Maschinelles Lernen Teil 3 Klassifizierung
Erstellen eines Positionsschätzungsmodells für den Intelligenzwettbewerb menschlicher Wölfe mithilfe von maschinellem Lernen
Maschinelles Lernen eines jungen Ingenieurs Teil 1
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 1
Eine Geschichte über einfaches maschinelles Lernen mit TensorFlow
Maschinelles Lernen beginnend mit Python Personal Memorandum Part2
Datenversorgungstricks mit deque beim maschinellen Lernen
Grundlagen des Lernens mit einem Lehrer Teil 1 - Einfache Regression - (Hinweis)
Maschinelles Lernen beginnend mit Python Personal Memorandum Part1
EV3 x Pyrhon Maschinelles Lernen Teil 1 Umgebungskonstruktion
EV3 x Python Maschinelles Lernen Teil 2 Lineare Regression
Aktienkursprognose mit Deep Learning (TensorFlow) -Teil 2-
Maschinelles Lernen eines jungen Ingenieurs Teil 2
Angemessene Preisschätzung von Mercari durch maschinelles Lernen
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Versuchen Sie es mit dem Jupyter Notebook von Azure Machine Learning
Grundlagen des Lernens mit einem Lehrer Teil 3 - Multiple Regression (Implementierung) - (Anmerkungen) -
[Maschinelles Lernen] Extrahieren Sie ähnliche Wörter mechanisch mit WordNet
Kausales Denken mit maschinellem Lernen (Organisation von Methoden des kausalen Denkens)
Report_Deep Learning (Teil 2)
Report_Deep Learning (Teil 1)
Report_Deep Learning (Teil 2)
Betreutes Lernen (Klassifizierung)
[Memo] Maschinelles Lernen
Klassifikation des maschinellen Lernens
Beispiel für maschinelles Lernen
Was ich über KI / maschinelles Lernen mit Python gelernt habe (1)
Einfaches maschinelles Lernen mit AutoAI (Teil 4) Jupyter Notebook
Erstellen Sie maschinelle Lernprojekte mit explosiver Geschwindigkeit mithilfe von Vorlagen
Was ich über KI / maschinelles Lernen mit Python gelernt habe (3)
Amateur-Vermarkter für maschinelles Lernen forderten Kaggles Hauspreise heraus (Teil 1)
Python: Diagramm der zweidimensionalen Datenverteilung (Schätzung der Kerneldichte)
Maschinelles Lernen mit Bildern der Kategorie Caffe -1 unter Verwendung eines Referenzmodells
Tech-Circle Beginnen wir mit der Anwendungsentwicklung durch maschinelles Lernen (Selbststudium)
[Maschinelles Lernen] Versuchen Sie, Objekte mithilfe der selektiven Suche zu erkennen
[Maschinelles Lernen] Textklassifizierung mit dem Transformer-Modell (Aufmerksamkeitsbasierter Klassifikator)