Selles õppetükis õpid, kuidas luua klastreid, kasutades Scikit-learn'i ja varem imporditud Nigeeria muusika andmestikku. Käsitleme K-Meansi klasterdamise põhitõdesid. Pea meeles, et nagu eelnevas õppetükis õppisid, on klastritega töötamiseks palju erinevaid meetodeid ja valik sõltub sinu andmetest. Proovime K-Meansi, kuna see on kõige levinum klasterdamise tehnika. Alustame!
Mõisted, mida õpid:
- Silueti skoor
- Küünarnuki meetod
- Inerts
- Variants
K-Meansi klasterdamine on meetod, mis pärineb signaalitöötluse valdkonnast. Seda kasutatakse andmete jagamiseks ja rühmitamiseks 'k' klastritesse, kasutades vaatluste seeriat. Iga vaatlus töötab selle nimel, et rühmitada antud andmepunkt lähima 'keskmise' ehk klastri keskpunkti juurde.
Klastreid saab visualiseerida kui Voronoi diagramme, mis sisaldavad punkti (või 'seemet') ja selle vastavat piirkonda.
infograafik autorilt Jen Looper
K-Meansi klasterdamise protsess toimub kolmes etapis:
- Algoritm valib k-arvu keskpunktid, võttes proove andmestikust. Seejärel kordab:
- Määrab iga proovi lähima centroidi juurde.
- Loob uued centroidid, arvutades kõigi eelmiste centroidide juurde määratud proovide keskmise väärtuse.
- Arvutab uute ja vanade centroidide erinevuse ning kordab, kuni centroidid stabiliseeruvad.
Üks K-Meansi kasutamise puudus on see, et pead määrama 'k', ehk centroidide arvu. Õnneks aitab 'küünarnuki meetod' hinnata head algväärtust 'k' jaoks. Proovime seda kohe.
Töötad selle õppetüki notebook.ipynb failis, mis sisaldab andmete importimist ja esmast puhastamist, mida tegid eelmises õppetükis.
Alusta, vaadates uuesti laulude andmeid.
-
Loo kastdiagramm, kutsudes
boxplot()iga veeru jaoks: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)
Need andmed on veidi müra täis: iga veeru kastdiagrammi vaadates näed kõrvalekaldeid.
Sa võiksid andmestiku läbi käia ja need kõrvalekalded eemaldada, kuid see muudaks andmed üsna minimaalseks.
-
Praegu vali, milliseid veerge kasutad klasterdamise harjutuseks. Vali need, millel on sarnased vahemikud, ja kodeeri veerg
artist_top_genrenumbrilisteks andmeteks: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)
-
Nüüd pead valima, kui palju klastreid sihtida. Tead, et andmestikust eraldasime 3 laulude žanrit, seega proovime 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
Näed välja prinditud massiivi, kus iga andmeraami rea jaoks on ennustatud klaster (0, 1 või 2).
-
Kasuta seda massiivi, et arvutada 'silueti skoor':
from sklearn import metrics score = metrics.silhouette_score(X, y_cluster_kmeans) score
Otsi silueti skoori, mis on lähemal 1-le. See skoor varieerub -1-st 1-ni, ja kui skoor on 1, on klaster tihe ja hästi eraldatud teistest klastritest. Väärtus, mis on lähedal 0-le, tähistab kattuvaid klastreid, kus proovid on väga lähedal naaberklastrite otsustuspiirile. (Allikas)
Meie skoor on .53, seega keskmine. See näitab, et meie andmed ei sobi eriti hästi selliseks klasterdamiseks, kuid jätkame.
-
Impordi
KMeansja alusta klasterdamise protsessi.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_)
Siin on mõned osad, mis vajavad selgitamist.
🎓 range: Need on klasterdamise protsessi iteratsioonid.
🎓 random_state: "Määrab juhuslike arvude genereerimise centroidide algväärtustamiseks." Allikas
🎓 WCSS: "klastri sees olevate ruutude summa" mõõdab kõigi punktide keskmist ruutkaugust klastri centroidist. Allikas.
🎓 Inerts: K-Meansi algoritmid püüavad valida centroidid, et minimeerida 'inertsust', "mõõdet, kui sisemiselt koherentne klaster on." Allikas. Väärtus lisatakse wcss muutujale igal iteratsioonil.
🎓 k-means++: Scikit-learn'is saad kasutada 'k-means++' optimeerimist, mis "algväärtustab centroidid, et need oleksid (üldiselt) üksteisest kaugel, mis viib tõenäoliselt paremate tulemusteni kui juhuslik algväärtustamine."
Varem arvasid, et kuna sihtisid 3 laulude žanrit, peaksid valima 3 klastrit. Aga kas see on nii?
-
Kasuta 'küünarnuki meetodit', et olla kindel.
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()
Kasuta
wcssmuutujat, mille ehitasid eelmises etapis, et luua diagramm, mis näitab, kus on 'küünarnuki' painutus, mis näitab optimaalset klastrite arvu. Võib-olla on see tõesti 3!
-
Proovi protsessi uuesti, seekord määrates kolm klastrit, ja kuva klastrid hajusdiagrammina:
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()
-
Kontrolli mudeli täpsust:
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)))
Selle mudeli täpsus ei ole väga hea ja klastrite kuju annab vihje, miks.
Need andmed on liiga tasakaalust väljas, liiga vähe korrelatsioonis ja veergude väärtuste vahel on liiga palju variatsiooni, et hästi klasterdada. Tegelikult on klastrid, mis moodustuvad, tõenäoliselt tugevalt mõjutatud või kallutatud kolme žanrikategooria poolt, mille me ülal määratlesime. See oli õppeprotsess!
Scikit-learn'i dokumentatsioonis näed, et mudel nagu see, kus klastrid ei ole väga hästi eraldatud, on 'variantsi' probleemiga:
Infograafik Scikit-learn'ist
Variants on defineeritud kui "keskmine ruutude erinevustest keskmisest" (Allikas). Selle klasterdamisprobleemi kontekstis viitab see andmetele, kus meie andmestiku numbrid kipuvad keskmisest liiga palju kõrvale kalduma.
✅ See on suurepärane hetk mõelda kõigile viisidele, kuidas saaksid seda probleemi lahendada. Kas andmeid veidi rohkem kohandada? Kasutada erinevaid veerge? Kasutada teistsugust algoritmi? Vihje: Proovi andmete skaleerimist, et neid normaliseerida ja testida teisi veerge.
Proovi seda 'variantsi kalkulaatorit', et mõista kontseptsiooni veidi paremini.
Veeda aega selle märkmikuga, kohandades parameetreid. Kas suudad mudeli täpsust parandada, puhastades andmeid rohkem (näiteks eemaldades kõrvalekaldeid)? Saad kasutada kaalu, et anda teatud andmeproovidele rohkem kaalu. Mida veel saad teha, et luua paremaid klastreid?
Vihje: Proovi oma andmeid skaleerida. Märkmikus on kommenteeritud kood, mis lisab standardse skaleerimise, et muuta andmeveerud vahemiku osas üksteisele sarnasemaks. Näed, et kuigi silueti skoor langeb, muutub küünarnuki graafiku 'kink' sujuvamaks. See on tingitud sellest, et andmete skaleerimata jätmine võimaldab väiksema variatsiooniga andmetel rohkem kaalu kanda. Loe selle probleemi kohta veidi rohkem siin.
Vaata K-Meansi simulaatorit näiteks seda. Saad kasutada seda tööriista, et visualiseerida näidisandmepunkte ja määrata nende centroidid. Saad muuta andmete juhuslikkust, klastrite arvu ja centroidide arvu. Kas see aitab sul paremini mõista, kuidas andmeid saab rühmitada?
Samuti vaata seda K-Meansi käsiraamatut Stanfordist.
Proovi erinevaid klasterdamise meetodeid
Vastutusest loobumine:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.




