12 KiB
K-Means-klusterointi
Pre-lecture quiz
Tässä oppitunnissa opit luomaan klustereita Scikit-learnin avulla ja käyttämällä aiemmin tuomaasi Nigerian musiikkidataa. Käymme läpi K-Meansin perusteet klusterointia varten. Muista, että kuten opit aiemmassa oppitunnissa, klustereiden kanssa työskentelyyn on monia tapoja, ja käyttämäsi menetelmä riippuu datastasi. Kokeilemme K-Meansia, koska se on yleisin klusterointitekniikka. Aloitetaan!
Termit, joista opit lisää:
- Silhouette-pisteytys
- Kyynärpäämenetelmä
- Inertia
- Varianssi
Johdanto
K-Means-klusterointi on menetelmä, joka on peräisin signaalinkäsittelyn alalta. Sitä käytetään jakamaan ja ryhmittelemään dataa 'k' klusteriin havaintojen avulla. Jokainen havainto pyrkii ryhmittelemään tietyn datapisteen lähimpään 'keskiarvoon' eli klusterin keskipisteeseen.
Klusterit voidaan visualisoida Voronoi-diagrammeina, jotka sisältävät pisteen (tai 'siemenen') ja sen vastaavan alueen.
Infografiikka: Jen Looper
K-Means-klusterointiprosessi etenee kolmivaiheisessa prosessissa:
- Algoritmi valitsee k-määrän keskipisteitä ottamalla näytteitä datasta. Tämän jälkeen se toistaa:
- Se määrittää jokaisen näytteen lähimpään keskipisteeseen.
- Se luo uusia keskipisteitä laskemalla kaikkien edellisiin keskipisteisiin määritettyjen näytteiden keskiarvon.
- Sitten se laskee eron uusien ja vanhojen keskipisteiden välillä ja toistaa, kunnes keskipisteet vakiintuvat.
Yksi K-Meansin käytön haittapuoli on se, että sinun täytyy määrittää 'k', eli keskipisteiden määrä. Onneksi 'kyynärpäämenetelmä' auttaa arvioimaan hyvän lähtöarvon 'k':lle. Kokeilet sitä pian.
Esitiedot
Työskentelet tämän oppitunnin notebook.ipynb-tiedostossa, joka sisältää datan tuonnin ja alustavan puhdistuksen, jonka teit edellisessä oppitunnissa.
Harjoitus - valmistelu
Aloita tarkastelemalla uudelleen kappaledataa.
-
Luo laatikkokaavio kutsumalla
boxplot()
jokaiselle sarakkeelle: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)
Tämä data on hieman meluisaa: tarkastelemalla kutakin saraketta laatikkokaaviona voit nähdä poikkeamia.
Voisit käydä datasetin läpi ja poistaa nämä poikkeamat, mutta se tekisi datasta melko vähäistä.
-
Valitse toistaiseksi, mitkä sarakkeet käytät klusterointiharjoituksessa. Valitse sarakkeet, joilla on samanlaiset vaihteluvälit, ja koodaa
artist_top_genre
-sarake numeeriseksi dataksi: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)
-
Nyt sinun täytyy päättää, kuinka monta klusteria kohdistat. Tiedät, että datasetistä on erotettu kolme kappaletyyliä, joten kokeillaan kolmea:
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
Näet tulostettuna taulukon, jossa on ennustetut klusterit (0, 1 tai 2) jokaiselle dataframe-riville.
-
Käytä tätä taulukkoa laskeaksesi 'silhouette-pisteen':
from sklearn import metrics score = metrics.silhouette_score(X, y_cluster_kmeans) score
Silhouette-pisteytys
Etsi silhouette-piste, joka on lähempänä 1:tä. Tämä piste vaihtelee -1:stä 1:een, ja jos piste on 1, klusteri on tiivis ja hyvin erotettu muista klustereista. Arvo lähellä 0:aa edustaa päällekkäisiä klustereita, joissa näytteet ovat hyvin lähellä naapuriklusterien päätösrajaa. (Lähde)
Meidän pisteemme on .53, eli keskivaiheilla. Tämä osoittaa, että datamme ei ole erityisen hyvin soveltuvaa tämän tyyppiseen klusterointiin, mutta jatketaan.
Harjoitus - mallin rakentaminen
-
Tuo
KMeans
ja aloita klusterointiprosessi.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_)
Tässä on muutama osa, jotka vaativat selitystä.
🎓 range: Nämä ovat klusterointiprosessin iteroinnit.
🎓 random_state: "Määrittää satunnaislukugeneraation keskipisteiden alustamiseen." Lähde
🎓 WCSS: "klusterin sisäiset neliösummat" mittaa kaikkien klusterin sisällä olevien pisteiden keskipisteeseen kohdistuvan keskimääräisen etäisyyden neliön. Lähde.
🎓 Inertia: K-Means-algoritmit pyrkivät valitsemaan keskipisteet minimoimaan 'inertiaa', "mitta, kuinka sisäisesti yhtenäisiä klusterit ovat." Lähde. Arvo lisätään wcss-muuttujaan jokaisella iteroinnilla.
🎓 k-means++: Scikit-learnissa voit käyttää 'k-means++'-optimointia, joka "alustaa keskipisteet olemaan (yleensä) kaukana toisistaan, mikä johtaa todennäköisesti parempiin tuloksiin kuin satunnainen alustus."
Kyynärpäämenetelmä
Aiemmin oletit, että koska olet kohdistanut kolme kappaletyyliä, sinun pitäisi valita kolme klusteria. Mutta onko näin?
-
Käytä 'kyynärpäämenetelmää' varmistaaksesi.
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()
Käytä
wcss
-muuttujaa, jonka rakensit edellisessä vaiheessa, luodaksesi kaavion, joka näyttää, missä kyynärpään "taite" on, mikä osoittaa optimaalisen klusterien määrän. Ehkä se onkin 3!
Harjoitus - klustereiden näyttäminen
-
Kokeile prosessia uudelleen, tällä kertaa asettamalla kolme klusteria, ja näytä klusterit hajontakaaviona:
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()
-
Tarkista mallin tarkkuus:
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)))
Tämän mallin tarkkuus ei ole kovin hyvä, ja klustereiden muoto antaa vihjeen miksi.
Tämä data on liian epätasapainoista, liian vähän korreloitua ja sarakearvojen välillä on liikaa vaihtelua, jotta klusterointi onnistuisi hyvin. Itse asiassa muodostuvat klusterit ovat todennäköisesti vahvasti vaikuttuneita tai vinoutuneita yllä määrittelemiemme kolmen tyylilajin mukaan. Tämä oli oppimisprosessi!
Scikit-learnin dokumentaatiosta voit nähdä, että tällaisella mallilla, jossa klusterit eivät ole kovin hyvin rajattuja, on 'varianssi'-ongelma:
Infografiikka: Scikit-learn
Varianssi
Varianssi määritellään "keskiarvona neliöllisistä eroista keskiarvosta" (Lähde). Tässä klusterointiongelman kontekstissa se viittaa dataan, jossa datasetin numerot poikkeavat hieman liikaa keskiarvosta.
✅ Tämä on hyvä hetki miettiä kaikkia tapoja, joilla voisit korjata tämän ongelman. Voisitko muokata dataa hieman enemmän? Käyttää eri sarakkeita? Käyttää eri algoritmia? Vinkki: Kokeile skaalata dataasi normalisoidaksesi sen ja testataksesi muita sarakkeita.
Kokeile tätä 'varianssilaskuria' ymmärtääksesi konseptia hieman paremmin.
🚀Haaste
Käytä aikaa tämän notebookin parissa ja säädä parametreja. Voitko parantaa mallin tarkkuutta puhdistamalla dataa enemmän (esimerkiksi poistamalla poikkeamat)? Voit käyttää painotuksia antaaksesi enemmän painoarvoa tietyille datanäytteille. Mitä muuta voisit tehdä luodaksesi parempia klustereita?
Vinkki: Kokeile skaalata dataasi. Notebookissa on kommentoitua koodia, joka lisää standardisoinnin, jotta datan sarakkeet muistuttaisivat toisiaan enemmän vaihteluvälin osalta. Huomaat, että vaikka silhouette-piste laskee, kyynärpääkaavion "taite" tasoittuu. Tämä johtuu siitä, että jättämällä datan skaalaamatta, data, jolla on vähemmän varianssia, saa enemmän painoarvoa. Lue lisää tästä ongelmasta täältä.
Post-lecture quiz
Kertaus ja itseopiskelu
Tutustu K-Means-simulaattoriin kuten tähän. Voit käyttää tätä työkalua visualisoidaksesi näytepisteitä ja määrittääksesi niiden keskipisteet. Voit muokata datan satunnaisuutta, klusterien määrää ja keskipisteiden määrää. Auttaako tämä sinua saamaan käsityksen siitä, miten data voidaan ryhmitellä?
Tutustu myös tähän K-Means-materiaaliin Stanfordilta.
Tehtävä
Kokeile eri klusterointimenetelmiä
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.