You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/lt/5-Clustering/2-K-Means
leestott 3773c80b49
🌐 Update translations via Co-op Translator
2 weeks ago
..
solution 🌐 Update translations via Co-op Translator 3 weeks ago
README.md 🌐 Update translations via Co-op Translator 2 weeks ago
assignment.md 🌐 Update translations via Co-op Translator 3 weeks ago
notebook.ipynb 🌐 Update translations via Co-op Translator 3 weeks ago

README.md

K-Means klasterizacija

Prieš paskaitą - testas

Šioje pamokoje išmoksite kurti klasterius naudodami Scikit-learn ir anksčiau importuotą Nigerijos muzikos duomenų rinkinį. Aptarsime K-Means klasterizacijos pagrindus. Atminkite, kad, kaip sužinojote ankstesnėje pamokoje, yra daug būdų dirbti su klasteriais, o pasirinktas metodas priklauso nuo jūsų duomenų. Išbandysime K-Means, nes tai yra dažniausiai naudojama klasterizacijos technika. Pradėkime!

Sąvokos, apie kurias sužinosite:

  • Silueto įvertinimas
  • Alkūnės metodas
  • Inercija
  • Dispersija

Įvadas

K-Means klasterizacija yra metodas, kilęs iš signalų apdorojimo srities. Jis naudojamas duomenų grupėms padalyti ir suskirstyti į „k“ klasterius, remiantis stebėjimų serija. Kiekvienas stebėjimas padeda priskirti duomenų tašką artimiausiam „vidurkiui“ arba klasterio centrui.

Klasteriai gali būti vizualizuojami kaip Voronoi diagramos, kurios apima tašką (arba „sėklą“) ir atitinkamą regioną.

voronoi diagrama

Infografikas sukurtas Jen Looper

K-Means klasterizacijos procesas vykdomas trijų žingsnių procesu:

  1. Algoritmas pasirenka k skaičių centrinių taškų, imdamas mėginius iš duomenų rinkinio. Po to jis kartoja:
    1. Priskiria kiekvieną mėginį artimiausiam centroidui.
    2. Sukuria naujus centroidus, apskaičiuodamas visų ankstesniems centroidams priskirtų mėginių vidurkį.
    3. Tada apskaičiuoja skirtumą tarp naujų ir senų centroidų ir kartoja, kol centroidai stabilizuojasi.

Vienas iš K-Means trūkumų yra tas, kad reikia nustatyti „k“, t. y. centrinių taškų skaičių. Laimei, „alkūnės metodas“ padeda įvertinti gerą pradinę „k“ reikšmę. Netrukus tai išbandysite.

Būtinos žinios

Šioje pamokoje dirbsite su notebook.ipynb failu, kuriame yra duomenų importavimas ir preliminarus valymas, atliktas ankstesnėje pamokoje.

Užduotis - pasiruošimas

Pradėkite dar kartą peržiūrėdami dainų duomenis.

  1. Sukurkite dėžutės diagramą, iškviesdami boxplot() kiekvienai stulpelio reikšmei:

    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)
    

    Šie duomenys yra šiek tiek triukšmingi: stebėdami kiekvieną stulpelį kaip dėžutės diagramą, galite pastebėti išskirtis.

    išskirtys

Galėtumėte peržiūrėti duomenų rinkinį ir pašalinti šias išskirtis, tačiau tai padarytų duomenis gana minimaliais.

  1. Šiuo metu pasirinkite, kuriuos stulpelius naudosite klasterizacijos užduočiai. Pasirinkite tuos, kurių reikšmės yra panašaus diapazono, ir užkoduokite artist_top_genre stulpelį kaip skaitinius duomenis:

    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)
    
  2. Dabar turite nuspręsti, kiek klasterių taikysite. Žinote, kad duomenų rinkinyje yra 3 dainų žanrai, todėl pabandykime 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
    

Matote išspausdintą masyvą su numatytais klasteriais (0, 1 arba 2) kiekvienai duomenų rėmelio eilutei.

  1. Naudokite šį masyvą, kad apskaičiuotumėte „silueto įvertinimą“:

    from sklearn import metrics
    score = metrics.silhouette_score(X, y_cluster_kmeans)
    score
    

Silueto įvertinimas

Siekite silueto įvertinimo, artimo 1. Šis įvertinimas svyruoja nuo -1 iki 1, ir jei įvertinimas yra 1, klasteris yra tankus ir gerai atskirtas nuo kitų klasterių. Reikšmė, artima 0, reiškia persidengiančius klasterius, kurių mėginiai yra labai arti kaimyninių klasterių sprendimo ribos. (Šaltinis)

Mūsų įvertinimas yra 0.53, taigi vidutinis. Tai rodo, kad mūsų duomenys nėra ypač tinkami šio tipo klasterizacijai, tačiau tęskime.

Užduotis - modelio kūrimas

  1. Importuokite KMeans ir pradėkite klasterizacijos procesą.

    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_)
    
    

    Čia yra keletas dalių, kurias verta paaiškinti.

    🎓 range: Tai yra klasterizacijos proceso iteracijos.

    🎓 random_state: „Nustato atsitiktinių skaičių generavimą centroidų inicializavimui.“ Šaltinis

    🎓 WCSS: „klasterio viduje esančių kvadratų suma“ matuoja vidutinį kvadratinį atstumą tarp visų taškų klasteryje ir klasterio centro. Šaltinis.

    🎓 Inercija: K-Means algoritmai bando pasirinkti centroidus, kad sumažintų „inerciją“, „matuojančią, kaip viduje klasteriai yra nuoseklūs“. Šaltinis. Reikšmė pridedama prie wcss kintamojo kiekvienoje iteracijoje.

    🎓 k-means++: Naudojant Scikit-learn, galite naudoti „k-means++“ optimizaciją, kuri „inicializuoja centroidus taip, kad jie būtų (paprastai) nutolę vienas nuo kito, o tai dažniausiai duoda geresnius rezultatus nei atsitiktinė inicializacija“.

Alkūnės metodas

Anksčiau nusprendėte, kad, kadangi taikote 3 dainų žanrus, turėtumėte pasirinkti 3 klasterius. Bet ar tikrai?

  1. Naudokite „alkūnės metodą“, kad įsitikintumėte.

    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()
    

    Naudokite wcss kintamąjį, kurį sukūrėte ankstesniame žingsnyje, kad sukurtumėte diagramą, rodančią, kur yra „alkūnės“ lenkimas, kuris nurodo optimalų klasterių skaičių. Galbūt tai tikrai yra 3!

    alkūnės metodas

Užduotis - klasterių atvaizdavimas

  1. Pakartokite procesą, šį kartą nustatydami tris klasterius, ir atvaizduokite juos kaip sklaidos diagramą:

    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()
    
  2. Patikrinkite modelio tikslumą:

    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)))
    

    Šio modelio tikslumas nėra labai geras, o klasterių forma leidžia suprasti, kodėl.

    klasteriai

    Šie duomenys yra per daug nesubalansuoti, per mažai susiję, o stulpelių reikšmių dispersija yra per didelė, kad būtų galima gerai klasterizuoti. Iš tiesų, susiformavę klasteriai tikriausiai yra stipriai paveikti arba iškreipti trijų žanrų kategorijų, kurias apibrėžėme aukščiau. Tai buvo mokymosi procesas!

    Scikit-learn dokumentacijoje galite matyti, kad modelis, kaip šis, su prastai apibrėžtais klasteriais, turi „dispersijos“ problemą:

    probleminiai modeliai

    Infografikas iš Scikit-learn

Dispersija

Dispersija apibrėžiama kaip „vidutinė kvadratinių skirtumų nuo vidurkio reikšmė“ (Šaltinis). Šios klasterizacijos problemos kontekste tai reiškia, kad mūsų duomenų reikšmės per daug nutolsta nuo vidurkio.

Tai puikus momentas pagalvoti apie visus būdus, kaip galėtumėte išspręsti šią problemą. Patobulinti duomenis? Naudoti kitus stulpelius? Išbandyti kitą algoritmą? Užuomina: pabandykite normalizuoti savo duomenis ir išbandyti kitus stulpelius.

Išbandykite šį 'dispersijos skaičiuoklę', kad geriau suprastumėte šią sąvoką.


🚀Iššūkis

Praleiskite šiek tiek laiko su šiuo užrašų knygeliu, keisdami parametrus. Ar galite pagerinti modelio tikslumą, dar labiau išvalydami duomenis (pavyzdžiui, pašalindami išskirtis)? Galite naudoti svorius, kad suteiktumėte daugiau reikšmės tam tikriems duomenų mėginiams. Ką dar galite padaryti, kad sukurtumėte geresnius klasterius?

Užuomina: pabandykite normalizuoti savo duomenis. Užrašų knygelėje yra pakomentuotas kodas, kuris prideda standartinį mastelio keitimą, kad duomenų stulpeliai būtų panašesni pagal diapazoną. Pastebėsite, kad nors silueto įvertinimas sumažėja, „alkūnės“ grafiko lenkimas tampa lygesnis. Taip yra todėl, kad palikus duomenis nenormalizuotus, mažesnės dispersijos duomenys turi didesnę įtaką. Plačiau apie šią problemą skaitykite čia.

Po paskaitos - testas

Apžvalga ir savarankiškas mokymasis

Pažvelkite į K-Means simuliatorių tokį kaip šis. Naudodami šį įrankį galite vizualizuoti pavyzdinius duomenų taškus ir nustatyti jų centroidus. Galite redaguoti duomenų atsitiktinumą, klasterių skaičių ir centroidų skaičių. Ar tai padeda geriau suprasti, kaip duomenys gali būti grupuojami?

Taip pat peržiūrėkite šį Stanfordo K-Means vadovą.

Užduotis

Išbandykite skirtingus klasterizacijos metodus


Atsakomybės apribojimas:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą Co-op Translator. Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus aiškinimus, atsiradusius dėl šio vertimo naudojimo.