Der Vorherige Probieren Sie SVM mit scikit-learn auf Jupyter Notebook aus Dies ist ein Artikel, den ich fortsetzen möchte.
Danach, Einfache Installation und Inbetriebnahme von Jupyter Notebook mit Docker (unterstützt auch nbextensions und Scala) --Qiita Ich versuche es in der Umgebung von Jupyter Notebook vorbereitet nach.
In dieser Jupyter-Umgebung können Sie mit einem Browser auf Port 8888 zugreifen und das Jupyter-Notizbuch verwenden. Sie können eine neue Notiz öffnen, indem Sie oben rechts auf Neu> Python 3 klicken.
CSV-Datei zufällig erstellt https://github.com/suzuki-navi/sample-data/blob/master/sample-data-2.csv Ich benutze es auch.
Versuchen Sie es mit sample-data-2.csv.
import pandas as pd
from sklearn import model_selection
df = pd.read_csv("sample-data-2.csv", names=["id", "target", "data1", "data2"])
Dies sind die Daten.
%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(df["data1"], df["data2"])
Ich kann nicht sagen, ob das alles ist, aber es gibt vier Cluster. Danach werde ich die Streudiagramme schlampig anordnen, so dass Sie die vier sehen können, aber zusammenfassend die folgenden vier.
A. Eine kleine Datenmenge ist verstreut B. Großer Datenblock in der Nähe des Zentrums C. Ein kleiner Datenblock in der Nähe des Zentrums D. Ein sehr kleiner Datenblock in der Nähe der Mitte und etwas rechts oben in der Mitte
Unten sehen Sie ein farbcodiertes Streudiagramm.
plt.scatter(df["data1"], df["data2"], c = df["target"])
In der Nähe des Zentrums befindet sich eine große Datenmenge (B grün, C blau, D lila) und eine kleine Datenmenge verteilt (A gelb).
Vergrößern wir den Bereich nahe der Mitte.
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(df["data1"], df["data2"], c = df["target"])
Im grünen Bereich befinden sich zwei dunkle Klumpen (C blau, D lila).
Lassen Sie es uns noch weiter ausbauen.
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.scatter(df["data1"], df["data2"], c = df["target"])
Die Mitte ist C blau und oben rechts ist D lila.
Wie Sie anhand des Codes unten sehen können, der diese Daten generiert hat, haben wir nur vier Farben überlagert, die zufällig mit einer Normalverteilung für jede Farbe verteilt wurden.
https://github.com/suzuki-navi/sample-data/blob/master/sample-data-2.py
Ich möchte diese 4 Farben ohne Lehrer gruppieren.
Versuchen Sie vor dem gemischten Gaußschen Modell K-means, bei dem es sich ebenfalls um unbeaufsichtigtes Clustering handelt. Mit K-means scheint es unmöglich, Daten zu verteilen, aber versuchen wir zu verstehen, wie es geht.
Vorerst
feature = df[["data1", "data2"]]
target = df["target"]
Lernen Sie mit dem K-means-Modell. Geben Sie an, dass die Anzahl der Cluster vier beträgt.
from sklearn import cluster
model = cluster.KMeans(n_clusters=4)
model.fit(feature)
Referenz sklearn.cluster.KMeans — scikit-learn 0.21.3 documentation
Wenn Sie "plotting.plot_decision_regions" verwenden, das im Paket "mlxtend" enthalten ist, können Sie visualisieren, wie es in einem Streudiagramm klassifiziert ist. Sie müssen ein Array von NumPy anstelle eines Pandas-Objekts an plot_decision_regions
übergeben, also konvertieren Sie es mit der Methode to_numpy ()
.
from mlxtend import plotting
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)
Wie Sie sehen, hat es überhaupt nicht funktioniert.
Referenz plot_decision_regions - Mlxtend.plotting - mlxtend pandas.DataFrame.to_numpy — pandas 0.25.3 documentation
Versuchen wir das gemischte Gaußsche Modell des Subjekts.
Referenz sklearn.mixture.GaussianMixture — scikit-learn 0.21.3 documentation
from sklearn.mixture import GaussianMixture
model = GaussianMixture(n_components=4, covariance_type='full')
model.fit(feature)
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)
Nun, nicht so viel wie ich erwartet hatte ...
Ich wusste nicht, wie ich mit plot_decision_regions
expandieren sollte, daher schaue ich normalerweise mit matplotlib in die Mitte des Klassifizierungsergebnisses.
pred = model.predict(feature)
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(feature["data1"], df["data2"], c = pred)
Die beiden Klumpen in der Mitte sind zusammengekommen.
Es gibt ein zufälliges Element im Lernen, also habe ich es irgendwie versucht, aber es trennt die beiden Stücke in der Mitte nicht und überall scheint es eine unzusammenhängende Grenze zu ziehen.
Es ist abrupt, aber hier habe ich meinen eigenen Code basierend auf K-Mitteln geschrieben, damit Cluster, die einer Normalverteilung folgen, getrennt werden können.
Ich habe vorerst meinen eigenen Code in Scala geschrieben, aber ich werde die Details hier weglassen. Wenn ich es mir leisten kann, werde ich es in einem anderen Artikel vorstellen.
Speichern Sie das Ergebnis des Clusters mit Ihrem eigenen Code in pred1.csv und sehen Sie es im Streudiagramm.
pred1 = pd.read_csv("pred1.csv", names=["pred"])
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])
Sieht gut aus.
Vergrößern Sie den zentralen Teil.
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])
Ich konnte es sauber in vier Teile teilen.
Die Motivation für diesen Artikel war, bei diesen Beispieldaten, die mit K-Mitteln nicht sauber getrennt werden können, ohne Lehrer trennen zu wollen, aber die Reihenfolge der Artikel war unterschiedlich, und das gemischte Gaußsche Modell war zunächst nicht klar. Ich habe früher meine eigene Logik geschrieben. Es ist eine verbesserte Version von K-means.
Ich war beeindruckt, dass es möglich war, es mit seiner eigenen Logik so sauber zu trennen, aber als ich mich mit @stkdev beriet und dachte, es sei nur eine Neuerfindung eines bekannten Algorithmus, wurde darauf hingewiesen, dass dies mit einem gemischten Gaußschen Modell möglich ist. Ich habe den Algorithmus des gemischten Gaußschen Modells noch nicht vollständig verstanden und bin mir nicht sicher, ob er mit der ursprünglichen Logik übereinstimmt, die ich geschrieben habe. Es mag dasselbe sein, aber zumindest denke ich, dass es ähnlich ist.
Ich bin mir jedoch nicht sicher, ob es sich um ein Abstimmungsproblem handelt, das nicht sauber herauskam, als ich es mit einem gemischten Gaußschen Modell mit scicit-learn ausprobierte.
Ich werde meine eigene Logik separat veröffentlichen, wenn ich es mir leisten kann.
Recommended Posts