Практический проект, который сочетает в себе PCA, иерархическую кластеризацию и K-средние для предоставления оптимальных решений кластеризации

Независимо от того, являетесь ли вы опытным специалистом по данным или кем-то, кто недавно начал свое путешествие в области аналитики, поверьте мне, в какой-то момент своей карьеры вы должны были столкнуться или столкнетесь по крайней мере с одним проектом, который включает сегментацию/кластерный анализ. Вероятно, это один из самых популярных и важных навыков машинного обучения, который вы должны изучить и понять как специалист по данным.

В этом уроке я проведу вас через кластерный анализ, который я недавно провел, полностью движимый моим собственным любопытством как специалиста по данным о рынке жилья Северной Каролины (почему Северная Каролина? последние годы с сильным импульсом рынка жилья😉).

В этом практическом проекте вы проанализируете данные о рынке жилья, собранные в 162 районах Северной Каролины, и определите кластеры этих районов на основе их сходств и различий по нескольким ключевым показателям, используя модели неконтролируемого машинного обучения. Необработанные данные были получены из Redfin Data Center и могут быть загружены бесплатно.

Вы готовы? Пойдем!

Нежное введение в кластерный анализ

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

В целом, кластерный анализ относится к моделям неконтролируемого машинного обучения. Неконтролируемая модель машинного обучения, как следует из ее названия, не контролируется с использованием обучающего набора данных. Другими словами, алгоритм не снабжен какими-либо предварительно назначенными метками (например, метками кластеров) для обучающих данных. Вместо этого модель находит скрытые закономерности и выводы из самих данных. Поэтому он очень исследовательский и «любопытный» по своей природе.

Существуют различные типы методов кластеризации, такие как методы на основе связности, на основе центроида, на основе плотности, на основе распределения и т. д., каждый из которых имеет свои преимущества и недостатки и подходит для разных целей и вариантов использования.

В нашем проекте мы в основном сосредоточены на использовании двух упомянутых выше методов кластеризации: иерархической кластеризации (на основе связности) и k-средних (на основе центроида). Оба эти метода неконтролируемого машинного обучения основаны на близости (с использованием мер расстояния). Они просты, но очень эффективны и эффективны во многих задачах кластеризации.

Загрузите, прочитайте и подготовьте данные

Сначала заходим в ЦОД Redfin, прокручиваем вниз до раздела Как это работает и загружаем данные региона на уровне окрестностей. Это открытый набор данных (файл .gz), который можно бесплатно загрузить и использовать.

Затем давайте откроем блокнот Jupyter, импортируем все необходимые библиотеки и прочитаем данные. Это довольно большой набор данных на уровне района, поэтому чтение в python может занять некоторое время.

Это огромный набор данных, поэтому для простоты анализа и демонстрации давайте сосредоточимся только на «жилых домах на одну семью», проданных в Северной Каролине за последние 3 месяца (июль-сентябрь 2021 г.). Мы также будем отфильтровывать все районы, в которых за этот период было продано менее 20 объектов недвижимости.

Необработанные данные выглядят как таблица ниже с 58 столбцами. Столбец «регион» — это название района.

Для нашего кластерного анализа нам не нужны все эти столбцы. Мы собираемся создать кластеры на основе пяти функций, поэтому давайте сохраним в нашем фрейме данных только те поля, которые представляют интерес, используя следующий код.

Очистка данных (отсутствующие значения, выбросы и т. д.)

Давайте быстро проверим, есть ли какие-либо пропущенные значения или выбросы, которые необходимо обработать, прежде чем мы продолжим анализ.

Данные, кажется, уже в приличной форме. Для всех столбцов нет пропущенных значений. Похоже, что характеристики «median_dom» и «homes_sold_yoy» могут иметь потенциально большие выбросы, но остальные характеристики, похоже, находятся в довольно разумном диапазоне.

Давайте обработаем выбросы для «median_dom» и «homes_sold_yoy», ограничив максимальное значение процентилем 99%, используя следующий код.

Выполните PCA (анализ основных компонентов)

Прежде чем мы добавим наши функции в алгоритм кластеризации, я всегда рекомендую вам сначала выполнить PCA для ваших данных. PCA — это метод уменьшения размерности, который позволяет вам сосредоточиться только на нескольких основных компонентах, способных представить большую часть информации и дисперсию ваших данных.

В контексте кластерного анализа, особенно в том, где у нас нет большого количества функций, основное преимущество выполнения PCA на самом деле в большей степени связано с визуализацией. Выполнение PCA поможет нам определить 2 или 3 основных компонента, чтобы мы могли визуализировать наши кластеры на 2- или 3-мерной диаграмме.

Чтобы выполнить PCA, давайте сначала нормализуем все наши функции к одному масштабу, потому что методы PCA и кластеризации на основе расстояния чувствительны к выбросам и различным масштабам/единицам.

Затем давайте выполним анализ PCA и покажем основные основные компоненты, которые объясняют большую часть дисперсии наших данных, используя следующий код.

Вы можете видеть, что 3 основных компонента, объединенные вместе, объясняют ~ 80% дисперсии данных. Следовательно, вместо того, чтобы использовать все 5 функций для нашей модели, мы можем просто использовать 3 основных компонента для кластеризации.

Наконец, давайте посмотрим на веса каждой из исходных переменных в этих главных компонентах, чтобы иметь хорошее представление о том, какие переменные оказывают наибольшее влияние на какие основные компоненты, или, другими словами, мы можем вывести некоторые значения этих основных компонентов. .

На это довольно интересно смотреть! На PC1 в значительной степени влияет median_dom (среднее количество дней на рынке), поэтому этот основной компонент показывает, насколько быстро продается недвижимость в районе. Мы можем обозначить это как «скорость продажи».

На PC2 в значительной степени влияет «new_listings_yoy» (увеличение количества новых объявлений по сравнению с тем же периодом прошлого года), поэтому этот показатель представляет собой изменение объема запасов или новых объявлений по сравнению с прошлым годом. Мы можем обозначить это как «спрос/предложение/новые объявления».

На PC3 в значительной степени влияют «avg_sale_to_list» (отношение цены продажи к цене листинга) и «median_sale_price_yoy» (изменение медианной цены продажи в годовом исчислении), оба из которых связаны с ценой. Мы можем пометить PC3 как «изменение продажной цены».

Выполнение иерархической кластеризации

Мы готовы передать наши данные в алгоритм кластеризации! Сначала мы попробуем иерархическую кластеризацию. Самое приятное в иерархической кластеризации то, что она позволяет построить дерево кластеров (называемое «дендрограммой»), которое визуализирует этапы кластеризации. Затем вы можете разрезать дерево по горизонтали, чтобы выбрать количество кластеров, наиболее подходящее для древовидной структуры.

На приведенной выше дендрограмме видно, что в зависимости от того, где вы расположите горизонтальную линию, вы получите разное количество кластеров. Похоже, что 4 кластера или 5 кластеров являются разумными решениями. Давайте построим решение для 4 кластеров в виде точечной диаграммы и посмотрим, как оно выглядит.

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

Иерархическая кластеризация, хотя и очень полезна для визуализации процесса кластеризации с помощью древовидной структуры, имеет некоторые недостатки. Например, иерархическая кластеризация делает только один проход по данным. Это означает, что записи, которые были распределены или назначены неправильно в начале процесса, не могут быть впоследствии переназначены.

Поэтому мы редко останавливаем наш анализ на иерархическом решении кластеризации, а скорее используем его, чтобы получить «визуальное» представление о том, как могут выглядеть кластеры, а затем используем итеративный метод (например, k-средних) для улучшения и уточнения решений кластеризации. .

Выполнение кластеризации K-средних

K-средних — это очень популярный метод кластеризации, с помощью которого мы указываем желаемое количество кластеров, k, и присваиваем каждой записи один из k кластеров, чтобы минимизировать меру дисперсии внутри кластеров.

Это итеративный процесс, который распределяет и перераспределяет точки данных, чтобы минимизировать расстояние каждой записи до центроида своего кластера. В конце каждой итерации достигается некоторое улучшение, и шаг повторяется до тех пор, пока улучшение не станет очень небольшим.

Чтобы выполнить кластеризацию k-средних, нам нужно сначала указать k (количество кластеров). Мы можем сделать это несколькими способами:

  1. Укажите k, используя наши знания предметной области или прошлый опыт
  2. Выполните иерархическую кластеризацию, чтобы получить первоначальное представление о том, какое количество кластеров можно попробовать.
  3. Используйте метод «локоть» для определения k

Что ж, из дендрограммы на предыдущем шаге мы уже знаем, что k=4 (или k=5), кажется, работает довольно хорошо. Мы также можем использовать метод «локоть», чтобы проверить еще раз. В приведенном ниже коде строится диаграмма «локоть», которая сообщает нам, где находится поворотная точка для оптимального количества кластеров.

Кажется, что результаты довольно хорошо согласуются с тем, что мы получили из дендрограммы: и 4, и 5 — разумное количество кластеров, поэтому давайте попробуем k = 5. Приведенный ниже код создает трехмерную диаграмму рассеяния для 5 кластеров.

Описывать кластеры и получать информацию

Теперь у нас есть наши кластеры, давайте добавим метки кластеров обратно в наш исходный фрейм данных (df_NC), экспортируем его в файл .csv и извлечем из него информацию.

Я использовал свой любимый инструмент панели инструментов Tableau, чтобы визуализировать эти кластеры с точки зрения их характеристик, сходств и различий. Я наношу кластеры на двумерный точечный график, точно так же, как мы это делали в Python.

Ось X — это первый главный компонент, который мы обозначили как «скорость продаж». Ось Y — это второй основной компонент, который мы обозначили как «предложение/новые листинги». Размер кругов представляет собой третий основной компонент, который представляет собой «соотношение изменения цены/продажи к списку». На этой панели вы также можете навести курсор на каждый кружок и посмотреть, что представляют собой эти горячие районы рынка, с более подробной информацией, представленной во всплывающей подсказке.

Поздравляем с продолжением обучения и повышением уровня ваших навыков машинного обучения с помощью этого практического проекта! Надеюсь, вам понравится эта статья. Счастливого обучения!

Вы можете поддержать меня, подписавшись на Medium по этой реферальной ссылке. Зарегистрировавшись по этой ссылке, я получу часть вашего членского взноса за направление. Спасибо!