A K-means klaszterezés egy nem felügyelt tanulási algoritmus, amely minden egyes pont euklideszi távolsága alapján csoportosítja az adatokat egy központi ponthoz, ún. súlypontja. A súlypontokat az ugyanabban a klaszterben lévő összes pont átlaga határozza meg. Az algoritmus először véletlenszerű pontokat választ ki súlypontoknak, majd a teljes konvergenciaig iterálja azokat.
A K-közép használatakor fontos megjegyezni, hogy a klaszterek száma hiperparaméter, amelyet a modell futtatása előtt kell meghatározni.
A K-means a Scikit-Learn segítségével valósítható meg mindössze 3 sornyi kóddal. A Scikit-learn már rendelkezik egy centroid optimalizálási módszerrel is, kmeans++, ami segít a modellnek gyorsabban konvergálni.
A K-közép klaszterezési algoritmus alkalmazásához töltsük be a Palmer pingvinek adatkészletet, válassza ki a fürtözendő oszlopokat, és a Seaborn segítségével rajzoljon meg egy színkódolt fürtöket tartalmazó szórást.
Megjegyzések: Innen töltheti le az adatkészletet link.
Importáljuk a könyvtárakat, és töltsük be a Penguins adatkészletet, vágjuk le a kiválasztott oszlopokra, és dobjuk el a hiányzó adatokat tartalmazó sorokat (csak 2 volt):
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)
Használhatjuk az Elbow módszert, hogy az adatainkhoz tartozó klasztereket jelezzük. Ez egy könyök alakú vonalrajz értelmezéséből áll. A klaszterek száma a könyökhajlatok száma. A diagram x tengelye a klaszterek száma, az y tengely pedig a klaszterek négyzetösszege (WCSS) értéke minden egyes számú klaszterhez:
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);
A könyök módszer azt jelzi, hogy adataink 2 klaszterből állnak. Ábrázoljuk a klaszterezés előtti és utáni adatokat:
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');
Ez a példa bemutatja, hogy az Elbow metódus csak referenciaként szolgál a fürtök számának kiválasztásához. Azt már tudjuk, hogy 3 fajta pingvin található az adathalmazban, de ha a számukat Könyök módszerrel határoznánk meg, akkor 2 klaszter lenne az eredmény.
Mivel a K-means érzékeny az adatvarianciára, nézzük meg az általunk klaszterezett oszlopok leíró statisztikáit:
df.describe().T
Ennek eredményeként:
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
Figyeljük meg, hogy az átlag messze van a szórástól (std), ez nagy szórást jelez. Próbáljuk meg csökkenteni az adatok skálázásával a Standard Scalerrel:
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
scaled = ss.fit_transform(df)
Most ismételjük meg a Könyök módszer folyamatát a skálázott adatokhoz:
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);
Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!
A klaszterek javasolt száma ezúttal 3. Összehasonlítás céljából ismét ábrázolhatjuk az adatokat a klasztercímkékkel együtt a két korábbi diagrammal:
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');
A K-means Clustering használatakor előre meg kell határoznia a fürtök számát. Amint láttuk, amikor egy módszert választunk a mi k a klaszterek számát, az eredmény csak javaslat, és befolyásolhatja az adatok eltérésének mértéke. Fontos, hogy mélyreható elemzést végezzünk, és több modellt állítsunk elő különböző _k_-kkal a klaszterezés során.
Ha nincs előzetes jelzés arra vonatkozóan, hogy hány fürt van az adatokban, akkor vizualizálja, tesztelje és értelmezze, hogy megtudja, van-e értelme a klaszterezési eredményeknek. Ha nem, csoportosítsa újra. Ezenkívül nézzen meg egynél több mérőszámot, és példányosítsa meg a különböző klaszterezési modelleket – a K-átlagok esetében nézze meg a sziluett pontszámot és esetleg a hierarchikus klaszterezést, hogy lássa, az eredmények ugyanazok maradnak-e.