K-Means Clustering cu metoda Elbow PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

K-Means Clustering cu metoda Elbow

Gruparea K-means este un algoritm de învățare nesupravegheat care grupează datele pe baza fiecărui punct distanța euclidiană până la un punct central numit centroid. Centroizii sunt definiți prin intermediul tuturor punctelor care se află în același grup. Algoritmul alege mai întâi puncte aleatorii ca centroizi și apoi repetă ajustându-le până la convergența completă.

Un lucru important de reținut atunci când utilizați K-means, este că numărul de clustere este un hiperparametru, acesta va fi definit înainte de rularea modelului.

K-means pot fi implementate folosind Scikit-Learn cu doar 3 linii de cod. Scikit-learn are deja disponibilă o metodă de optimizare a centrului, kmeans++, care ajută modelul să convergă mai repede.

Pentru a aplica algoritmul de grupare K-means, să încărcăm Pinguinii Palmer setul de date, alegeți coloanele care vor fi grupate și utilizați Seaborn pentru a reprezenta un grafic de dispersie cu clustere codate prin culori.

notițe: Puteți descărca setul de date de aici legătură.

Să importăm bibliotecile și să încărcăm setul de date Penguins, tăind-l în coloanele alese și aruncând rândurile cu date lipsă (au fost doar 2):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df = pd.read_csv('penguins.csv')
print(df.shape) 
df = df[['bill_length_mm', 'flipper_length_mm']]
df = df.dropna(axis=0)

Putem folosi metoda Elbow pentru a avea o indicație a clusterelor pentru datele noastre. Constă în interpretarea unui grafic de linii cu formă de cot. Numărul de ciorchini este în care se îndoaie cotul. Axa x a graficului este numărul de clustere, iar axa y este Suma pătratelor din cadrul clusterelor (WCSS) pentru fiecare număr de clustere:

wcss = []

for i in range(1, 11):
    clustering = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering.fit(df)
    wcss.append(clustering.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss);

Metoda cotului indică că datele noastre au 2 grupuri. Să trasăm datele înainte și după grupare:

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without clustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('Using the elbow method');

K-Means Clustering cu metoda Elbow PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Acest exemplu arată cum metoda Elbow este doar o referință atunci când este utilizată pentru a alege numărul de clustere. Știm deja că avem 3 tipuri de pinguini în setul de date, dar dacă ar fi să le determinăm numărul folosind metoda Elbow, 2 clustere ar fi rezultatul nostru.

Deoarece K-means este sensibil la variația datelor, să ne uităm la statisticile descriptive ale coloanelor pe care le grupăm:

df.describe().T 

Rezultă:

 					count 	mean 		std 		min 	25% 	50% 	75% 	max
bill_length_mm 		342.0 	43.921930 	5.459584 	32.1 	39.225 	44.45 	48.5 	59.6
flipper_length_mm 	342.0 	200.915205 	14.061714 	172.0 	190.000 197.00 	213.0 	231.0

Observați că media este departe de abaterea standard (std), aceasta indică o varianță mare. Să încercăm să o reducem prin scalarea datelor cu Standard Scaler:

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
scaled = ss.fit_transform(df)

Acum, să repetăm ​​procesul metodei Elbow pentru datele scalate:

wcss_sc = []

for i in range(1, 11):
    clustering_sc = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering_sc.fit(scaled)
    wcss_sc.append(clustering_sc.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss_sc);

K-Means Clustering cu metoda Elbow PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!

De această dată, numărul sugerat de clustere este 3. Putem reprezenta datele cu etichetele cluster din nou împreună cu cele două diagrame anterioare pentru comparație:

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without cliustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('With the Elbow method')
sns.scatterplot(ax=axes[2], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering_sc.labels_).set_title('With the Elbow method and scaled data');

K-Means Clustering cu metoda Elbow PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Când utilizați K-means Clustering, trebuie să predeterminați numărul de clustere. După cum am văzut când folosim o metodă de a ne alege k numărul de clustere, rezultatul este doar o sugestie și poate fi afectat de cantitatea de variație a datelor. Este important să se efectueze o analiză aprofundată și să se genereze mai mult de un model cu _k_s diferite atunci când se grupează.

Dacă nu există nicio indicație prealabilă cu privire la câte grupuri sunt în date, vizualizați-l, testați-l și interpretați-l pentru a vedea dacă rezultatele grupării au sens. Dacă nu, grupați din nou. De asemenea, uitați-vă la mai multe valori și instanțiați diferite modele de grupare - pentru K-means, uitați-vă la scorul siluetei și poate la Clustering ierarhic pentru a vedea dacă rezultatele rămân aceleași.

Timestamp-ul:

Mai mult de la Stackabuse