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

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

  • Найдите значение K (количество кластеров), используя различные методы, такие как кривая изгиба, кривая силуэта и межкластерные расстояния.
  • Отличная библиотека визуализации YellowBrick, которая поможет вам построить эти кривые с помощью всего 1 строчки кода.
  • Различные советы Scikit-Learn для улучшения вашей модели K-средних.

Если вы новичок, в Интернете есть много отличных статей, которые могут помочь вам понять K-Means. Я бы порекомендовал просмотреть блоги от Имада Даббура « Кластеризация K-средних: алгоритмы, приложения, методы оценки и недостатки » и Азика Амелия « Кластеризация K-средних : От А до Я »», который охватывает большую его часть. Вы также можете обратиться к документации по кластеризации Scikit-Learn, в которой она довольно хорошо изложена.

Давайте начнем и посмотрим, как это можно сделать.

Нахождение K в K-средних.

Чтобы использовать K-Means, нам нужно указать значение K, которое представляет собой количество кластеров, в которые мы хотим сгруппировать наши данные. В большинстве случаев мы не знаем количество групп, которые будут присутствовать в наших данных, и становится сложно найти оптимальное значение для K. К счастью, разные способы могут помочь нам найти правильное значение.

Здесь я пройду 4 разных пути.

  1. Кривая локтя.
  2. Кривая силуэта.
  3. Карты межкластерных расстояний.
  4. Использование других алгоритмов кластеризации.

Детали набора данных

Чтобы лучше продемонстрировать, я создам набор данных, используя make_blobs API из Scikit-Learn, который используется для создания многоклассовых наборов данных путем выделения каждого класса одному или нескольким нормально распределенным кластерам точек.

Взгляните на созданную мной записную книжку, в которой есть более подробная информация, не стесняйтесь загружать и импортировать ее в свою среду и поиграть -



Здесь мы создали набор данных с 10 центрами, используя make_blobs.

from sklearn.datasets import make_blobs
# Generate synthetic dataset with 10 random clusters in 2 dimensional space
X, y = make_blobs(n_samples=1000, n_features=2, centers=10, random_state=42)

Хотя мы создали 10 случайных кластеров, график ниже показывает, что некоторые из них частично совпадают, и мы увидим, как метод Elbow может сказать нам точное количество кластеров, для которых у нас есть максимальное усиление.

Кривая локтя

Как сказано в Википедии -

Метод локтя - это эвристика, используемая для определения количества кластеров в наборе данных. Метод состоит из построения объясненного изменения как функции количества кластеров и выбора изгиба кривой в качестве количества используемых кластеров.

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

Недавно я обнаружил библиотеку под названием Yellowbrick, которая может помочь нам построить кривую локтя с помощью всего одной строчки кода. Это оболочка вокруг Scikit-Learn и, следовательно, хорошо с ней интегрируется.

# Import ElbowVisualizer
from yellowbrick.cluster import KElbowVisualizer
model = KMeans()
# k is range of number of clusters.
visualizer = KElbowVisualizer(model, k=(4,12), timings=False)
visualizer.fit(X)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure

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

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

Кривая силуэта

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

Ниже я построил графики силуэта для K = 6, 7, 8, 9, и вы можете видеть, что мы получили наивысший балл для K = 7, как мы получили с помощью метода локтя. Это также помогает нам идентифицировать дисбаланс классов, поскольку ширина кластеров показывает количество выборок в этом кластере, и если вы видите график для K = 9, у нас много маленьких кластеров.

Я использовал Yellowbrick для создания вышеуказанного графика. В приведенном ниже коде будет сгенерирован один график силуэта для K = 7, вы можете сослаться на мою записную книжку, чтобы узнать, как вы можете просмотреть его в цикле для создания нескольких графиков.

model = KMeans(7, random_state=42)
visualizer = SilhouetteVisualizer(model, colors='yellowbrick')
visualizer.fit(X)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure

Карты межкластерных расстояний

Хотя это может не помочь напрямую определить количество кластеров. Это помогает в оценке алгоритма K-средних, поскольку дает представление об относительной важности кластеров. По умолчанию Yellowbrick использует MDS (многомерное масштабирование) в качестве алгоритма внедрения для встраивания в двумерное пространство. Вы можете прочитать больше об этом здесь".

model = KMeans(7)
visualizer = InterclusterDistance(model, random_state=0)
visualizer.fit(X)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure

Приведенный выше код сгенерирует график ниже:

Используйте другие алгоритмы

Еще мы можем попробовать использовать другие алгоритмы кластеризации, такие как Affinity Propagation, который не требует от вас указания значения K и делает его частью процесса обучения. Эти алгоритмы могут не работать для больших наборов данных. Итак, в некоторых случаях нам нужно попробовать их на подмножестве данных, а затем использовать значение в K-средних. Код ниже предсказал 10 кластеров, которые соответствуют количеству используемых нами центров.

from sklearn.cluster import AffinityPropagation
# Creating Affinity Propagation model instance
affinity_propagation = AffinityPropagation(random_state=None, damping=0.90)
# number of clusters found by Affinity propagation
len(affinity_propagation.cluster_centers_indices_)

Окончательные результаты

Теперь, когда мы оценили с помощью разных методов, оптимальное значение K, которое мы получили, равно 7. Давайте применим алгоритм K-средних с K = 7 и посмотрим, как он группирует наши точки данных.

model = KMeans(n_clusters=7)
# fit X
model.fit(X)
# predict labels 
data['y_pred'] = model.predict(X)
# plot results
sns.scatterplot(x='feature1', y='feature2', hue='y_pred', data=data)

Советы Scikit-Learn

Scikit-learn предоставляет различные конфигурации для K-средних, которые мы можем использовать. Вы можете найти полный список здесь. Я рассмотрю несколько из них, которые помогут улучшить нашу модель.

init = ’k-означает ++’

Алгоритм K-средних во многом зависит от того, как вы инициализировали центроиды (центр кластеров). Scikit-Learn предоставляет разные значения init, которые можно использовать, но в целом k-means ++ выделяется среди других, поскольку он пытается инициализировать центроиды (как правило) удаленными друг от друга, что приводит к доказуемо лучшим результатам.

Используйте алгоритмы уменьшения размерности

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

Мини-партия K-средних

Для больших наборов данных K-средних может потребоваться много времени, чтобы сойтись. Как указано в документации Scikit-Learn -

MiniBatchKMeans - это вариант алгоритма KMeans, который использует мини-пакеты для сокращения времени вычислений, но при этом пытается оптимизировать ту же целевую функцию. Мини-пакеты - это подмножества входных данных, которые выбираются случайным образом на каждой итерации обучения. Эти мини-пакеты резко сокращают объем вычислений, необходимых для схождения к локальному решению. В отличие от других алгоритмов, которые сокращают время сходимости k-средних, мини-пакетные k-средние дают результаты, которые, как правило, лишь немного хуже, чем стандартный алгоритм.

Итак, если у вас большой набор данных, попробуйте MiniBatchKmeans.

Метрики кластеризации

Большинство людей, которые начинают машинное обучение, знают о таких показателях, как точность, точность и отзывчивость. Мы склонны думать, что если нет ярлыка, то как мы можем измерить результаты. Scikit-Learn предоставляет различные метрики для кластеризации, такие как однородность, полнота, v-мера или коэффициент силуэта, которые мы обсуждали здесь. Эти показатели могут помочь нам оценить модель. В то время как некоторые из них основаны на полууправляемом подходе к обучению и требуют наличия целевых меток для нескольких точек данных, по крайней мере, другие работают без каких-либо меток. Ознакомьтесь со всеми метриками, доступными в Scikit-Learn для кластеризации здесь.

Масштабируйте набор данных

Вы должны масштабировать набор данных перед применением k-средних, так как это может повлиять на расчеты расстояния.

Неравномерные формы (ограничение)

Из-за того, как работает K-Means, он обычно подходит для кластеров, которые имеют ровную форму, например сферическую. Если вы знаете, что у вас есть данные, имеющие неравномерную форму, лучше использовать другие алгоритмы кластеризации, такие как DBSCAN, который работает для неравномерных кластеров.

K-Means - это мощный и простой алгоритм, который работает для большинства задач машинного обучения без учителя и дает довольно хорошие результаты. Я надеюсь, что эта статья поможет вам с проблемами кластеризации и сэкономит ваше время для будущего проекта кластеризации. Кроме того, вы используете конвейер в Scikit-Learn? Если нет, ознакомьтесь с другой моей статьей здесь, которая поможет вам улучшить рабочие процессы машинного обучения.

Оставайтесь в безопасности !!! Продолжай учиться !!!