35 KiB
Вступ до кластеризації
Кластеризація — це тип навчання без учителя, який передбачає, що набір даних не має міток або його вхідні дані не пов’язані з визначеними виходами. Вона використовує різні алгоритми для аналізу немаркованих даних і створення груп на основі виявлених у даних закономірностей.
🎥 Натисніть на зображення вище, щоб переглянути відео. Поки ви вивчаєте машинне навчання з кластеризацією, насолоджуйтесь нігерійськими танцювальними треками — це високо оцінена пісня 2014 року від PSquare.
Тест перед лекцією
Вступ
Кластеризація дуже корисна для дослідження даних. Давайте подивимося, чи може вона допомогти виявити тенденції та закономірності у способах споживання музики нігерійською аудиторією.
✅ Зробіть паузу та подумайте про застосування кластеризації. У реальному житті кластеризація відбувається, коли у вас є купа білизни, і вам потрібно розсортувати одяг членів вашої родини 🧦👕👖🩲. У науці про дані кластеризація відбувається під час аналізу уподобань користувачів або визначення характеристик будь-якого немаркованого набору даних. Кластеризація, певною мірою, допомагає навести лад у хаосі, як у шухляді для шкарпеток.
🎥 Натисніть на зображення вище, щоб переглянути відео: Джон Гуттаг з MIT представляє кластеризацію.
У професійному середовищі кластеризацію можна використовувати для визначення таких речей, як сегментація ринку, наприклад, визначення, які вікові групи купують які товари. Інше застосування — виявлення аномалій, наприклад, для виявлення шахрайства в наборі даних про транзакції кредитних карток. Або ви можете використовувати кластеризацію для визначення пухлин у партії медичних сканів.
✅ Подумайте хвилину про те, як ви могли зустрічати кластеризацію «у дикій природі», у банківській, електронній комерції чи бізнес-середовищі.
🎓 Цікаво, що аналіз кластерів виник у галузях антропології та психології у 1930-х роках. Уявляєте, як його могли використовувати?
Альтернативно, кластеризацію можна використовувати для групування результатів пошуку — наприклад, за посиланнями на покупки, зображеннями чи відгуками. Кластеризація корисна, коли у вас є великий набір даних, який ви хочете зменшити та на якому хочете провести більш детальний аналіз, тому цей метод можна використовувати для вивчення даних перед створенням інших моделей.
✅ Коли ваші дані організовані в кластери, ви призначаєте їм ідентифікатор кластеру, і ця техніка може бути корисною для збереження конфіденційності набору даних; замість цього ви можете посилатися на точку даних за її ідентифікатором кластеру, а не за більш розкриваючими даними. Чи можете ви придумати інші причини, чому ви б використовували ідентифікатор кластеру, а не інші елементи кластеру для його ідентифікації?
Поглибте своє розуміння технік кластеризації в цьому навчальному модулі.
Початок роботи з кластеризацією
Scikit-learn пропонує широкий вибір методів для виконання кластеризації. Тип, який ви оберете, залежатиме від вашого випадку використання. Згідно з документацією, кожен метод має різні переваги. Ось спрощена таблиця методів, підтримуваних Scikit-learn, і їх відповідних випадків використання:
Назва методу | Випадок використання |
---|---|
K-Means | загального призначення, індуктивний |
Affinity propagation | багато, нерівномірні кластери, індуктивний |
Mean-shift | багато, нерівномірні кластери, індуктивний |
Spectral clustering | мало, рівномірні кластери, трансдуктивний |
Ward hierarchical clustering | багато, обмежені кластери, трансдуктивний |
Agglomerative clustering | багато, обмежені, неевклідові відстані, трансдуктивний |
DBSCAN | не плоска геометрія, нерівномірні кластери, трансдуктивний |
OPTICS | не плоска геометрія, нерівномірні кластери зі змінною щільністю, трансдуктивний |
Gaussian mixtures | плоска геометрія, індуктивний |
BIRCH | великий набір даних із викидами, індуктивний |
🎓 Як ми створюємо кластери, багато в чому залежить від того, як ми групуємо точки даних у групи. Давайте розберемо деяку термінологію:
🎓 'Трансдуктивний' vs. 'індуктивний'
Трансдуктивний висновок базується на спостережуваних навчальних випадках, які відповідають конкретним тестовим випадкам. Індуктивний висновок базується на навчальних випадках, які відповідають загальним правилам, які лише потім застосовуються до тестових випадків.
Приклад: Уявіть, що у вас є набір даних, який лише частково має мітки. Деякі речі — це «платівки», деякі — «CD», а деякі — порожні. Ваше завдання — надати мітки для порожніх. Якщо ви обираєте індуктивний підхід, ви тренуєте модель, шукаючи «платівки» та «CD», і застосовуєте ці мітки до немаркованих даних. Цей підхід матиме труднощі з класифікацією речей, які насправді є «касетами». Трансдуктивний підхід, з іншого боку, ефективніше працює з невідомими даними, оскільки він групує схожі елементи разом і потім застосовує мітку до групи. У цьому випадку кластери можуть відображати «круглі музичні речі» та «квадратні музичні речі».
🎓 'Не плоска' vs. 'плоска' геометрія
Взято з математичної термінології, не плоска vs. плоска геометрія стосується вимірювання відстаней між точками за допомогою «плоских» (евклідових) або «не плоских» (неевклідових) геометричних методів.
'Плоска' в цьому контексті стосується евклідової геометрії (частини якої викладаються як «планіметрія»), а не плоска стосується неевклідової геометрії. Що геометрія має спільного з машинним навчанням? Як дві галузі, які базуються на математиці, має бути загальний спосіб вимірювання відстаней між точками в кластерах, і це можна зробити «плоским» або «не плоским» способом, залежно від природи даних. Евклідові відстані вимірюються як довжина відрізка між двома точками. Неевклідові відстані вимірюються вздовж кривої. Якщо ваші дані, візуалізовані, здаються такими, що не існують на площині, вам може знадобитися спеціалізований алгоритм для їх обробки.
Інфографіка від Dasani Madipalli
Кластери визначаються їх матрицею відстаней, тобто відстанями між точками. Ця відстань може вимірюватися кількома способами. Евклідові кластери визначаються середнім значенням точок і містять «центроїд» або центральну точку. Відстані вимірюються від центроїда. Неевклідові відстані стосуються «кластроїдів», точки, найближчої до інших точок. Кластроїди, у свою чергу, можуть визначатися різними способами.
Обмежена кластеризація вводить «напівконтрольоване» навчання в цей метод без учителя. Відносини між точками позначаються як «не можна зв’язати» або «потрібно зв’язати», тому деякі правила накладаються на набір даних.
Приклад: Якщо алгоритм вільно працює з партією немаркованих або частково маркованих даних, кластери, які він створює, можуть бути низької якості. У наведеному вище прикладі кластери можуть групувати «круглі музичні речі», «квадратні музичні речі», «трикутні речі» та «печиво». Якщо надати деякі обмеження або правила, яких слід дотримуватися («елемент має бути виготовлений із пластику», «елемент має бути здатним відтворювати музику»), це може допомогти «обмежити» алгоритм для прийняття кращих рішень.
🎓 'Щільність'
Дані, які є «шумними», вважаються «щільними». Відстані між точками в кожному з його кластерів можуть виявитися, при перевірці, більш-менш щільними або «переповненими», і тому ці дані потрібно аналізувати за допомогою відповідного методу кластеризації. Ця стаття демонструє різницю між використанням кластеризації K-Means і алгоритмів HDBSCAN для дослідження шумного набору даних із нерівномірною щільністю кластерів.
Алгоритми кластеризації
Існує понад 100 алгоритмів кластеризації, і їх використання залежить від природи даних. Давайте обговоримо деякі основні:
-
Ієрархічна кластеризація. Якщо об’єкт класифікується за його близькістю до сусіднього об’єкта, а не до більш віддаленого, кластери формуються на основі відстані їх членів до інших об’єктів. Ієрархічна кластеризація Scikit-learn є агломеративною.
Інфографіка від Dasani Madipalli
-
Кластеризація за центроїдом. Цей популярний алгоритм вимагає вибору «k», або кількості кластерів для формування, після чого алгоритм визначає центральну точку кластеру та збирає дані навколо цієї точки. Кластеризація K-means є популярною версією кластеризації за центроїдом. Центр визначається найближчим середнім значенням, звідси й назва. Квадратна відстань від кластеру мінімізується.
Інфографіка від Dasani Madipalli
-
Кластеризація на основі розподілу. Заснована на статистичному моделюванні, кластеризація на основі розподілу зосереджена на визначенні ймовірності того, що точка даних належить кластеру, і відповідно її призначення. Методи гаусівської суміші належать до цього типу.
-
Кластеризація на основі щільності. Точки даних призначаються кластерам на основі їх щільності або групування навколо одна одної. Точки даних, віддалені від групи, вважаються викидами або шумом. DBSCAN, Mean-shift і OPTICS належать до цього типу кластеризації.
-
Кластеризація на основі сітки. Для багатовимірних наборів даних створюється сітка, і дані розподіляються між комірками сітки, створюючи таким чином кластери.
Вправа — кластеризуйте свої дані
Кластеризація як техніка значно полегшується за допомогою належної візуалізації, тому давайте почнемо з візуалізації наших музичних даних. Ця вправа допоможе нам вирішити, який із методів кластеризації найефективніше використовувати для природи цих даних.
-
Відкрийте файл notebook.ipynb у цій папці.
-
Імпортуйте пакет
Seaborn
для якісної візуалізації даних.!pip install seaborn
-
Додайте дані про пісні з nigerian-songs.csv. Завантажте фрейм даних із деякою інформацією про пісні. Підготуйтеся до дослідження цих даних, імпортувавши бібліотеки та вивівши дані:
import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv("../data/nigerian-songs.csv") df.head()
Перевірте перші кілька рядків даних:
name album artist artist_top_genre release_date length popularity danceability acousticness energy instrumentalness liveness loudness speechiness tempo time_signature 0 Sparky Mandy & The Jungle Cruel Santino alternative r&b 2019 144000 48 0.666 0.851 0.42 0.534 0.11 -6.699 0.0829 133.015 5 1 shuga rush EVERYTHING YOU HEARD IS TRUE Odunsi (The Engine) afropop 2020 89488 30 0.71 0.0822 0.683 0.000169 0.101 -5.64 0.36 129.993 3 2 LITT! LITT! AYLØ indie r&b 2018 207758 40 0.836 0.272 0.564 0.000537 0.11 -7.127 0.0424 130.005 4 3 Confident / Feeling Cool Enjoy Your Life Lady Donli nigerian pop 2019 175135 14 0.894 0.798 0.611 0.000187 0.0964 -4.961 0.113 111.087 4 4 wanted you rare. Odunsi (The Engine) afropop 2018 152049 25 0.702 0.116 0.833 0.91 0.348 -6.044 0.0447 105.115 4 -
Отримайте інформацію про датафрейм, викликавши
info()
:df.info()
Вихідні дані виглядають так:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 530 entries, 0 to 529 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 530 non-null object 1 album 530 non-null object 2 artist 530 non-null object 3 artist_top_genre 530 non-null object 4 release_date 530 non-null int64 5 length 530 non-null int64 6 popularity 530 non-null int64 7 danceability 530 non-null float64 8 acousticness 530 non-null float64 9 energy 530 non-null float64 10 instrumentalness 530 non-null float64 11 liveness 530 non-null float64 12 loudness 530 non-null float64 13 speechiness 530 non-null float64 14 tempo 530 non-null float64 15 time_signature 530 non-null int64 dtypes: float64(8), int64(4), object(4) memory usage: 66.4+ KB
-
Перевірте наявність пропущених значень, викликавши
isnull()
і переконавшись, що сума дорівнює 0:df.isnull().sum()
Все добре:
name 0 album 0 artist 0 artist_top_genre 0 release_date 0 length 0 popularity 0 danceability 0 acousticness 0 energy 0 instrumentalness 0 liveness 0 loudness 0 speechiness 0 tempo 0 time_signature 0 dtype: int64
-
Опишіть дані:
df.describe()
release_date length popularity danceability acousticness energy instrumentalness liveness loudness speechiness tempo time_signature count 530 530 530 530 530 530 530 530 530 530 530 530 mean 2015.390566 222298.1698 17.507547 0.741619 0.265412 0.760623 0.016305 0.147308 -4.953011 0.130748 116.487864 3.986792 std 3.131688 39696.82226 18.992212 0.117522 0.208342 0.148533 0.090321 0.123588 2.464186 0.092939 23.518601 0.333701 min 1998 89488 0 0.255 0.000665 0.111 0 0.0283 -19.362 0.0278 61.695 3 25% 2014 199305 0 0.681 0.089525 0.669 0 0.07565 -6.29875 0.0591 102.96125 4 50% 2016 218509 13 0.761 0.2205 0.7845 0.000004 0.1035 -4.5585 0.09795 112.7145 4 75% 2017 242098.5 31 0.8295 0.403 0.87575 0.000234 0.164 -3.331 0.177 125.03925 4 max 2020 511738 73 0.966 0.954 0.995 0.91 0.811 0.582 0.514 206.007 5
🤔 Якщо ми працюємо з кластеризацією, методом без нагляду, який не потребує міток даних, чому ми показуємо ці дані з мітками? На етапі дослідження даних вони корисні, але для роботи алгоритмів кластеризації вони не є необхідними. Ви можете просто видалити заголовки стовпців і посилатися на дані за номером стовпця.
Подивіться на загальні значення даних. Зверніть увагу, що популярність може бути "0", що вказує на пісні без рейтингу. Давайте незабаром видалимо їх.
-
Використовуйте стовпчасту діаграму, щоб дізнатися найпопулярніші жанри:
import seaborn as sns top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top[:5].index,y=top[:5].values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue')
✅ Якщо ви хочете побачити більше топових значень, змініть [:5]
на більше значення або видаліть його, щоб побачити всі.
Зверніть увагу, коли топовий жанр описується як "Missing", це означає, що Spotify не класифікував його, тому давайте позбудемося його.
-
Видаліть відсутні дані, відфільтрувавши їх:
df = df[df['artist_top_genre'] != 'Missing'] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue')
Тепер перевірте жанри ще раз:
-
Три найпопулярніші жанри значно домінують у цьому наборі даних. Зосередимося на
afro dancehall
,afropop
іnigerian pop
, додатково відфільтруємо набір даних, щоб видалити все з популярністю 0 (тобто те, що не було класифіковано за популярністю в наборі даних і може вважатися шумом для наших цілей):df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] df = df[(df['popularity'] > 0)] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue')
-
Проведіть швидкий тест, щоб перевірити, чи дані мають сильну кореляцію:
corrmat = df.corr(numeric_only=True) f, ax = plt.subplots(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True)
Єдина сильна кореляція — між
energy
іloudness
, що не дивно, враховуючи, що гучна музика зазвичай досить енергійна. В іншому випадку кореляції відносно слабкі. Буде цікаво побачити, що алгоритм кластеризації зможе зробити з цими даними.🎓 Зверніть увагу, що кореляція не означає причинно-наслідковий зв'язок! Ми маємо доказ кореляції, але не маємо доказу причинності. Цікавий веб-сайт має візуалізації, які підкреслюють цю думку.
Чи є в цьому наборі даних зближення навколо сприйнятої популярності пісні та її танцювальності? FacetGrid показує концентричні кола, які вирівнюються незалежно від жанру. Чи може бути так, що смаки в Нігерії сходяться на певному рівні танцювальності для цього жанру?
✅ Спробуйте різні точки даних (energy, loudness, speechiness) і більше або інші музичні жанри. Що ви можете виявити? Подивіться на таблицю df.describe()
, щоб побачити загальний розподіл точок даних.
Вправа - розподіл даних
Чи значно відрізняються ці три жанри за сприйняттям їхньої танцювальності на основі популярності?
-
Дослідіть розподіл даних наших трьох топових жанрів за популярністю та танцювальністю вздовж заданих осей x та y.
sns.set_theme(style="ticks") g = sns.jointplot( data=df, x="popularity", y="danceability", hue="artist_top_genre", kind="kde", )
Ви можете побачити концентричні кола навколо загальної точки зближення, що показує розподіл точок.
🎓 Зверніть увагу, що в цьому прикладі використовується графік KDE (Kernel Density Estimate), який представляє дані за допомогою безперервної кривої ймовірності. Це дозволяє інтерпретувати дані при роботі з кількома розподілами.
Загалом, три жанри приблизно вирівнюються за популярністю та танцювальністю. Визначення кластерів у цих слабо вирівняних даних буде викликом:
-
Створіть діаграму розсіювання:
sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend()
Діаграма розсіювання для тих самих осей показує схожу картину зближення.
Загалом, для кластеризації ви можете використовувати діаграми розсіювання, щоб показати кластери даних, тому освоєння цього типу візуалізації дуже корисне. У наступному уроці ми візьмемо ці відфільтровані дані та використаємо кластеризацію k-means, щоб виявити групи в цих даних, які, здається, цікаво перекриваються.
🚀Виклик
У підготовці до наступного уроку створіть діаграму про різні алгоритми кластеризації, які ви можете виявити та використовувати в робочому середовищі. Які проблеми намагається вирішити кластеризація?
Післялекційний тест
Огляд і самостійне навчання
Перед тим як застосовувати алгоритми кластеризації, як ми дізналися, важливо зрозуміти природу вашого набору даних. Читайте більше на цю тему тут
Ця корисна стаття пояснює різні способи поведінки алгоритмів кластеризації залежно від форми даних.
Завдання
Дослідіть інші візуалізації для кластеризації
Відмова від відповідальності:
Цей документ було перекладено за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.