Contenu du cours
Analyse de Cluster
Analyse de Cluster
Utilisation du Clustering sur des Données Réelles
Nous avons considéré 4 algorithmes de clustering et examiné les principes de leur fonctionnement sur des ensembles de données jouets. Maintenant, essayons d'utiliser ces méthodes de clustering pour résoudre le problème réel avec des données réelles.
Nous utiliserons le jeu de données Iris qui se compose de 50 échantillons de chacune des trois espèces d'Iris (Iris setosa, Iris virginica et Iris versicolor); quatre caractéristiques ont été mesurées pour chaque échantillon : la longueur et la largeur des sépales et des pétales, en centimètres. La tâche consiste à déterminer le type d'Iris en utilisant ces caractéristiques : nous fournirons un clustering et supposerons que chaque cluster représente l'une des espèces d'Iris.
Pour fournir des visualisations compréhensibles, nous n'utiliserons que deux caractéristiques pour le clustering : la longueur des sépales et la longueur des pétales. Regardons nos données :
from sklearn.datasets import load_iris import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] plt.scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') plt.title('Iris data') plt.xlabel('Length of sepals') plt.ylabel('Length of petals') plt.show()
Utilisons K-means pour fournir un regroupement et comparer les résultats avec des données réelles :
from sklearn.datasets import load_iris from sklearn.cluster import KMeans import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] kmeans = KMeans(n_clusters=3).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = kmeans.labels_, cmap='tab20b') axes[1].set_title('Clusters with K-means') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Essayons maintenant l'algorithme agglomératif :
from sklearn.datasets import load_iris from sklearn.cluster import AgglomerativeClustering import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] agglomerative = AgglomerativeClustering(n_clusters = 3).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = agglomerative.labels_, cmap='tab20b') axes[1].set_title('Clusters with Agglomerative') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Note
Nous avons mentionné dans le chapitre sur le Clustering Agglomératif que nous pouvons définir manuellement le nombre de clusters. Ici, nous avons utilisé cette capacité car nous avons des informations sur le nombre de clusters cibles (3 espèces d'Iris = 3 clusters).
Utilisation de l'algorithme de clustering Mean shift :
from sklearn.datasets import load_iris from sklearn.cluster import MeanShift import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] mean_shift= MeanShift(bandwidth=2).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = mean_shift.labels_, cmap='tab20b') axes[1].set_title('Clusters with Mean shift') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Enfin, essayons d'utiliser DBSCAN :
from sklearn.datasets import load_iris from sklearn.cluster import DBSCAN import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] dbscan = DBSCAN(eps=1, min_samples=10).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = dbscan.labels_, cmap='tab20b') axes[1].set_title('Clusters with DBSCAN') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Remarque
Dans le code ci-dessus, nous avons défini manuellement les paramètres pour les algorithmes (eps, min_samples pour DBSCAN, et bandwidth pour Mean shift). Dans les tâches réelles, pour déterminer les valeurs optimales de ces paramètres, il est nécessaire d'utiliser des techniques supplémentaires (validation croisée, recherche en grille, etc.).
Nous pouvons voir que grâce aux visualisations, les algorithmes K-means et Agglomerative peuvent résoudre la tâche. En même temps, Mean shift et DBSCAN ne peuvent pas extraire 3 clusters différents.
Ainsi, nous pouvons conclure que pour chaque tâche individuelle, une approche individuelle est nécessaire : le choix d'un algorithme, la sélection des paramètres, etc. De plus, il est nécessaire de définir certaines métriques avec lesquelles nous pouvons évaluer la qualité du clustering. L'utilisation de graphiques de clusters n'est pas le meilleur indicateur pour deux raisons :
- Les graphiques ne pourront pas montrer adéquatement la distribution en clusters pour les données multivariées (les données avec plus de 3 caractéristiques ne peuvent pas être visualisées correctement);
- Les graphiques peuvent montrer des algorithmes qui donnent de très mauvais résultats (comme DBSCAN et Mean shift dans l'exemple ci-dessus). Mais si les résultats sont bons, il est très difficile de comprendre où la qualité du clustering est meilleure (comme K-means et Agglomerative dans l'exemple ci-dessus).
Nous parlerons de l'évaluation de la qualité du clustering dans la section suivante.
Merci pour vos commentaires !