Klastrowanie k-średnich w pythonie: przykład krok po kroku


Jednym z najpopularniejszych algorytmów grupowania w uczeniu maszynowym jest grupowanie k-średnich .

Grupowanie K-średnich to technika, w której każdą obserwację ze zbioru danych umieszczamy w jednym z K klastrów.

Ostatecznym celem jest utworzenie K klastrów, w których obserwacje w każdym klastrze są do siebie dość podobne, podczas gdy obserwacje w różnych klastrach znacznie się od siebie różnią.

W praktyce do przeprowadzenia grupowania K-średnich stosujemy następujące kroki:

1. Wybierz wartość K.

  • Najpierw musimy zdecydować, ile skupień chcemy zidentyfikować w danych. Często wystarczy po prostu przetestować kilka różnych wartości K i przeanalizować wyniki, aby zobaczyć, która liczba skupień wydaje się mieć największy sens dla danego problemu.

2. Losowo przypisz każdą obserwację do skupienia początkowego, od 1 do K.

3. Wykonuj poniższą procedurę, aż przypisania klastrów przestaną się zmieniać.

  • Dla każdej z gromad K oblicz środek ciężkości gromady. Jest to po prostu wektor p- średnich cech obserwacji k-tego klastra.
  • Przypisz każdą obserwację do klastra o najbliższym centroidzie. Tutaj najbliżej definiuje się odległość euklidesową .

Poniższy przykład pokazuje krok po kroku, jak wykonać grupowanie k-średnich w Pythonie przy użyciu funkcji KMeans z modułu sklearn .

Krok 1: Zaimportuj niezbędne moduły

Najpierw zaimportujemy wszystkie moduły potrzebne do wykonania grupowania k-średnich:

 import pandas as pd
import numpy as np
import matplotlib. pyplot as plt
from sklearn. cluster import KMeans
from sklearn. preprocessing import StandardScaler

Krok 2: Utwórz ramkę danych

Następnie utworzymy DataFrame zawierającą następujące trzy zmienne dla 20 różnych koszykarzy:

  • zwrotnica
  • pomoc
  • odbija się

Poniższy kod pokazuje, jak utworzyć tę ramkę DataFrame pand:

 #createDataFrame
df = pd. DataFrame ({' points ': [18, np.nan, 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,
                               np.nan, 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 ( df.head ())

   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

Będziemy używać grupowania k-średnich do grupowania podobnych aktorów w oparciu o te trzy metryki.

Krok 3: Oczyść i przygotuj ramkę DataFrame

Następnie wykonamy następujące kroki:

  • Użyj dropna() , aby upuścić wiersze z wartościami NaN w dowolnej kolumnie
  • Użyj StandardScaler() , aby przeskalować każdą zmienną tak, aby miała średnią 0 i odchylenie standardowe 1.

Poniższy kod pokazuje, jak to zrobić:

 #drop rows with NA values in any columns
df = df. dropna ()

#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]]

Uwaga : Stosujemy skalowanie, aby każda zmienna miała takie samo znaczenie podczas dopasowywania algorytmu k-średnich. W przeciwnym razie zmienne o najszerszych zakresach miałyby zbyt duży wpływ.

Krok 4: Znajdź optymalną liczbę skupień

Aby wykonać grupowanie k-średnich w Pythonie, możemy użyć funkcji KMeans z modułu sklearn .

Ta funkcja wykorzystuje następującą podstawową składnię:

KMeans(init=’random’, n_clusters=8, n_init=10, random_state=None)

Złoto:

  • init : Kontroluje technikę inicjalizacji.
  • n_clusters : liczba klastrów, w których należy umieścić obserwacje.
  • n_init : Liczba inicjalizacji do wykonania. Domyślnie uruchamiany jest algorytm k-średnich 10 razy i zwracany jest ten z najniższym SSE.
  • random_state : Wartość całkowita, którą możesz wybrać, aby wyniki algorytmu były powtarzalne.

Najważniejszym argumentem tej funkcji jest n_clusters, który określa, w ilu klastrach należy umieścić obserwacje.

Nie wiemy jednak z góry, ile skupień jest optymalnych, dlatego musimy stworzyć wykres przedstawiający liczbę skupień oraz SSE (suma kwadratów błędów) modelu.

Zazwyczaj, tworząc tego typu wykres, szukamy „kolana”, w którym suma kwadratów zaczyna się „zaginać” lub wyrównywać. Jest to na ogół optymalna liczba klastrów.

Poniższy kod pokazuje, jak utworzyć tego typu wykres, który wyświetla liczbę skupień na osi x i SSE na osi 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)
    kmeans. fit (scaled_df)
    sse. append (kmeans.inertia_)

#visualize results
plt. plot (range(1, 11), sse)
plt. xticks (range(1, 11))
plt. xlabel (" Number of Clusters ")
plt. ylabel (“ SSE ”)
plt. show () 

Na tym wykresie wydaje się, że w k = 3 skupiskach występuje załamanie lub „kolano”.

Zatem w następnym kroku podczas dopasowywania naszego modelu grupowania k-średnich użyjemy 3 klastrów.

Uwaga : w świecie rzeczywistym zaleca się użycie kombinacji tego wykresu i wiedzy specjalistycznej w dziedzinie, aby wybrać liczbę używanych klastrów.

Krok 5: Wykonaj grupowanie K-średnich z optymalnym K

Poniższy kod pokazuje, jak wykonać grupowanie k-średnich na zbiorze danych przy użyciu optymalnej wartości k z 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
kmeans. fit (scaled_df)

#view cluster assignments for each observation
kmeans. labels_

array([1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0]) 

Wynikowa tabela przedstawia przypisania klastrów dla każdej obserwacji w ramce DataFrame.

Aby ułatwić interpretację tych wyników, możemy dodać kolumnę do DataFrame, która pokazuje przypisanie każdego gracza do klastra:

 #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

Kolumna klastra zawiera numer klastra (0, 1 lub 2), do którego przypisano każdego gracza.

Zawodnicy należący do tego samego klastra mają w przybliżeniu podobne wartości w kolumnach punktów , asyst i zbiórek .

Uwaga : Pełną dokumentację funkcji KMeans sklearna znajdziesz tutaj .

Dodatkowe zasoby

Poniższe samouczki wyjaśniają, jak wykonywać inne typowe zadania w Pythonie:

Jak wykonać regresję liniową w Pythonie
Jak przeprowadzić regresję logistyczną w Pythonie
Jak przeprowadzić weryfikację krzyżową K-Fold w Pythonie

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *