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

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

Кластеризация KMeans

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

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

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

  • Пошаговая реализация алгоритма k-средних выглядит следующим образом:
  1. Выберите количество кластеров (K).
  2. Выберите k случайных точек наблюдения в пространстве (центроиды).
  3. Назначьте каждую точку данных ближайшему центроиду. Близость классифицируется различными мерами расстояния, в наших случаях мы будем рассматривать только евклидово расстояние.
  4. Теперь вычислите новый центроид в каждом кластере и сдвиньте ваш центроид.
  5. Повторно назначьте каждую точку данных ближайшему центроиду и повторите шаги с 3 по 5, пока дальнейшее сокращение не станет возможным.

Выбор оптимального количества кластеров

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

Метод кривой локтя представляет изменение «WCSS (сумма квадратов внутри кластера)» / «внутрикластерная дисперсия» и количество кластеров. По мере увеличения количества кластеров каждый фактор уменьшается, и мы получаем коленчатую кривую, из которой получается оптимальное количество кластеров. Количество кластеров, за пределами которого вариация незначительна, принимается за оптимальное количество кластеров для набора данных. Например. Здесь оптимальное количество кластеров равно 5.

Коэффициент силуэта или оценка силуэта — это еще одна метрика, используемая для расчета качества метода кластеризации. Его значение находится в диапазоне от -1 до 1.

  • 1 балл означает, что кластеры находятся далеко друг от друга и четко различимы.
  • Оценка 0 указывает на то, что кластеры безразличны, или мы можем сказать, что расстояние между кластерами не является значительным.
  • Оценка -1 указывает на то, что кластеры назначены неправильным образом.

𝑝 — среднее расстояние до точек в ближайшем кластере, частью которого точка данных не является.

𝑞 — среднее внутрикластерное расстояние до всех точек своего кластера.

Теперь, прежде чем мы перейдем к питонической реализации концепции, вот несколько вещей, которые необходимо учитывать при применении K-средних:

  • Выбор начального центра кластера оказывает существенное влияние на окончательный состав кластера. Использование таких методов, как KMeans++, может помочь смягчить случайность.
  • Наличие выбросов может существенно повлиять на распределение кластеров.
  • Стандартизация данных необходима, чтобы один признак с большими значениями не доминировал при расчете евклидовых расстояний.
  • Само собой разумеется, Kmeans применим только для сегментации данных с числовыми признаками.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import datetime as dt
import sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# reading the data
df = pd.read_csv("Transactions.csv", sep=",", encoding="ISO-8859-1", header=0)
# Outlier Treatment
Q1 = df.amount.quantile(0.05)
Q3 = df.amount.quantile(0.95)
IQR = Q3 - Q1
df = df[(df.volume >= Q1 - 1.5*IQR) & (df.volume <= Q3 + 1.5*IQR)]
# Standard Scaling 
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# Finding the Optimal Number of Clusters - Plotting Elbow Curve
ssd = []
range_n_clusters = [2, 3, 4, 5, 6, 7, 8]
for num_clusters in range_n_clusters:
    kmeans = KMeans(n_clusters=num_clusters, max_iter=50)
    kmeans.fit(df_scaled)
    
    ssd.append(kmeans.inertia_)
plt.plot(ssd)
# silhouette analysis
range_n_clusters = [2, 3, 4, 5, 6, 7, 8] 
for num_clusters in range_n_clusters:
    kmeans = KMeans(n_clusters=num_clusters, max_iter=50)
    kmeans.fit(df_scaled)
    cluster_labels = kmeans.labels_
    # silhouette score
    silhouette_avg = silhouette_score(df_scaled, cluster_labels)
    print("For n_clusters={0}, the silhouette score is {1}".format(num_clusters, silhouette_avg))
# modelling with optimal number of clusters
kmeans = KMeans(n_clusters=5, max_iter=50)
kmeans.fit(df_scaled)
df['cluster_id'] = kmeans.labels_
df.head()
#plotting the clusters
plt.scatter(x[y_kmeans ==0, 0], x[y_kmeans ==0 , 1], c= 'red', label = 'cluster_1')
plt.scatter(x[y_kmeans ==1, 0], x[y_kmeans ==1 , 1], c= 'blue', label = 'cluster_2')
plt.scatter(x[y_kmeans ==2, 0], x[y_kmeans ==2 , 1], c= 'green', label = 'cluster_3')
plt.scatter(x[y_kmeans ==2, 0], x[y_kmeans ==2 , 1], c= 'cyan', label = 'cluster_4')
plt.scatter(x[y_kmeans ==2, 0], x[y_kmeans ==2 , 1], c= 'magenta', label = 'cluster_5')
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1], s= 300, c= 'yellow', label= 'centroid')
plt.title('Clustering-Kmeans')
plt.xlabel('Monthly Income')
plt.ylabel('Spending Score')
plt.legend()
plt.show()

Иерархическая кластеризация

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

Агломеративная кластеризация для набора из N элементов, подлежащих кластеризации, происходит следующим образом:

  • Рассчитайте матрицу расстояний (сходства) NxN, которая вычисляет расстояние каждой точки данных от другой.
  • Начните с назначения каждого элемента его собственному кластеру, так что если у вас есть N элементов, у вас теперь будет N кластеров, каждый из которых содержит только один элемент.
  • Найдите ближайшую (наиболее похожую) пару кластеров и объедините их в один кластер, чтобы теперь у вас стало на один кластер меньше.
  • Вычислите расстояния (сходства) между новым кластером и каждым из старых кластеров.
  • Повторяйте шаги 3 и 4, пока все элементы не будут сгруппированы в один кластер размера N.

При расчете расстояний существует множество способов расчета этих расстояний. Распространенными типами связей являются

  • Одиночная связь — здесь расстояние между двумя кластерами определяется как кратчайшее расстояние между точками в двух кластерах.
  • Полная связь Здесь расстояние между двумя кластерами определяется как максимальное расстояние между любыми двумя точками в кластерах.
  • Средняя связь Здесь расстояние между двумя кластерами определяется как среднее расстояние между каждой точкой одного кластера и каждой другой точкой другого кластера.

Результатом иерархического кластерного анализа обычно является дендрограмма. Это начинается со всех точек данных как отдельных кластеров и указывает, на каком уровне различия были объединены любые два кластера. Ось Y дендрограммы является некоторой мерой непохожести или расстояния, на котором соединяются кластеры.

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import datetime as dt
import sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# reading the data
df = pd.read_csv("Transactions.csv", sep=",", encoding="ISO-8859-1", header=0)
# Outlier Treatment
Q1 = df.amount.quantile(0.05)
Q3 = df.amount.quantile(0.95)
IQR = Q3 - Q1
df = df[(df.volume >= Q1 - 1.5*IQR) & (df.volume <= Q3 + 1.5*IQR)]
# Standard Scaling 
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# Building Dendogram using complete linkage
mergings = linkage(df_scaled, method="complete", metric='euclidean')
dendrogram(mergings)
plt.show()
cluster_labels = cut_tree(mergings, n_clusters=3).reshape(-1, )
df['cluster_labels'] = cluster_labels
df.head()

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