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