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/uk/5-Clustering/1-Visualize
localizeflow[bot] 9b4e65f176
chore(i18n): sync translations with latest source changes (chunk 1/1, 9 changes)
3 months ago
..
solution chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
README.md chore(i18n): sync translations with latest source changes (chunk 1/1, 9 changes) 3 months ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

Вступ до кластеризації

Кластеризація — це тип некерованого навчання, яке припускає, що набір даних не має міток або що його вхідні дані не співпадають із заздалегідь визначеними виходами. Вона використовує різні алгоритми для сортування немаркованих даних і формування груп згідно з виявленими в даних шаблонами.

No One Like You by PSquare

🎥 Натисніть на зображення вище, щоб переглянути відео. Поки ви вивчаєте машинне навчання з кластеризацією, насолоджуйтеся треками нігерійського Dance Hall — це дуже популярна пісня 2014 року від PSquare.

Передлекційний тест

Вступ

Кластеризація дуже корисна для дослідження даних. Подивимось, чи може вона допомогти виявити тенденції та закономірності у способах споживання музики нігерійською аудиторією.

Приділіть хвилину, щоб подумати про застосування кластеризації. У реальному житті кластеризація трапляється щоразу, коли у вас є купа білизни, і потрібно розсортувати одяг членів родини 🧦👕👖🩲. У науці про дані кластеризація трапляється, коли ви аналізуєте переваги користувача або визначаєте характеристики будь-якого немаркованого набору даних. Кластеризація, у певному сенсі, допомагає навести лад у хаосі, як ящик із шкарпетками.

Introduction to ML

🎥 Натисніть на зображення вище, щоб переглянути відео: Джон Гаттаг із MIT вводить у тему кластеризації

У професійному середовищі кластеризацію можна використовувати для визначення таких речей, як сегментування ринку, наприклад, визначення, які вікові групи купують які товари. Ще одним застосуванням є виявлення аномалій, наприклад, для виявлення шахрайства у даних транзакцій по кредитних картках. Або можна застосувати кластеризацію для визначення пухлин на серії медичних сканів.

Подумайте хвилину про те, як ви могли зустрічати кластеризацію «у природі», у банкінгу, електронній комерції або в бізнес-середовищі.

🎓 Цікаво, що аналіз кластерів виник у галузях антропології та психології у 1930-х роках. Чи уявляєте, як його могли застосовувати?

Також кластеризацію можна використовувати для групування результатів пошуку — наприклад, за посиланнями на покупки, зображеннями чи відгуками. Кластеризація корисна, коли у вас є великий набір даних, який ви хочете зменшити і провести над ним більш детальний аналіз, тому ця техніка може бути використана для вивчення даних до побудови інших моделей.

Коли ваші дані організовані в кластери, ви призначаєте їм ідентифікатор кластеру, і ця техніка може бути корисна для збереження конфіденційності даних; замість того, щоб посилатися на точку даних за більш розкривальною ідентифікаційною інформацією, ви можете посилатися на неї за ідентифікатором кластеру. Чи можете ви назвати інші причини, з яких ви б посилалися на ідентифікатор кластеру замість інших елементів кластеру для його ідентифікації?

Поглибте розуміння технік кластеризації у цьому модулі Learn

Початок роботи з кластеризацією

Scikit-learn пропонує велику низку методів для виконання кластеризації. Обраний вами тип залежатиме від вашого випадку використання. Згідно з документацією, кожен метод має різні переваги. Ось спрощена таблиця методів, підтримуваних Scikit-learn, та їх відповідні сфери застосування:

Назва методу Сфера використання
K-Means загального призначення, індуктивний
Affinity propagation багато, нерівномірні кластери, індуктивний
Mean-shift багато, нерівномірні кластери, індуктивний
Spectral clustering мало, рівні кластери, трансдуктивний
Ward hierarchical clustering багато, обмежені кластери, трансдуктивний
Agglomerative clustering багато, обмежені, неевклідові відстані, трансдуктивний
DBSCAN не плоска геометрія, нерівномірні кластери, трансдуктивний
OPTICS не плоска геометрія, нерівномірні кластери з змінною щільністю, трансдуктивний
Gaussian mixtures плоска геометрія, індуктивний
BIRCH великий набір даних з викидами, індуктивний

🎓 Як ми створюємо кластери, сильно залежить від того, як ми збираємо точки даних у групи. Давайте розглянемо деяку термінологію:

🎓 'Трансдуктивний' проти 'індуктивного'

Трансдуктивне виведення походить із спостережених навчальних випадків, які кореспондують конкретним тестовим випадкам. Індуктивне виведення походить із навчальних випадків, які формують загальні правила, які потім застосовуються до тестових випадків.

Приклад: уявіть, що у вас є набір даних, позначений лише частково. Деякі елементи — це 'платівки', деякі — 'CD', а деякі — без позначок. Ваше завдання — проставити позначки для пустих записів. Якщо ви оберете індуктивний підхід, ви навчите модель виявляти 'платівки' та 'CD' і застосуєте ці позначки до немаркованих даних. Цей підхід матиме труднощі з класифікацією таких елементів, як 'касети'. Трансдуктивний підхід, навпаки, ефективніше опрацьовує невідомі дані, оскільки групує схожі елементи разом, а потім застосовує позначку до групи. У такому випадку кластери можуть відображати 'круглі музичні речі' та 'квадратні музичні речі'.

🎓 'Не плоска' проти 'плоскої' геометрії

Походить із математичної термінології, не плоска проти плоскої геометрії означає оцінку відстаней між точками або за «плоскими» (евклідовими) або за «не плоскими» (неевклідовими) геометричними методами.

«Плоска» в цьому контексті означає евклідову геометрію (частина якої викладається як «планарна» геометрія), а не плоска — неевклідову геометрію. Яке відношення має геометрія до машинного навчання? Оскільки обидві області базуються на математиці, існує загальний спосіб вимірювання відстаней між точками у кластерах, і це можна робити «плоским» або «не плоским» способом залежно від природи даних. Евклідові відстані вимірюються як довжина відрізка між двома точками. Неевклідові відстані вимірюються вздовж кривої. Якщо ваші дані, візуалізовані, здаються такими, що не лежать на площині, можливо, потрібно використати спеціалізований алгоритм для їх обробки.

Flat vs Nonflat Geometry Infographic

Інфографіка від Dasani Madipalli

🎓 'Відстані'

Кластери визначаються за їх матрицею відстаней, напр., відстанями між точками. Цю відстань можна вимірювати кількома способами. Евклідові кластери визначаються середнім значенням точок і мають «центроїд» чи центральну точку. Відстані вимірюються відстанню до центроїда. Неевклідові відстані пов'язані з «кластроїдами» — точками, найближчими до інших точок. Кластроїди, у свою чергу, можуть визначатися різними способами.

🎓 'Обмежені'

Обмежена кластеризація вводить «напівкероване» навчання в цей метод некерованого навчання. Відносини між точками позначаються як «не можна зв’язувати» або «потрібно зв’язувати», щоб накласти деякі правила на набір даних.

Приклад: якщо алгоритм застосувати до набору немаркованих або напівмаркованих даних без обмежень, кластери можуть бути неякісними. У наведеному прикладі кластери можуть утворювати «круглі музичні речі», «квадратні музичні речі», «трикутні речі» і «печиво». Якщо задати деякі обмеження або правила («елемент повинен бути зроблений із пластику», «елемент повинен мати можливість відтворювати музику»), це допоможе «обмежити» алгоритм і зробити кращий вибір.

🎓 «Щільність»

Дані, які містять «шум», вважаються «щільними». Відстані між точками в кожному кластері можуть виявитися більш-менш щільними або «заповненими», тому такі дані потрібно аналізувати відповідним методом кластеризації. Ця стаття демонструє різницю між використанням K-Means і HDBSCAN для дослідження шумного набору даних із нерівномірною щільністю кластерів.

Алгоритми кластеризації

Існує понад 100 алгоритмів кластеризації, і їх використання залежить від природи даних. Розглянемо деякі з основних:

  • Ієрархічна кластеризація. Якщо об’єкт класифікують за близькістю до найближчого об’єкта, а не до більш віддаленого, кластери утворюються на основі відстаней між їхніми членами та іншими об’єктами. Агломеративна кластеризація Scikit-learn є ієрархічною.

    Hierarchical clustering Infographic

    Інфографіка від Dasani Madipalli

  • Центроїдна кластеризація. Цей популярний алгоритм передбачає вибір 'k', тобто кількості кластерів, після чого алгоритм визначає центральну точку кластера і збирає навколо неї дані. K-середніх — популярна версія центроїдної кластеризації. Центр визначається як найближче середнє, звідси й назва. Мінімізується квадрат відстані від кластера.

    Centroid clustering Infographic

    Інфографіка від Dasani Madipalli

  • Кластеризація на основі розподілу. Заснована на статистичному моделюванні, вона полягає у визначенні ймовірності приналежності точки даних до кластера та відповідному призначенні. Методи гаусівських сумішей належать до цього типу.

  • Кластеризація на основі щільності. Точки даних відносяться до кластерів на основі їх щільності, або скупчення. Точки далекі від групи вважаються викидами або шумом. DBSCAN, Mean-shift і OPTICS — представники такого типу кластеризації.

  • Кластеризація на основі сітки. Для багатовимірних наборів даних створюється сітка, і дані діляться по комірках сітки, формуючи кластери.

Завдання — кластеризуйте свої дані

Кластеризацію як техніку значно полегшує правильна візуалізація, тож почнемо з візуалізації наших музичних даних. Це завдання допоможе нам вирішити, який із методів кластеризації найкраще підходить для характеристик цих даних.

  1. Відкрийте файл notebook.ipynb у цій папці.

  2. Імпортуйте пакет Seaborn для якісної візуалізації даних.

    !pip install seaborn
    
  3. Додайте дані пісень із файлу 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
  4. Отримайте деяку інформацію про dataframe, викликавши 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
    
  5. Подвійна перевірка на наявність null значень, викликавши 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
    
  6. Опис статистики даних:

    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', що означає пісні без рейтингу. Давайте незабаром їх видалимо.

  1. Використайте барплот, щоб дізнатися найпопулярніші жанри:

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

    most popular

Якщо хочете побачити більше топ-значень, змініть верхній [:5] на більше число, або видаліть його, щоб побачити всі.

Зверніть увагу, що коли топ-жанр описаний як 'Missing', це означає, що Spotify не класифікував його, тому давайте позбудемося його.

  1. Видаліть відсутні дані, відфільтрувавши їх

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

    Знову перевірте жанри:

    most popular

  2. Найбільше домінують у цьому датасеті три жанри. Зосередьмося на 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')
    
  3. Проведіть швидкий тест, щоб перевірити, чи є сильна кореляція у даних:

    corrmat = df.corr(numeric_only=True)
    f, ax = plt.subplots(figsize=(12, 9))
    sns.heatmap(corrmat, vmax=.8, square=True)
    

    correlations

    Єдина сильна кореляція між energy та loudness, що не дивно, оскільки гучна музика зазвичай досить енергійна. Інші кореляції відносно слабкі. Цікаво буде побачити, що зробить алгоритм кластеризації з цими даними.

    🎓 Зверніть увагу, що кореляція не означає причинність! Ми маємо докази кореляції, але нема доказів причинності. Цікавий веб-сайт має візуалізації, які це підкреслюють.

Чи є у цьому датасеті збіг навколо сприйнятої популярності пісні і її танцювальності? FacetGrid показує концентричні кола, які вирівнюються незалежно від жанру. Чи може бути, що нігерійські смаки збігаються на певному рівні танцювальності для цього жанру?

Спробуйте різні точки даних (енергія, гучність, мовленнєвість) та більше або різні музичні жанри. Що ви можете відкрити? Погляньте на таблицю df.describe(), щоб побачити загальний розподіл даних.

Вправа - розподіл даних

Чи суттєво відрізняються ці три жанри у сприйнятті їх танцювальності, залежно від їх популярності?

  1. Проаналізуйте розподіл даних трьох провідних жанрів за популярністю та танцювальністю на заданих осях 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), який відображає дані за допомогою неперервної кривої густини ймовірності. Це дозволяє інтерпретувати дані при роботі з багатьма розподілами.

    В цілому три жанри помірно вирівнюються за популярністю та танцювальністю. Визначення кластерів у таких слабо вирівняних даних буде викликом:

    distribution

  2. Створіть діаграму розсіювання:

    sns.FacetGrid(df, hue="artist_top_genre", height=5) \
       .map(plt.scatter, "popularity", "danceability") \
       .add_legend()
    

    Діаграма розсіювання тих самих осей показує подібний малюнок збігу

    Facetgrid

В цілому, для кластеризації можна використовувати діаграми розсіювання для візуалізації кластерів даних, тому оволодіння цим типом візуалізації дуже корисне. У наступному уроці ми візьмемо ці відфільтровані дані і використаємо кластеризацію k-середніх, щоб виявити групи у даних, які здаються цікавим чином перетинатися.


🚀Виклик

Для підготовки до наступного уроку зробіть діаграму різних алгоритмів кластеризації, які ви могли б дослідити та використовувати у виробничому середовищі. Які проблеми прагне розв’язати кластеризація?

Пост-лекційний тест

Огляд та самостійне вивчення

Перед застосуванням алгоритмів кластеризації, як ми навчилися, корисно зрозуміти природу вашого датасету. Докладніше про це читайте тут

Ця корисна стаття проведе вас різними способами поведінки алгоритмів кластеризації, залежно від форми даних.

Завдання

Дослідіть інші візуалізації для кластеризації


Відмова від відповідальності: Цей документ було перекладено за допомогою сервісу штучного інтелекту для перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.