Ich habe es mit der Idee versucht. Tatsächlich habe ich nicht darüber nachgedacht, wie es angewendet werden kann.
Importieren Sie zuerst das, was Sie brauchen
import numpy as np
from sklearn import datasets
from sklearn.manifold import TSNE
from matplotlib import pyplot as plt
Laden Sie Boston und versuchen Sie es mit TSNE zu visualisieren Visuell werden einige Cluster angezeigt
boston = datasets.load_boston()
model = TSNE(n_components=2)
tsne_result = model.fit_transform(boston.data)
plt.plot(tsne_result[:,0], tsne_result[:,1], ".")
Versuchen Sie zum Vergleich einmal, mit kmeans zu gruppieren
from sklearn.cluster import MiniBatchKMeans
#Anzahl der Cluster`n_clusters`Sah auf die TSNE-Grafik und entschied durch Gefühl
kmeans = MiniBatchKMeans(n_clusters=10, max_iter=300)
kmeans_tsne = kmeans.fit_predict(tsne_result)
#Färbe es schön
color=cm.brg(np.linspace(0,1,np.max(kmeans_tsne) - np.min(kmeans_tsne)+1))
for i in range(np.min(kmeans_tsne), np.max(kmeans_tsne)+1):
plt.plot(tsne_result[kmeans_tsne == i][:,0],
tsne_result[kmeans_tsne == i][:,1],
".",
color=color[i]
)
plt.text(tsne_result[kmeans_tsne == i][:,0][0],
tsne_result[kmeans_tsne == i][:,1][0],
str(i), color="black", size=16
)
Die Cluster (1,5), (2,8) und (4,7,9) sind geteilt, aber strukturell verbunden, was (für mich) nicht sehr wünschenswert ist.
Versuchen Sie das Clustering mit DBSCAN
from sklearn.cluster import DBSCAN
# `eps`Ist das Ergebnis von Versuch und Irrtum
dbscan = DBSCAN(eps=3)
dbscan_tsne = dbscan.fit_predict(tsne_result)
#Färbe es schön
color=cm.brg(np.linspace(0,1,np.max(dbscan_tsne) - np.min(dbscan_tsne)+1))
for i in range(np.min(dbscan_tsne), np.max(dbscan_tsne)+1):
plt.plot(tsne_result[dbscan_tsne == i][:,0],
tsne_result[dbscan_tsne == i][:,1],
".",
color=color[i+1]
)
plt.text(tsne_result[dbscan_tsne == i][:,0][0],
tsne_result[dbscan_tsne == i][:,1][0],
str(i), color="black", size=16
)
In DBSCAN ist dies wünschenswert, da sich die verbundenen Inseln im selben Cluster befinden. (-1 ist ein Cluster, der Dinge enthält, die nicht in Ordnung sind.)
Generieren Sie außerdem einen Entscheidungsbaum und versuchen Sie, jeden Cluster gut zu erklären.
from sklearn import tree
clf = tree.DecisionTreeClassifier()
#dbscan-Die Bezeichnung ist, weil 1 Cluster generiert wird-Beginnen Sie mit 1
clf.classes_ = np.max(dbscan_tsne) - np.min(dbscan_tsne) + 1
clf.fit(boston.data, dbscan_tsne)
#Generieren Sie eine Punktdatei für graphviz
with open("boston_tsne_dt.dot", 'w') as f:
tree.export_graphviz(
clf,
out_file=f,
feature_names=boston.feature_names,
filled=True,
rounded=True,
special_characters=True,
impurity=False,
proportion=False,
class_names=map(str, range(-1, np.max(dbscan_tsne) - np.min(dbscan_tsne)+1))
)
dot -T png boston_tsne_dt.dot > boston_tsne_dt.png
Das Ergebnis ist in der folgenden Abbildung dargestellt.
Zeichnen Sie als Referenz das Ziel (Hauspreis) jedes Clusters.
plt.boxplot([boston.target[dbscan_tsne == i]
for i in range(np.min(dbscan_tsne),
np.max(dbscan_tsne)+1)],
labels=range(np.min(dbscan_tsne),
np.max(dbscan_tsne)+1)
)
Um zusammenzufassen, woran ich interessiert war,
Wenn es jedoch darum geht, einige Informationen bereitzustellen, bin ich ziemlich misstrauisch. Übrigens, selbst wenn Sie "boston.target" mit den Originaldaten mischen, ist das Ergebnis ziemlich nahe.