ENI-ABT BAMAKO 2024
Clustering K-Means en Python :
Chargé de cours:
Dr Yacouba GOÏTA
Tél : [Link]
Email : goita_yacouba@[Link]
Dr Yacouba GOITA
Objectifs
• Définir le clustering K-means
• Expliquer l’algorithme du clustering K-means
• Implémenter le clustering K-means avec Python
Clustering K-Means en Python :
• L’un des algorithmes de clustering les plus courants dans
l’apprentissage automatique est connu sous le nom de
clustering k-means .
• Le clustering K-means est une technique dans laquelle
nous plaçons chaque observation d’un ensemble de
données dans l’un des K clusters.
• L’objectif final est d’avoir K clusters dans lesquels les
observations au sein de chaque cluster sont assez
similaires les unes aux autres tandis que les observations
dans différents clusters sont assez différentes les unes
des autres.
• En pratique, nous utilisons les étapes suivantes pour
effectuer un clustering K-means :
• 1. Choisissez une valeur pour K .
– Tout d’abord, nous devons décider combien de clusters nous
souhaitons identifier dans les données. Souvent, nous devons
simplement tester plusieurs valeurs différentes pour K et
analyser les résultats pour voir quel nombre de clusters semble
avoir le plus de sens pour un problème donné.
• 2. Attribuez aléatoirement chaque observation à un
cluster initial, de 1 à K.
• 3. Effectuez la procédure suivante jusqu’à ce que les
affectations de cluster cessent de changer.
– Pour chacun des K clusters, calculez le centre de gravité du cluster. Il
s’agit simplement du vecteur des p moyennes des caractéristiques pour
les observations du k ème cluster.
– Attribuez chaque observation au cluster dont le centre de gravité est le
plus proche. Ici, le plus proche est défini en utilisant la distance
euclidienne .
Mise en œuvre du clustering k-means en Python à
l’aide de la fonction KMeans du module sklearn .
Étape 1 : Importer les modules nécessaires
– Tout d’abord, nous importerons tous les modules dont nous
aurons besoin pour effectuer le clustering k-means :
import pandas as pd
import numpy as np
import [Link] as plt
from [Link] import KMeans
from [Link] import StandardScaler
Étape 2 : Créer le DataFrame
• Ensuite, nous allons créer un DataFrame contenant les trois
variables suivantes pour 20 joueurs de basket différents :
points
aide
rebondit
• Le code suivant montre comment créer ce DataFrame
pandas :
• #create DataFrame
df = [Link]({
'points': [18, [Link], 19, 14, 14, 11, 20, 28, 30, 31,
35, 33, 29, 25, 25, 27, 29, 30, 19, 23],
'assists': [3, 3, 4, 5, 4, 7, 8, 7, 6, 9, 12, 14,
[Link], 9, 4, 3, 4, 12, 15, 11],
'rebounds': [15, 14, 14, 10, 8, 14, 13, 9, 5, 4,
11, 6, 5, 5, 3, 8, 12, 7, 6, 5]
})
#view first five rows of DataFrame
print([Link]())
points assists rebounds
0 18.0 3.0 15
1 NaN 3.0 14
2 19.0 4.0 14
3 14.0 5.0 10
4 14.0 4.0 8
Étape 3 : Nettoyer et préparer le DataFrame
• Nous utiliserons le clustering k-means pour regrouper les
acteurs similaires sur la base de ces trois métriques.
• Ensuite, nous effectuerons les étapes suivantes :
– Utilisez dropna() pour supprimer des lignes avec des valeurs
NaN dans n’importe quelle colonne
– Utilisez StandardScaler() pour mettre à l’échelle chaque
variable afin d’avoir une moyenne de 0 et un écart type de 1.
Le code suivant montre comment procéder :
#drop rows with NA values in any columns
df = [Link]()
#create scaled DataFrame where each variable has mean of 0 and
standard dev of 1
scaled_df = StandardScaler().fit_transform(df)
#view first five rows of scaled DataFrame
print(scaled_df[:5])
[[-0.86660275 -1.22683918 1.72722524]
[-0.72081911 -0.96077767 1.45687694]
[-1.44973731 -0.69471616 0.37548375]
[-1.44973731 -0.96077767 -0.16521285]
[-1.88708823 -0.16259314 1.45687694]]
Remarque :
• Nous utilisons la mise à l’échelle pour que
chaque variable ait la même importance lors de
l’ajustement de l’algorithme des k-moyennes.
Autrement, les variables ayant les plages les
plus larges auraient trop d’influence.
Étape 4 : Trouver le nombre optimal de
clusters
• Pour effectuer un clustering k-means en Python, nous
pouvons utiliser la fonction KMeans du module sklearn .
• Cette fonction utilise la syntaxe de base suivante :
L’argument le plus important de cette fonction est n_clusters, qui spécifie dans
combien de clusters placer les observations.
Cependant, nous ne savons pas à l’avance combien de clusters est optimal,
nous devons donc créer un graphique qui affiche le nombre de clusters ainsi
que le SSE (somme des erreurs quadratiques) du modèle.
• Généralement, lorsque nous créons ce type de tracé,
nous recherchons un « coude » où la somme des carrés
commence à « se plier » ou à se stabiliser. Il s’agit
généralement du nombre optimal de clusters.
• Le code suivant montre comment créer ce type de tracé
qui affiche le nombre de clusters sur l’axe des x et le SSE
sur l’axe des y :
#initialize kmeans parameters
kmeans_kwargs = {
"init": "random",
"n_init": 10,
"random_state": 1,
}
#create list to hold SSE values for each k
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, **kmeans_kwargs)
[Link](scaled_df)
[Link](kmeans.inertia_)
#visualize results
[Link](range(1, 11), sse)
[Link](range(1, 11))
[Link]("Number of Clusters")
[Link]("SSE")
[Link]()
• Dans ce graphique, il apparaît qu’il y a un coude ou un «
coude » à k = 3 clusters .
• Ainsi, nous utiliserons 3 clusters lors de l’ajustement de
notre modèle de clustering k-means à l’étape suivante.
• Remarque : Dans le monde réel, il est recommandé
d’utiliser une combinaison de ce tracé et de l’expertise du
domaine pour choisir le nombre de clusters à utiliser.
Étape 5 : Effectuer un clustering K-Means
avec Optimal K
• Le code suivant montre comment effectuer un clustering
k-means sur l’ensemble de données en utilisant la valeur
optimale pour k sur 3 :
#instantiate the k-means class, using optimal number of clusters
kmeans = KMeans(init="random", n_clusters=3, n_init=10,
random_state=1)
#fit k-means algorithm to data
[Link](scaled_df)
#view cluster assignments for each observation
[Link]
array([1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0])
Le tableau résultant montre les affectations de cluster pour
chaque observation dans le DataFrame.
Pour rendre ces résultats plus faciles à interpréter, nous
pouvons ajouter une colonne au DataFrame qui montre
l’affectation du cluster de chaque joueur :
#append cluster assingments to original
DataFrame
df['cluster'] = kmeans.labels_
#view updated DataFrame
print(df)
points assists rebounds cluster
0 18.0 3.0 15 1
2 19.0 4.0 14 1
3 14.0 5.0 10 1
4 14.0 4.0 8 1
5 11.0 7.0 14 1
6 20.0 8.0 13 1
7 28.0 7.0 9 2
8 30.0 6.0 5 2
9 31.0 9.0 4 0
10 35.0 12.0 11 0
11 33.0 14.0 6 0
13 25.0 9.0 5 0
14 25.0 4.0 3 2
15 27.0 3.0 8 2
16 29.0 4.0 12 2
17 30.0 12.0 7 0
18 19.0 15.0 6 0
19 23.0 11.0 5 0
• La colonne de cluster contient un numéro de cluster (0, 1
ou 2) auquel chaque joueur a été attribué.
• Les joueurs appartenant au même cluster ont des valeurs
à peu près similaires pour les colonnes de points , de
passes décisives et de rebonds .