Klastrowanie K-Means metodą Elbow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Klastrowanie metodą K-Means metodą Elbow

Grupowanie K-średnich to nienadzorowany algorytm uczenia się, który grupuje dane na podstawie każdego punktu odległości euklidesowej do punktu centralnego zwanego środek ciężkości. Centroidy są definiowane za pomocą wszystkich punktów znajdujących się w tym samym klastrze. Algorytm najpierw wybiera losowe punkty jako centroidy, a następnie iteruje, dostosowując je do pełnej zbieżności.

Ważną rzeczą do zapamiętania podczas korzystania z K-średnich jest to, że liczba klastrów jest hiperparametrem, zostanie zdefiniowana przed uruchomieniem modelu.

K-średnie można zaimplementować za pomocą Scikit-Learn za pomocą zaledwie 3 linii kodu. Scikit-learn ma już dostępną metodę optymalizacji centroidów, km oznacza++, co pomaga w szybszej zbieżności modelu.

Aby zastosować algorytm grupowania K-średnich, załadujmy Pingwiny Palmera zestawu danych, wybierz kolumny, które zostaną zgrupowane, i użyj programu Seaborn do sporządzenia wykresu rozrzutu z klastrami oznaczonymi kolorami.

Note: Możesz pobrać zestaw danych z tego link.

Zaimportujmy biblioteki i załadujmy zbiór danych Penguins, przycinając go do wybranych kolumn i upuszczając wiersze z brakującymi danymi (były tylko 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)

Możemy użyć metody Elbow, aby wskazać klastry dla naszych danych. Polega na interpretacji wykresu liniowego o kształcie łokcia. Liczba skupisk to zgięcia łokci. Oś x wykresu to liczba skupień, a oś y to suma kwadratów w obrębie skupień (WCSS) dla każdej liczby skupień:

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 łokcia wskazuje, że nasze dane mają 2 skupienia. Narysujmy dane przed i po grupowaniu:

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');

Klastrowanie K-Means metodą Elbow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Ten przykład pokazuje, jak metoda Elbow jest tylko odniesieniem, gdy jest używana do wybierania liczby skupień. Wiemy już, że w zbiorze danych mamy 3 rodzaje pingwinów, ale gdybyśmy mieli określić ich liczbę metodą Łokcia, naszym wynikiem byłyby 2 skupiska.

Ponieważ K-średnie są wrażliwe na wariancję danych, spójrzmy na statystyki opisowe kolumn, które grupujemy:

df.describe().T 

To skutkuje:

 					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

Zauważ, że średnia jest daleka od odchylenia standardowego (std), co wskazuje na dużą wariancję. Spróbujmy go zmniejszyć, skalując dane za pomocą skalera standardowego:

from sklearn.preprocessing import StandardScaler

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

Teraz powtórzmy proces metody Elbow dla przeskalowanych danych:

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);

Klastrowanie K-Means metodą Elbow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

Tym razem sugerowana liczba skupień wynosi 3. Możemy ponownie wykreślić dane z etykietami skupień wraz z dwoma poprzednimi wykresami dla porównania:

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');

Klastrowanie K-Means metodą Elbow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Korzystając z klastrowania K-średnich, należy wstępnie określić liczbę klastrów. Jak widzieliśmy, używając metody wyboru naszego k liczba skupień, wynik jest jedynie sugestią i może na niego wpływać wielkość wariancji danych. Ważne jest, aby przeprowadzić dogłębną analizę i wygenerować więcej niż jeden model z różnymi _k_s podczas klastrowania.

Jeśli nie ma wcześniejszego wskazania, ile klastrów znajduje się w danych, zwizualizuj je, przetestuj i zinterpretuj, aby zobaczyć, czy wyniki grupowania mają sens. Jeśli nie, zgrupuj ponownie. Przyjrzyj się także więcej niż jednej metryce i stwórz wystąpienie różnych modeli klastrowania – dla średnich K, spójrz na wynik sylwetki i być może na klastrowanie hierarchiczne, aby sprawdzić, czy wyniki pozostają takie same.

Znak czasu:

Więcej z Nadużycie stosu