Dieser Artikel wurde von Anfängern des maschinellen Lernens verfasst. Bitte beachten Sie.
Ein tatsächlich verwendetes Beispiel ist hier. Der spezifische Hintergrund der Idee und der überarbeitete Inhalt sind hier.
Bukkake [WIkipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%AF%86%E5% Es ist schneller, BA% A6% E6% 8E% A8% E5% AE% 9A) zu betrachten.
Stellen Sie sich ein einfaches Histogramm vor. Es kann gesagt werden, dass der Teil, in dem das Histogramm hoch ist, *** relativ leicht zu erreichen ist *** und der Teil, in dem das Histogramm niedrig ist ***, relativ unwahrscheinlich ist ***. Hast du jemals irgendwo eine ähnliche Geschichte gehört?
Dies ist die gleiche Idee wie die Wahrscheinlichkeitsdichtefunktion. Ein Histogramm ist gewissermaßen eine *** wahre Wahrscheinlichkeitsdichtefunktion ***, die durch tatsächliche Messung *** geschätzt wird. *** Kernel-Dichteschätzung *** ist eine kontinuierlichere und reibungslosere Schätzmethode unter Verwendung von Kernelfunktionen.
[Wikipedia](https://ja.wikipedia.org/wiki/%E6%95%99%E5%B8%AB%E3%81%82%E3%82%8A%E5%AD%A6%E7%BF % 92) Sehen Sie den Lehrer oder lesen Sie die Qiita einer anderen Person.
Ein "Lehrer" im überwachten Lernen ist ein Satz von "Daten" und "korrektem Etikett".
Betrachten Sie einen Datensatz mit der korrekten Bezeichnung "0, 1, 2". Dies ist in Daten von Label 0, Label 1 und Label 2 unterteilt. Wenn Sie die Kerneldichte anhand der Lehrerdaten mit der korrekten Antwortbezeichnung 0 schätzen, können Sie die Wahrscheinlichkeitsdichtefunktion für den Fall ermitteln, dass "die Bezeichnung 0 wird".
Finden Sie die Wahrscheinlichkeitsdichtefunktion basierend auf den Lehrerdaten für alle Labels und berechnen Sie die Wahrscheinlichkeitsdichte der Testdaten. Dann klassifizieren wir nach der Größe des Wertes. Das ist dieser Versuch.
Genau genommen müssen wir wirklich den Anteil jedes Labels an der Bevölkerung berechnen ... Ich möchte die schwierige Geschichte noch einmal zusammenfassen.
Diese Welt ist wunderbar. Dies liegt daran, dass die Schätzung der Kerneldichte unter Verwendung des Gaußschen Kernels bereits in [SciPy] implementiert wurde (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html).
Hier ist eine kurze Zusammenfassung der Verwendung von SciPys gaussian_kde.
kernel = gaussian_kde(X, bw_method="scotts_factor", weights="None")
--X: Datensatz zur Schätzung der Kerneldichte. --bw_method: Kernelbandbreite. Scotts_factor, falls nicht angegeben. --weights: Gewichte zur Schätzung der Kerneldichte. Wenn nicht angegeben, sind alle Gewichte gleich.
Geben Sie neue Daten in die geschätzte Wahrscheinlichkeitsdichtefunktion ein, um die Wahrscheinlichkeit zu berechnen.
pd = kernel.evaluate(Z)
--Z: Datenpunkt (e), für die Sie die Wahrscheinlichkeit berechnen möchten.
Es wird als Listenarray zurückgegeben, das die Z-Wahrscheinlichkeiten enthält.
Probieren Sie es mit dem Iris-Datensatz von Scikit-learn aus!
Der Fluss ist so Iris-Datensatz gelesen → Trainingsdaten und Testdaten mit train_test_split teilen → Standardisierung von Trainingsdaten und Testdaten → Führen Sie eine Kernel-Dichteschätzung für jedes Etikett anhand von Trainingsdaten durch → Berechnen Sie die Wahrscheinlichkeitsdichte für jedes Etikett mit Testdaten → Geben Sie das Etikett mit dem größten Wert aus
↓ Skript ↓
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from scipy.stats import gaussian_kde
# Laden des Iris-Datensatzes
iris = datasets.load_iris()
X = iris.data
y = iris.target
# Aufteilung der Trainingsdaten und Testdaten
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=1, stratify=y)
# Standardisierung
sc = StandardScaler()
sc = sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
# Schätzung der Kerneldichte
kernel0 = gaussian_kde(X_train_std[y_train==0].T)
kernel1 = gaussian_kde(X_train_std[y_train==1].T)
kernel2 = gaussian_kde(X_train_std[y_train==2].T)
#
p0s = kernel0.evaluate(X_test_std.T)
p1s = kernel1.evaluate(X_test_std.T)
p2s = kernel2.evaluate(X_test_std.T)
#
y_pred = []
for p0, p1, p2 in zip(p0s, p1s, p2s):
if max(p0, p1, p2) == p0:
y_pred.append(0)
elif max(p0, p1, p2) == p1:
y_pred.append(1)
else:
y_pred.append(2)
Ausgabe des Vorhersageetiketts Vorsichtsmaßnahmen für die Standardisierung Die Testdaten werden anhand des Durchschnitts und der Standardabweichung der Trainingsdaten standardisiert. Dies liegt daran, dass die Daten verzerrt oder falsch ausgerichtet sein können, wenn die Standardisierung separat durchgeführt wird. Vorsichtsmaßnahmen zum Schätzen der Kerneldichte Wenn Sie gaussian_kde den Datensatz so lesen lassen, wie er ist, scheint der *** Spaltenvektor als ein Daten *** verarbeitet zu werden. Der Iris-Datensatz transponiert jedoch die Daten, da *** Zeilenvektor ein Daten *** ist. Gleiches gilt für die Berechnung der Wahrscheinlichkeitsdichte von Testdaten.
y_pred = []
for p0, p1, p2 in zip(p0s, p1s, p2s):
if max(p0, p1, p2) == p0:
y_pred.append(0)
elif max(p0, p1, p2) == p1:
y_pred.append(1)
else:
y_pred.append(2)
Die Wahrscheinlichkeitsdichte der Testdaten wird für jedes Etikett in p0s, p1s, p2s gespeichert. Nehmen Sie jeweils einen heraus
--0, wenn der Wert von Label 0 das Maximum ist --1, wenn der Wert von Etikett 1 das Maximum ist
Die Ergebnisse werden in der Liste der Testdaten in der Liste y_pred gespeichert.
Lassen Sie uns die Genauigkeitsrate des Vorhersageetiketts mit der Genauigkeitscore von scikit-learn überprüfen. Pochen.
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))
1.0
Hurra.
Ich habe versucht, das Ergebnis der Kernel-Dichteschätzung als Klassifikator für überwachtes Lernen zu verwenden. In der Realität werden solche Techniken selten verwendet. Ich denke, es hat die Nachteile, den Rechenaufwand zu erhöhen und die Genauigkeit in Abhängigkeit von den Daten erheblich zu verringern. Wie Sie dieser Studie entnehmen können, scheinen einige Daten relativ schnell und gut klassifiziert zu werden.
Fortsetzung auf Teil 2
Recommended Posts