Je l'ai essayé avec l'idée. En fait, je n'ai pas compris comment cela peut être appliqué.
Importez d'abord ce dont vous avez besoin
import numpy as np
from sklearn import datasets
from sklearn.manifold import TSNE
from matplotlib import pyplot as plt
Chargez boston et essayez de le visualiser avec TSNE Voir visuellement certains clusters apparaître
boston = datasets.load_boston()
model = TSNE(n_components=2)
tsne_result = model.fit_transform(boston.data)
plt.plot(tsne_result[:,0], tsne_result[:,1], ".")
Essayez de regrouper avec kmeans une fois pour comparaison
from sklearn.cluster import MiniBatchKMeans
#Nombre de clusters`n_clusters`Regardé le graphique TSNE et décidé en sentant
kmeans = MiniBatchKMeans(n_clusters=10, max_iter=300)
kmeans_tsne = kmeans.fit_predict(tsne_result)
#Colorez-le bien
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
)
Les clusters (1,5), (2,8) et (4,7,9) sont séparés, mais structurellement connectés, ce qui n'est pas très souhaitable (pour moi).
Essayez le clustering avec DBSCAN
from sklearn.cluster import DBSCAN
# `eps`Est le résultat d'essais et d'erreurs
dbscan = DBSCAN(eps=3)
dbscan_tsne = dbscan.fit_predict(tsne_result)
#Colorez-le bien
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
)
Dans DBSCAN, c'est souhaitable car les îlots connectés sont dans le même cluster. (-1 est un cluster qui contient des éléments dans le désordre)
De plus, générez un arbre de décision et essayez de bien expliquer chaque cluster.
from sklearn import tree
clf = tree.DecisionTreeClassifier()
#dbscan-Le libellé est dû au fait qu'un cluster est généré-À partir de 1
clf.classes_ = np.max(dbscan_tsne) - np.min(dbscan_tsne) + 1
clf.fit(boston.data, dbscan_tsne)
#Générer un fichier de points pour 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
Le résultat est illustré dans la figure ci-dessous.
Pour référence, dessinez l'objectif (prix du logement) de chaque grappe.
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)
)
Pour résumer ce qui m'intéressait,
Cependant, quand il s'agit de fournir des informations avec cela, je me sens assez méfiant.
Au fait, même si vous mélangez boston.target
avec les données d'origine, le résultat sera assez proche.