17 KiB
K-Means кластерисање
Квиз пре предавања
У овом лекцији ћете научити како да креирате кластере користећи Scikit-learn и нигеријски музички сет података који сте раније увезли. Покрићемо основе K-Means метода за кластерисање. Имајте на уму да, као што сте научили у претходној лекцији, постоји много начина за рад са кластерима, а метод који користите зависи од ваших података. Пробаћемо K-Means јер је то најчешћа техника кластерисања. Хајде да почнемо!
Термини које ћете научити:
- Силуетно оцењивање
- Елбоу метода
- Инерција
- Варијанса
Увод
K-Means кластерисање је метода која потиче из области обраде сигнала. Користи се за поделу и груписање података у 'k' кластера користећи серију опсервација. Свака опсервација ради на груписању датих тачака података најближе њиховом 'средњем', или централној тачки кластера.
Кластери се могу визуализовати као Воронојеви дијаграми, који укључују тачку (или 'семе') и њену одговарајућу регију.
инфографика од Jen Looper
Процес K-Means кластерисања извршава се у три корака:
- Алгоритам бира k-број централних тачака узорковањем из скупа података. Након тога, понавља:
- Додељује сваки узорак најближем центроиду.
- Креира нове центроиде узимајући средњу вредност свих узорака додељених претходним центроидима.
- Затим израчунава разлику између нових и старих центроида и понавља док се центроиди не стабилизују.
Један недостатак коришћења K-Means је то што морате одредити 'k', односно број центроида. Срећом, 'елбоу метода' помаже у процени доброг почетног броја за 'k'. Ускоро ћете је испробати.
Предуслов
Радићете у датотеци notebook.ipynb која укључује увоз података и прелиминарно чишћење које сте урадили у претходној лекцији.
Вежба - припрема
Почните тако што ћете поново погледати податке о песмама.
-
Креирајте boxplot, позивајући
boxplot()
за сваку колону: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)
Ови подаци су мало бучни: посматрајући сваку колону као boxplot, можете видети одступања.
Могли бисте проћи кроз сет података и уклонити ова одступања, али то би учинило податке прилично минималним.
-
За сада, изаберите које колоне ћете користити за своју вежбу кластерисања. Одаберите оне са сличним опсегом и кодирајте колону
artist_top_genre
као нумеричке податке: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)
-
Сада треба да одредите колико кластера ћете циљати. Знате да постоје 3 жанра песама које смо издвојили из скупа података, па хајде да пробамо са 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
Видећете низ исписан са предвиђеним кластерима (0, 1 или 2) за сваки ред у dataframe-у.
-
Користите овај низ да израчунате 'силуетну оцену':
from sklearn import metrics score = metrics.silhouette_score(X, y_cluster_kmeans) score
Силуетна оцена
Тражите силуетну оцену ближу 1. Ова оцена варира од -1 до 1, и ако је оцена 1, кластер је густ и добро одвојен од других кластера. Вредност близу 0 представља преклапајуће кластере са узорцима веома близу граници одлуке суседних кластера. (Извор)
Наша оцена је .53, што је негде у средини. Ово указује да наши подаци нису нарочито погодни за ову врсту кластерисања, али хајде да наставимо.
Вежба - изградња модела
-
Увезите
KMeans
и започните процес кластерисања.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_)
Постоји неколико делова овде који заслужују објашњење.
🎓 range: Ово су итерације процеса кластерисања
🎓 random_state: "Одређује генерисање случајних бројева за иницијализацију центроида." Извор
🎓 WCSS: "сума квадрата унутар кластера" мери просечну квадратну удаљеност свих тачака унутар кластера до центроида кластера. Извор.
🎓 Инерција: K-Means алгоритми покушавају да изаберу центроиде како би минимизовали 'инерцију', "меру колико су кластери унутрашње кохерентни." Извор. Вредност се додаје променљивој wcss на свакој итерацији.
🎓 k-means++: У Scikit-learn можете користити 'k-means++' оптимизацију, која "иницијализује центроиде да буду (углавном) удаљени један од другог, што доводи до вероватно бољих резултата него случајна иницијализација."
Елбоу метода
Раније сте претпоставили да, пошто сте циљали 3 жанра песама, треба да изаберете 3 кластера. Али да ли је то случај?
-
Користите 'елбоу методу' да се уверите.
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()
Користите променљиву
wcss
коју сте изградили у претходном кораку да креирате графикон који показује где је 'прелом' у лакту, што указује на оптималан број кластера. Можда је то заиста 3!
Вежба - приказ кластера
-
Поновите процес, овог пута постављајући три кластера, и прикажите кластере као 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()
-
Проверите тачност модела:
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)))
Тачност овог модела није баш добра, а облик кластера вам даје наговештај зашто.
Ови подаци су превише неуравнотежени, премало корелисани и постоји превелика варијанса између вредности колона да би се добро кластерисали. У ствари, кластери који се формирају вероватно су снажно утицани или искривљени од стране три категорије жанра које смо горе дефинисали. То је био процес учења!
У документацији Scikit-learn-а можете видети да модел попут овог, са кластерима који нису баш добро разграничени, има проблем 'варијансе':
Инфографика из Scikit-learn-а
Варијанса
Варијанса је дефинисана као "просек квадратних разлика од средње вредности" (Извор). У контексту овог проблема кластерисања, она се односи на податке где бројеви нашег скупа података имају тенденцију да се превише удаљавају од средње вредности.
✅ Ово је одличан тренутак да размислите о свим начинима на које бисте могли да исправите овај проблем. Да ли да мало више прилагодите податке? Да ли да користите друге колоне? Да ли да користите другачији алгоритам? Савет: Пробајте скалирање података да их нормализујете и тестирајте друге колоне.
Пробајте овај 'калкулатор варијансе' да боље разумете концепт.
🚀Изазов
Проведите мало времена са овим notebook-ом, прилагођавајући параметре. Можете ли побољшати тачност модела чишћењем података (на пример, уклањањем одступања)? Можете користити тежине да дате већу тежину одређеним узорцима података. Шта још можете урадити да креирате боље кластере?
Савет: Пробајте да скалирате своје податке. У notebook-у постоји коментарисан код који додаје стандардно скалирање како би колоне података више личиле једна на другу у смислу опсега. Приметићете да, иако силуетна оцена опада, 'прелом' у графикону лакта се изравнава. То је зато што остављање података нескалираним омогућава подацима са мањом варијансом да носе већу тежину. Прочитајте мало више о овом проблему овде.
Квиз после предавања
Преглед и самостално учење
Погледајте симулатор K-Means као што је овај. Можете користити овај алат за визуализацију узорака података и одређивање њихових центроида. Можете уређивати случајност података, број кластера и број центроида. Да ли вам ово помаже да добијете идеју о томе како се подаци могу груписати?
Такође, погледајте овај материјал о K-Means са Станфорда.
Задатак
Испробајте различите методе кластерисања
Одрицање од одговорности:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције Co-op Translator. Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.