35 KiB
Введение в кластеризацию
Кластеризация — это тип Обучения без учителя, который предполагает, что набор данных не имеет меток или что его входные данные не сопоставлены с заранее определёнными выходами. Он использует различные алгоритмы для сортировки немаркированных данных и формирования групп в соответствии с выявленными в данных закономерностями.
🎥 Нажмите на изображение выше для просмотра видео. Пока вы изучаете машинное обучение с применением кластеризации, насладитесь некоторыми треками нигерийского Dance Hall — это очень популярная песня 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. 'гладкая' геометрия
Терминология происходит из математики: негладкая и гладкая геометрия относится к измерению расстояний между точками либо с помощью «гладких» (евклидовых), либо «негладких» (неевклидовых) геометрических методов.
«Гладкая» здесь означает евклидову геометрию (часть которой изучается как «плоская» геометрия), а негладкая — это неевклидова геометрия. Как это связано с машинным обучением? Поскольку обе области основаны на математике, нужен общий способ измерения расстояния между точками в кластерах, который может быть «гладким» или «негладким» в зависимости от данных. Евклидовы расстояния измеряются как длина отрезка между двумя точками. Неевклидовы расстояния измеряются по кривой. Если визуализированные данные выглядят как не лежащие на плоскости, может потребоваться специализированный алгоритм.
Инфографика от 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. Загрузите dataframe с некоторой информацией о песнях. Подготовьтесь к изучению данных, импортировав библиотеки и выведя данные:
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 -
Получите информацию о 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 -
Проверьте наличие пропущенных значений, вызвав
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, дополнительно отфильтруем данные, удалив все с нулевой популярностью (то есть песни, не классифицированные по популярности, которые можно считать шумом для наших целей):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 (оценка ядерной плотности), который представляет данные с помощью непрерывной кривой вероятностной плотности. Это позволяет интерпретировать данные при работе с несколькими распределениями.
В целом три жанра слабо совпадают по популярности и танцевальности. Определение кластеров в таких слабо согласованных данных будет задачей:
-
Постройте диаграмму рассеяния:
sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend()Диаграмма рассеяния по тем же осям показывает похожий шаблон сходства
В целом, для кластеризации можно использовать диаграммы рассеяния для визуализации групп данных, поэтому освоение этого типа визуализаций очень полезно. В следующем уроке мы возьмём отфильтрованные данные и применим кластеризацию методом k-средних, чтобы найти группы, которые пересекаются и интересным образом связаны.
🚀Вызов
В рамках подготовки к следующему уроку составьте схему различных алгоритмов кластеризации, которые вы можете применить в производственной среде. Какие задачи решает кластеризация?
Тест после лекции
Обзор и самообучение
Прежде чем применять алгоритмы кластеризации, как мы узнали, полезно понять природу вашего набора данных. Подробнее по этой теме можно почитать здесь
Эта полезная статья подробно объясняет, как по-разному ведут себя разные алгоритмы кластеризации в зависимости от формы данных.
Задание
Изучите другие визуализации для кластеризации
Отказ от ответственности: Этот документ был переведен с использованием сервиса машинного перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.









