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.
** - Klassifizieren Sie Mnist-Daten durch unbeaufsichtigtes Lernen
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
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)
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. ** ** **
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.
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.
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])
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.
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.
** 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))
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
** 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")
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.
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