12 KiB
K-Means zhlukovanie
Kvíz pred prednáškou
V tejto lekcii sa naučíte, ako vytvárať zhluky pomocou Scikit-learn a datasetu nigérijskej hudby, ktorý ste importovali skôr. Pokryjeme základy K-Means pre zhlukovanie. Pamätajte, že ako ste sa naučili v predchádzajúcej lekcii, existuje mnoho spôsobov, ako pracovať so zhlukmi, a metóda, ktorú použijete, závisí od vašich dát. Skúsime K-Means, pretože je to najbežnejšia technika zhlukovania. Poďme na to!
Pojmy, o ktorých sa dozviete:
- Silhouette skóre
- Metóda lakťa
- Inercia
- Variancia
Úvod
K-Means zhlukovanie je metóda odvodená z oblasti spracovania signálov. Používa sa na rozdelenie a rozčlenenie skupín dát do 'k' zhlukov pomocou série pozorovaní. Každé pozorovanie pracuje na zoskupení daného dátového bodu najbližšie k jeho najbližšiemu 'priemeru', alebo stredovému bodu zhluku.
Zhluky je možné vizualizovať ako Voronoi diagramy, ktoré zahŕňajú bod (alebo 'semienko') a jeho zodpovedajúcu oblasť.
Infografika od Jen Looper
Proces K-Means zhlukovania prebieha v trojstupňovom procese:
- Algoritmus vyberie k-počet stredových bodov vzorkovaním z datasetu. Potom cykluje:
- Priradí každú vzorku k najbližšiemu centroidu.
- Vytvorí nové centroidy vypočítaním priemernej hodnoty všetkých vzoriek priradených k predchádzajúcim centroidom.
- Potom vypočíta rozdiel medzi novými a starými centroidmi a opakuje, kým sa centroidy nestabilizujú.
Jednou nevýhodou používania K-Means je fakt, že budete musieť určiť 'k', teda počet centroidov. Našťastie metóda 'lakťa' pomáha odhadnúť dobrú počiatočnú hodnotu pre 'k'. Hneď si to vyskúšate.
Predpoklad
Budete pracovať v súbore notebook.ipynb, ktorý obsahuje import dát a predbežné čistenie, ktoré ste vykonali v poslednej lekcii.
Cvičenie - príprava
Začnite tým, že sa znova pozriete na dáta piesní.
-
Vytvorte boxplot, zavolaním
boxplot()
pre každý stĺpec:plt.figure(figsize=(20,20), dpi=200) plt.subplot(4,3,1) sns.boxplot(x = 'popularity', data = df) plt.subplot(4,3,2) sns.boxplot(x = 'acousticness', data = df) plt.subplot(4,3,3) sns.boxplot(x = 'energy', data = df) plt.subplot(4,3,4) sns.boxplot(x = 'instrumentalness', data = df) plt.subplot(4,3,5) sns.boxplot(x = 'liveness', data = df) plt.subplot(4,3,6) sns.boxplot(x = 'loudness', data = df) plt.subplot(4,3,7) sns.boxplot(x = 'speechiness', data = df) plt.subplot(4,3,8) sns.boxplot(x = 'tempo', data = df) plt.subplot(4,3,9) sns.boxplot(x = 'time_signature', data = df) plt.subplot(4,3,10) sns.boxplot(x = 'danceability', data = df) plt.subplot(4,3,11) sns.boxplot(x = 'length', data = df) plt.subplot(4,3,12) sns.boxplot(x = 'release_date', data = df)
Tieto dáta sú trochu hlučné: pozorovaním každého stĺpca ako boxplotu môžete vidieť odľahlé hodnoty.
Môžete prejsť dataset a odstrániť tieto odľahlé hodnoty, ale to by spravilo dáta dosť minimálne.
-
Zatiaľ si vyberte, ktoré stĺpce použijete pre vaše cvičenie zhlukovania. Vyberte tie s podobnými rozsahmi a zakódujte stĺpec
artist_top_genre
ako numerické dáta:from sklearn.preprocessing import LabelEncoder le = LabelEncoder() X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] y = df['artist_top_genre'] X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) y = le.transform(y)
-
Teraz musíte vybrať, koľko zhlukov chcete cieliť. Viete, že existujú 3 hudobné žánre, ktoré sme vyčlenili z datasetu, takže skúsme 3:
from sklearn.cluster import KMeans nclusters = 3 seed = 0 km = KMeans(n_clusters=nclusters, random_state=seed) km.fit(X) # Predict the cluster for each data point y_cluster_kmeans = km.predict(X) y_cluster_kmeans
Vidíte vytlačené pole s predpovedanými zhlukmi (0, 1 alebo 2) pre každý riadok dataframe.
-
Použite toto pole na výpočet 'silhouette skóre':
from sklearn import metrics score = metrics.silhouette_score(X, y_cluster_kmeans) score
Silhouette skóre
Hľadajte silhouette skóre bližšie k 1. Toto skóre sa pohybuje od -1 do 1, a ak je skóre 1, zhluk je hustý a dobre oddelený od ostatných zhlukov. Hodnota blízka 0 predstavuje prekrývajúce sa zhluky so vzorkami veľmi blízko rozhodovacej hranice susedných zhlukov. (Zdroj)
Naše skóre je .53, takže je presne v strede. To naznačuje, že naše dáta nie sú obzvlášť vhodné pre tento typ zhlukovania, ale pokračujme.
Cvičenie - vytvorte model
-
Importujte
KMeans
a začnite proces zhlukovania.from sklearn.cluster import KMeans wcss = [] for i in range(1, 11): kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) kmeans.fit(X) wcss.append(kmeans.inertia_)
Tu je niekoľko častí, ktoré si zaslúžia vysvetlenie.
🎓 range: Toto sú iterácie procesu zhlukovania.
🎓 random_state: "Určuje generovanie náhodných čísel pre inicializáciu centroidov." Zdroj
🎓 WCSS: "súčet štvorcov v rámci zhluku" meria štvorcovú priemernú vzdialenosť všetkých bodov v rámci zhluku od centroidu zhluku. Zdroj.
🎓 Inercia: Algoritmy K-Means sa snažia vybrať centroidy tak, aby minimalizovali 'inerciu', "mieru toho, ako sú zhluky vnútorne koherentné." Zdroj. Hodnota sa pridáva do premennej wcss pri každej iterácii.
🎓 k-means++: V Scikit-learn môžete použiť optimalizáciu 'k-means++', ktorá "inicializuje centroidy tak, aby boli (zvyčajne) vzdialené od seba, čo vedie k pravdepodobne lepším výsledkom ako náhodná inicializácia."
Metóda lakťa
Predtým ste predpokladali, že keďže ste cielili 3 hudobné žánre, mali by ste zvoliť 3 zhluky. Ale je to tak?
-
Použite metódu 'lakťa', aby ste si boli istí.
plt.figure(figsize=(10,5)) sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') plt.title('Elbow') plt.xlabel('Number of clusters') plt.ylabel('WCSS') plt.show()
Použite premennú
wcss
, ktorú ste vytvorili v predchádzajúcom kroku, na vytvorenie grafu, ktorý ukazuje, kde je 'ohyb' v lakti, čo naznačuje optimálny počet zhlukov. Možno je to naozaj 3!
Cvičenie - zobrazte zhluky
-
Skúste proces znova, tentoraz nastavte tri zhluky a zobrazte zhluky ako scatterplot:
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters = 3) kmeans.fit(X) labels = kmeans.predict(X) plt.scatter(df['popularity'],df['danceability'],c = labels) plt.xlabel('popularity') plt.ylabel('danceability') plt.show()
-
Skontrolujte presnosť modelu:
labels = kmeans.labels_ correct_labels = sum(y == labels) print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
Presnosť tohto modelu nie je veľmi dobrá a tvar zhlukov vám dáva náznak prečo.
Tieto dáta sú príliš nevyvážené, málo korelované a medzi hodnotami stĺpcov je príliš veľká variancia na to, aby sa dobre zhlukovali. V skutočnosti sú zhluky, ktoré sa tvoria, pravdepodobne silne ovplyvnené alebo skreslené tromi kategóriami žánrov, ktoré sme definovali vyššie. To bol proces učenia!
V dokumentácii Scikit-learn môžete vidieť, že model ako tento, s nie veľmi dobre vyznačenými zhlukmi, má problém s 'varianciou':
Infografika zo Scikit-learn
Variancia
Variancia je definovaná ako "priemer štvorcových rozdielov od priemeru" (Zdroj). V kontexte tohto problému zhlukovania sa vzťahuje na dáta, kde čísla nášho datasetu majú tendenciu odchýliť sa trochu príliš od priemeru.
✅ Toto je skvelý moment na zamyslenie sa nad všetkými spôsobmi, ako by ste mohli tento problém opraviť. Upraviť dáta trochu viac? Použiť iné stĺpce? Použiť iný algoritmus? Tip: Skúste škálovať vaše dáta na ich normalizáciu a otestovať iné stĺpce.
Skúste tento 'kalkulátor variancie', aby ste lepšie pochopili tento koncept.
🚀Výzva
Strávte nejaký čas s týmto notebookom, upravujte parametre. Dokážete zlepšiť presnosť modelu čistením dát (napríklad odstránením odľahlých hodnôt)? Môžete použiť váhy na pridanie väčšej váhy určitým vzorkám dát. Čo ešte môžete urobiť na vytvorenie lepších zhlukov?
Tip: Skúste škálovať vaše dáta. V notebooku je komentovaný kód, ktorý pridáva štandardné škálovanie, aby sa stĺpce dát viac podobali z hľadiska rozsahu. Zistíte, že zatiaľ čo silhouette skóre klesá, 'ohyb' v grafe lakťa sa vyhladzuje. Je to preto, že ponechanie dát neškálovaných umožňuje dátam s menšou varianciou niesť väčšiu váhu. Prečítajte si o tomto probléme tu.
Kvíz po prednáške
Prehľad a samostatné štúdium
Pozrite sa na simulátor K-Means ako je tento. Môžete použiť tento nástroj na vizualizáciu vzoriek dátových bodov a určenie ich centroidov. Môžete upraviť náhodnosť dát, počet zhlukov a počet centroidov. Pomáha vám to získať predstavu o tom, ako môžu byť dáta zoskupené?
Tiež sa pozrite na tento materiál o K-Means zo Stanfordu.
Zadanie
Vyskúšajte rôzne metódy zhlukovania
Upozornenie:
Tento dokument bol preložený pomocou služby AI prekladu Co-op Translator. Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.