Введение
K-Means — один из самых популярных алгоритмов кластеризации. Имея центральные точки в кластере, он группирует другие точки в зависимости от их расстояния до этой центральной точки.
Недостатком K-Means является необходимость выбирать количество кластеров, K, до запуска алгоритма, который группирует точки.
Если вы хотите прочитать подробное руководство по кластеризации K-средних, взгляните на «Кластеризация K-средних с помощью Scikit-Learn».
Метод локтя и анализ силуэта
Наиболее часто используемые методы для выбора числа Ks являются Метод локтя и Анализ силуэта.
Для облегчения выбора Ks Желтый кирпич библиотека завершает код циклами for и графиком, который мы обычно записываем в 4 строки кода.
Чтобы установить Yellowbrick прямо из ноутбука Jupyter, запустите:
! pip install yellowbrick
Давайте посмотрим, как это работает для знакомого набора данных, который уже является частью Scikit-learn. Ирис набор данных.
Первым шагом является импорт набора данных, KMeans
и yellowbrick
библиотеки и загрузите данные:
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer, SilhouetteVisualizer
iris = load_iris()
Обратите внимание, здесь мы импортируем KElbowVisualizer
и SilhouetteVisualizer
от yellowbrick.cluster
, это модули, которые мы будем использовать для визуализации результатов Elbow и Silhouette!
После загрузки набора данных в data
Ключ связки (тип данных, являющийся расширением словаря) — это значения точек, которые мы хотим сгруппировать. Если вы хотите узнать, что означают числа, взгляните на iris['feature_names']
.
Известно, что набор данных Iris содержит три типа ирисов: 'versicolor', 'virginica' и 'setosa'. Вы также можете ознакомиться с классами в iris['target_names']
проверять.
Итак, у нас есть 4 функции для кластеризации, и они должны быть разделены на 3 разных кластера в соответствии с тем, что мы уже знаем. Давайте посмотрим, подтвердят ли это наши результаты с помощью метода локтя и анализа силуэта.
Сначала мы выберем значения функций:
print(iris['feature_names'])
print(iris['target_names'])
X = iris['data']
Затем мы можем создать KMeans
модель, KElbowVisualizer()
экземпляр, который получит эту модель вместе с количеством ks, для которых будет вычислена метрика, в данном случае из 2 - 11 Кс.
После этого мы подгоняем визуализатор к данным с помощью fit()
и отображать график с show()
. Если метрика не указана, визуализатор использует искажение метрика, которая вычисляет сумму квадратов расстояний от каждой точки до назначенного ей центра:
model = KMeans(random_state=42)
elb_visualizer = KElbowVisualizer(model, k=(2,11))
elb_visualizer.fit(X)
elb_visualizer.show()
Теперь у нас уже есть Колено оценки искажения для кластеризации KMeans график с отметкой вертикальной линией, которая была бы лучшим числом ks, в этом случае, 4
.
Кажется, что метод локтя с метрикой искажения был не лучшим выбором, если мы не знали фактического количества кластеров. Будет ли Силуэт также указывать, что есть 4 кластера? Чтобы ответить на этот вопрос, нам просто нужно повторить последний код с моделью с 4 кластерами и другим объектом визуализатора:
model_4clust = KMeans(n_clusters = 4, random_state=42)
sil_visualizer = SilhouetteVisualizer(model_4clust)
sil_visualizer.fit(X)
sil_visualizer.show()
Код отображает График силуэта кластеризации KMeans для 150 выборок в 4 центрах. Чтобы проанализировать эти кластеры, нам нужно посмотреть на значение коэффициента силуэта (или балла), его лучшее значение ближе к 1. Среднее значение, которое мы имеем, равно 0.5
, отмеченный вертикальной линией, и не так хорошо.
Нам также нужно посмотреть на распределение между кластерами — хороший график имеет схожие размеры сгруппированных областей или хорошо распределенных точек. На этом графике есть 3 меньших кластера (номер 3, 2, 1) и один больший кластер (номер 0), что не соответствует ожидаемому результату.
Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!
Давайте повторим тот же график для 3 кластеров, чтобы увидеть, что произойдет:
model_3clust = KMeans(n_clusters = 3, random_state=42)
sil_visualizer = SilhouetteVisualizer(model_3clust)
sil_visualizer.fit(X)
sil_visualizer.show()
Изменяя количество кластеров, оценка силуэта получила 0.05
выше, и кластеры более сбалансированы. Если бы мы не знали фактического количества кластеров, экспериментируя и комбинируя оба метода, мы бы выбрали 3
вместо 2
как число Ks.
Это пример того, как важно сочетать и сравнивать различные показатели, визуализировать данные и экспериментировать с различными значениями кластеров, чтобы привести результат в правильном направлении. А также, как наличие библиотеки, облегчающей этот анализ, может помочь в этом процессе!