[PYTHON] Ich habe versucht, die Anzahl der Mnisten durch unbeaufsichtigtes Lernen zu klassifizieren [PCA, t-SNE, k-means]

Einführung

Unbeaufsichtigtes Lernen ist im Allgemeinen weniger genau als überwachtes Lernen, geht jedoch zu Lasten vieler Vorteile. Insbesondere als Szene, in der unbeaufsichtigtes Lernen nützlich ist

** - Daten, deren Muster nicht gut verstanden wird

Und so weiter.

Beim unbeaufsichtigten Lernen lernen Sie die Struktur hinter den Daten aus den Daten selbst. Auf diese Weise können Sie mehr unbeschriftete Daten nutzen, was den Weg für neue Anwendungen ebnen kann.

In diesem Artikel werde ich ein Implementierungsbeispiel ** für die Klassifizierung von Mnist-Daten durch unbeaufsichtigtes Lernen vorstellen. Die Methode verwendet die Hauptkomponentenanalyse und die t-SNE, k-means-Methode. Im Folgeartikel möchte ich die Klassifizierung mit dem Auto-Encoder herausfordern.

Was ist in diesem Artikel zu tun?

** - Klassifizieren Sie Mnist-Daten durch unbeaufsichtigtes Lernen

Bibliothek importieren

python


import random
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import confusion_matrix
from sklearn.manifold import TSNE

Datenaufbereitung

python


mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
#Normalisierung
train_images = (train_images - train_images.min()) / (train_images.max() - train_images.min())
test_images = (test_images - test_images.min()) / (test_images.max() - test_images.min())

train_images.shape,test_images.shape

Ich werde es vorerst visualisieren. Dies sind bekannte Zahlen.

python


#Zufällige Visualisierung
fig, ax = plt.subplots(4,5,figsize=[8,6])
ax_f = ax.flatten()
for ax_i in ax_f:
    idx = random.choice(range(train_images.shape[0]))
    ax_i.imshow(train_images[idx,:,:])
    ax_i.grid(False)
    ax_i.tick_params(labelbottom=False,labelleft=False)

image.png

Klassifizierung von Bildern durch Hauptkomponentenanalyse

Die Daten von mnist sind 28 * 28 = 784 Dimensionen. Es scheint, dass die k-means-Methode so angewendet werden kann, wie sie ist, aber es ist effektiv, ** die Dimensionen vor der Klassifizierung zu reduzieren. Auf diese Weise ist es möglich, den Rechenaufwand zu reduzieren.

** Die Hauptkomponentenanalyse (PCA) wird als Dimensionsreduktionsmethode verwendet. Dann wird die k-means-Methode auf die Daten angewendet, deren Abmessungen durch PCA reduziert wurden, um die Daten zu klassifizieren. ** ** **

Führen Sie eine Hauptkomponentenanalyse durch

python


df_train = pd.DataFrame(train_images.reshape(train_images.shape[0],28*28))

pca = PCA()
pca.fit(df_train)
feature = pca.transform(df_train)

#Visualisierung in zwei Dimensionen
plt.scatter(feature[:,0],feature[:,1],alpha=0.8,c=train_labels)

Hier ist das Ergebnis der Visualisierung mit der ersten Komponente und der zweiten Komponente der Hauptkomponente. Es ist durch 10 Cluster von 0 bis 9 farbcodiert. Es sieht so aus, als könnten sie irgendwie kategorisiert werden, aber ... es gibt viele überlappende Teile. image.png

Als nächstes überlegen wir uns, wie viele Komponenten k-means anwenden sollen. Daher wird der Beitragssatz jeder Komponente visualisiert.

python


#Änderung des Beitragssatzes
ev_ratio = pca.explained_variance_ratio_
ev_ratio = np.hstack([0,ev_ratio.cumsum()])

df_ratio = pd.DataFrame({"components":range(len(ev_ratio)), "ratio":ev_ratio})

plt.plot(ev_ratio)
plt.xlabel("components")
plt.ylabel("explained variance ratio")
plt.xlim([0,50])

plt.scatter(range(len(ev_ratio)),ev_ratio)

Wenn wir uns die Ergebnisse ansehen, können wir sehen, dass 90% oder mehr der Daten bis zur 100. Komponente wiederhergestellt werden können. Wie Sie aus verschiedenen Experimenten sehen können, waren 10 Komponenten bei der Klassifizierung ausreichend. (Ich habe mit der unten beschriebenen Bewertungsmethode experimentiert) Lassen Sie uns anhand der k-means-Methode bis zur 10. Komponente klassifizieren. Je kleiner die Anzahl der Dimensionen ist, desto kleiner ist die Anzahl der Berechnungen. Daher ist es vorzuziehen, eine kleinere Anzahl zu haben.

Klassifizierung nach der k-means-Methode

Wenden Sie zunächst die k-means-Methode an. Wir wissen, dass es 10 Cluster gibt, also klassifizieren wir sie zuerst in 10.

python


KM = KMeans(n_clusters = 10)
result = KM.fit(feature[:,:9])

Auswertung der Klassifizierungsergebnisse

Zunächst wird das Klassifizierungsergebnis als Verwirrungsmatrix angezeigt.

python


df_eval = pd.DataFrame(confusion_matrix(train_labels,result.labels_))
df_eval.columns = df_eval.idxmax()
df_eval = df_eval.sort_index(axis=1)

df_eval

Das richtige Antwortetikett, das im Cluster am häufigsten klassifiziert wurde, wurde als prädiktives Etikett verwendet. Wenn beispielsweise Cluster Nr. 0 100 0s, 20 1s und 10 4s enthält, sagt dies 0 voraus.

Wenn Sie sich die Ergebnisse ansehen, sehen Sie, dass es zwei Cluster gibt, die als 0 und einer als 1 vorhergesagt werden. Mit anderen Worten, es wird angenommen, dass es schwierig war, durch die Hauptkomponentenanalyse und die k-Mittelwert-Methode ** in 10 Zahlen ** zu klassifizieren. image.png

Lassen Sie uns nun überlegen, wie viele Cluster am besten klassifiziert werden können. Wenn die Anzahl der Cluster groß ist, gibt es natürlich viele ähnliche im Cluster, aber es ist schwierig zu interpretieren. Wenn es klein ist, ist es leicht zu interpretieren, aber der Cluster enthält verschiedene Daten.

** Die Anzahl der Cluster ist also gering, aber es ist gut, so viele Daten wie möglich mit ähnlichen Daten zu klassifizieren **. Da wir hier die richtigen Antwortdaten kennen, möchten wir die Anzahl der Cluster mit der größten Anzahl korrekter Antwortetiketten ermitteln, wobei die korrektesten Antwortetiketten die richtigen Antwortetiketten sind.

Daher ist der Bewertungsindex ** die Anzahl der korrekten Etiketten / die Gesamtzahl **.

python


#Suchen Sie nach der Anzahl der Cluster mit der größten Anzahl von Daten im Cluster als korrekter Bezeichnung.
eval_acc_list=[]

for i in range(5,15):
    KM = KMeans(n_clusters = i)
    result = KM.fit(feature[:,:9])
    df_eval = pd.DataFrame(confusion_matrix(train_labels,result.labels_))
    eval_acc = df_eval.max().sum()/df_eval.sum().sum()
    eval_acc_list.append(eval_acc)

plt.plot(range(5,15),eval_acc_list)
plt.xlabel("The number of cluster")
plt.ylabel("accuracy")

Dies ist das Ergebnis, wenn die Anzahl der Cluster von 5 auf 15 geändert wird. Mit zunehmender Anzahl von Clustern nimmt die Homogenität und die Genauigkeit zu. ** Was am besten ist, hängt vom Zweck ab, aber ungefähr 10 Cluster scheinen angesichts der Interpretierbarkeit gut zu sein. ** ** **

Mit anderen Worten, es war schwierig, es mit PCA allein sauber in 10 Etiketten zu unterteilen. Als nächstes möchte ich eine Methode namens t-SNE kombinieren.

Klassifizierung nach PCA + t-SNE

Ausführung von t-SNE

** Es war schwierig, nur mit PCA in 10 zu klassifizieren. Lassen Sie uns also klassifizieren, indem Sie PCA und t-SNE kombinieren. ** ** ** t-SNE ist eine Methode, deren Prinzip schwierig zu sein scheint (ich verstehe es nicht gut). Ich werde die Seite mit detaillierten Erklärungen in die Referenz aufnehmen.

Da t-SNE eine Methode ist, die viel Rechenzeit in Anspruch nimmt, werden 10000 durch PCA reduzierte 10-dimensionale Daten klassifiziert. Wenn ich es mir vorstelle, habe ich das Gefühl, dass es als faires Gefühl eingestuft werden kann.

python


tsne = TSNE(n_components=2).fit_transform(feature[:10000,:9])
#Visualisierung
for i in range(10):
  idx = np.where(train_labels[:10000]==i)
  plt.scatter(tsne[idx,0],tsne[idx,1],label=i)
plt.legend(loc='upper left',bbox_to_anchor=(1.05,1))

image.png

Klassifizierung und Bewertung mit k-Mitteln

Als nächstes klassifizieren Sie nach der k-means-Methode und zeigen die Verwirrungsmatrix an.

python


#Klassifizieren Sie tsne nach kmeans
KM = KMeans(n_clusters = 10)
result = KM.fit(tsne)

df_eval = pd.DataFrame(confusion_matrix(train_labels[:10000],result.labels_))
df_eval.columns = df_eval.idxmax()
df_eval = df_eval.sort_index(axis=1)

df_eval

image.png

** Wie es passieren kann, ist es gut in 10 Etiketten unterteilt. Es war gut. ** ** ** Wenn Sie sich diese Tabelle ansehen, sehen Sie, dass "4" und "9" häufig falsch klassifiziert sind. Selbst wenn Sie sich das Streudiagramm ansehen, das die t-SNE-Ergebnisse tatsächlich visualisiert, liegen 4 und 9 nahe beieinander.

Sie können sehen, dass 4 und 9 lernen, bei dieser Lernmethode ähnlich zu sein. Ich weiß nicht, warum sie denken, dass sie ähnlich sind, aber es ist interessant.

Bewerten Sie abschließend die Genauigkeit jeder Anzahl von Clustern. Wenn die Anzahl der Cluster 10 beträgt, beträgt die Genauigkeit 0,6. Das Ergebnis ist etwas höher als wenn nur PCA verwendet wird.

python


#Suchen Sie nach der Anzahl der Cluster mit der größten Anzahl von Daten im Cluster als korrekter Bezeichnung.
eval_acc_list=[]

for i in range(5,15):
    KM = KMeans(n_clusters = i)
    result = KM.fit(feature[:,:9])
    df_eval = pd.DataFrame(confusion_matrix(train_labels,result.labels_))
    eval_acc = df_eval.max().sum()/df_eval.sum().sum()
    eval_acc_list.append(eval_acc)

plt.plot(range(5,15),eval_acc_list)
plt.xlabel("The number of cluster")
plt.ylabel("accuracy")

image.png

Am Ende

Unter Verwendung von mnist als Thema haben wir die Dimensionsreduktion und -visualisierung durch PCA und t-SNE sowie die Klassifizierung und Bewertung durch k-means implementiert. Unbeschriftete Daten sind auf der Welt reichlich vorhanden, daher scheint dies eine sehr nützliche Methode zu sein.

Wenn Sie es hilfreich finden, wäre es ermutigend, wenn Sie LGTM usw. verwenden könnten.

Verweise

Buch: ["Lernen ohne Lehrer durch Python"](URL https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81 % E3% 82% 8B% E6% 95% 99% E5% B8% AB% E3% 81% AA% E3% 81% 97% E5% AD% A6% E7% BF% 92-% E2% 80% 95% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 81% AE% E5% 8F% AF% E8% 83% BD% E6% 80% A7% E3% 82% 92% E5% BA% 83% E3% 81% 92% E3% 82% 8B% E3% 83% A9% E3% 83% 99% E3% 83% AB% E3% 81% AA% E3% 81% 97% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% AE% E5% 88% A9% E7% 94% A8-Ankur-Patel / dp / 4873119103)

Einführung der Dimensionskomprimierungsmethode mit t-SNE https://blog.albert2005.co.jp/2015/12/02/tsne/

Verstehen Sie t-SNE und verbessern Sie die Visualisierung https://qiita.com/g-k/items/120f1cf85ff2ceae4aba

Recommended Posts

Ich habe versucht, die Anzahl der Mnisten durch unbeaufsichtigtes Lernen zu klassifizieren [PCA, t-SNE, k-means]
Klassifizieren Sie Mnist-Zahlen nach Keras, ohne dass der Lehrer etwas lernt [Auto Encoder Edition]
Ich habe versucht, MNIST nach GNN zu klassifizieren (mit PyTorch-Geometrie).
Ich habe versucht, Oba Hanana und Otani Emiri durch tiefes Lernen zu klassifizieren
Ich habe versucht, Drachenkugeln nach Adalin zu klassifizieren
Ich habe versucht, Hanana Oba und Emiri Otani durch tiefes Lernen zu klassifizieren (Teil 2)
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
[Keras] Ich habe versucht, das Problem der Klassifizierung des Donut-Typ-Bereichs durch maschinelles Lernen zu lösen. [Studie]
Ich habe versucht, Pferderennen vorherzusagen, indem ich alles von der Datenerfassung bis zum tiefen Lernen getan habe
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Klassifizieren Sie Artikel mit Tags, die von Qiita durch unbeaufsichtigtes Lernen angegeben wurden
Ich habe versucht, Dropout zu erklären
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, tief zu lernen
Ich habe versucht zu debuggen.
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe versucht, die Shogi-Spieler Takami 7th Dan und Masuda 6th Dan von CNN zu klassifizieren [Für CNN-Anfänger]
Ich habe versucht, die Videoerstellung durch parallele Verarbeitung zu beschleunigen
[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬
[Django] Ich habe versucht, Zugriffsbeschränkungen durch Klassenvererbung zu implementieren.
[Einführung in Pandas] Ich habe versucht, die Austauschdaten durch Dateninterpolation zu erhöhen ♬
Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, Musik im Neural Network in Dur / Moll zu klassifizieren
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich war frustriert von Kaggle und versuchte, durch Schaben und maschinelles Lernen ein gutes Mietobjekt zu finden
Ich habe HR Tech versucht, eine Expertensuchmaschine zu entwickeln, indem ich interne Besprechungsinformationen maschinell gelernt habe
Mayungos Python-Lernfolge 4: Ich habe versucht zu sehen, was passiert, wenn Zahlen als Buchstaben behandelt werden
Ich habe versucht, SVM zu organisieren.
Klassifizieren Sie Daten nach der k-means-Methode
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, die Lesezeichen zu visualisieren, die mit Doc2Vec und PCA nach Slack fliegen
[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬ Teil 2
Ich habe versucht, Kanas handschriftliche Zeichenerkennung Teil 1/3 zuerst von MNIST zu machen
Ich habe versucht, den Getränkepräferenzdatensatz durch Tensorzerlegung zu visualisieren.
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, die Satzklassifizierung durch Self Attention mit PyTorch zu implementieren
Ich habe versucht, die Befehle zusammenzufassen, die Anfängeringenieure heute verwenden
Ich ließ RNN Sin Wave lernen und versuchte vorherzusagen
Ich habe versucht, Boeing die Geigenleistung durch Posenschätzung vorzustellen
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Eine einfache Methode, um eine korrekte MNIST-Antwortrate von 97% oder mehr zu erhalten, indem Sie ohne Lehrer lernen (ohne Transferlernen).