Использование Python3 и Scikit-learn

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

В этой истории я покажу вам, как можно реализовать k-means в 30 строках кода, включая поиск оптимального значения k, а также визуализацию результатов.

Учебное пособие построено следующим образом:

1. Introduction to k-means
2. Properties of k-means
3. Python3 Implementation
  3.1 What do we need?
  3.2 Importing the packages and reading the dataset
  3.3 Caveat: How to determine the value of k before clustering
  3.4 Visualizing the clusters

Введение в k-means

K-means - один из самых простых для понимания и реализации методов кластеризации. Это основанный на прототипе метод многораздельной кластеризации, который находит заданное пользователем количество кластеров (K). Эти найденные скопления обычно представлены их центроидами.

Он оптимизирует математические обозначения минимизации расстояния между связанными точками до центра кластера. Математически оптимизация выглядит следующим образом:

здесь S (i) - это кластер i, x (j) - это j th элемент кластера i, u (i) - центр кластера i.

Свойства k-средних

  1. Масштабируемость: его можно реализовать очень эффективно, а также использовать для больших наборов данных и больших размеров.
  2. Форма кластера. Недостатком метода k-средних является то, что он предпочитает сферические кластеры по форме и аналогичному размеру. Это также жесткая кластеризация, когда точка принадлежит только одному кластеру, и, следовательно, у нее не может быть разделенных или перекрывающихся кластеров.
  3. Надежность: поскольку k-means - это метод жесткой кластеризации, он не устойчив к выбросам и всегда будет назначать кластерам даже точки выбросов.
  4. Правдоподобные результаты. Обычно k-среднее имеет случайную инициализацию центроидов, что делает его недетерминированным, что может приводить к неожиданным результатам каждый раз, когда выполняется кластеризация.

Реализация Python3

Я прикреплю ссылку на блокнот jupyter, содержащий полный код, в конце сообщения.

Что нам нужно?

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

  1. pandas - Для чтения набора данных (мы также можем использовать любой пакет для чтения csv, я предпочитаю pandas, так как это упрощает и упрощает работу)
  2. matplotlib - Чтобы визуализировать наши результаты кластеризации
  3. scikit-learn - для выполнения собственно кластеризации

Мы можем установить все эти пакеты, просто используя pip следующим образом:

pip install pandas matplotlib scikit-learn

Набор данных

Набор данных состоит из пяти столбцов, но мы сосредоточимся только на последних двух столбцах (Годовой доход, Оценка расходов). Этот набор данных представляет клиентов (каждая строка - это покупатель) с их доходами и расходами. Используя кластеризацию, цель состоит в том, чтобы определить закономерности между доходом и расходами.

Импорт пакетов и чтение набора данных

# importing the packages
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# loading the dataset
dataset = pd.read_csv('data.csv')
X = dataset.iloc[:, [3, 4]].values 

В iloc первое значение представляет, какие строки следует выбирать, а второе значение представляет, какие столбцы следует выбирать. Поскольку нам нужны только годовой доход и показатель расходов, мы выбираем 4-й и 5-й столбцы (помните, что индекс в Python начинается с 0).

Предостережение: как определить значение k перед кластеризацией

Я покажу, как использовать метод локтя, чтобы найти оптимальное количество кластеров. Помните, что есть и другие методы поиска оптимального значения k.

В методе изгиба кластеризация выполняется путем изменения значений k в пределах диапазона, и рассчитывается показатель производительности. Мы используем WCSS (внутри кластерной суммы квадратов). WCSS - это сумма квадратов расстояния между каждой точкой и центроидом в кластере. График WCSS (ось y) и значения k (ось x) напоминает форму локтя. Из этого графика мы находим оптимальное значение k, когда кривая начинает насыщаться и становится почти параллельной оси x.

Давайте сгруппируем и построим наш локоть для этого набора данных.

Кластеризация с использованием scikit-learn

# define an object of KMeans class, provide number of clusters and a seed value
kmeans = KMeans(n_clusters = k, random_state = 42)
# Fit the dataset to the defined object
kmeans.fit(X)

ПРИМЕЧАНИЕ. Класс KMeans предлагает множество других параметров, с которыми можно поиграть, посмотрите здесь.

Построение изгиба для нашего набора данных

wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, random_state = 42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

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

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

# Cluster the data using k = 5
kmeans = KMeans(n_clusters = 5, random_state = 42)
# Assigning pseudo labels to the data points and printing them
y_kmeans = kmeans.fit_predict(X)
print(y_kmeans)

Визуализация кластеров

Мы будем использовать точечные диаграммы для визуализации нашей кластеризации. Код выглядит так:

# s - size, c - color
plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroids')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()

Это может быть немного сложно понять, но позвольте мне объяснить.

X[y_kmeans == 0, 0] - берет точки данных из набора данных, которым была присвоена псевдометка 0, и принимает годовой доход (0-й столбец в X).

X[y_kmeans == 0, 1] - берет точки данных из набора данных, которым была присвоена псевдометка 0, и принимает Оценка расходов (0-й столбец в X).

Это сделано для всех пяти псевдо-ярлыков.

Кроме того, объект класса KMeans позволяет видеть центры кластера напрямую, вызывая cluster_centers_ непосредственно на объекте класса. Наши кластерные центры:

Здесь вы можете увидеть 5 кластеров, представленных отдельными цветами, и их центроиды, обозначенные более крупной желтой точкой.

На этом завершается базовая реализация кластеризации k-средних в Python.

Здесь вы можете найти весь код.

Спасибо за чтение. Если у вас есть вопросы, напишите мне в ответах.

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



Вот указатель моих сообщений о данных: