Руководство по питоническому обучению без учителя

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

Перво-наперво. Что такое машинное обучение (ML) ?! И это новая парадигма?

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

Если вы думаете, что машинное обучение - это новая парадигма, вам следует знать, что название машинное обучение было придумано в 1959 году Артуром Самуэлем. Однако это произошло после предложения Алана Тьюринга в 1950-х годах заменить Могут ли машины думать? на Могут ли машины делать то, что мы (как мыслящие сущности) можем?, или, другими словами, могут ли машины учиться?

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

Каковы основные области машинного обучения?

В ML много полей, но мы можем назвать три основных поля так:

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

Неконтролируемое обучение (UL): UL используется, когда цель не известна, и цель состоит в том, чтобы вывести закономерности или тенденции в данных, которые могут повлиять на решение, или иногда скрыть проблему в проблеме SL ( Также известен как Transfer Learning, TL). Эта статья посвящена кластеризации UL и, в частности, методу K-средних.

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

График ниже, сделанный Абдулом Вахидом, хорошо показывает эти основные области ML.

Кластеризация K-средних, определение

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

Прежде чем вдаваться в подробности кода Python, давайте рассмотрим основы кластеризации K-средних.

Как K-среднее объединяет наблюдения?

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

Существуют и другие методы обучения без учителя для определения правильного количества кластеров для метода кластеризации K-средних, включая Иерархическая кластеризация, но мы не углубляемся в эту тему в эта статья. Мы предполагаем, что вы знаете количество кластеров или имеете общее представление о правильном количестве кластеров. Лучшим подходом было бы сделать пару проб / ошибок, чтобы найти наилучшее количество кластеров.

Как только вы знаете количество кластеров, есть три разных способа назначить центры кластеров:

  • Вручную,
  • Случайно и
  • «k-means ++» в SKLearn

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

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

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

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

Хорошо! Достаточно об алгоритме. Давайте перейдем к самой захватывающей части - коду Python.

Примечание о масштабировании данных для K-средних

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

K-средние в Python

Мы собираемся использовать для этого библиотеку SciKit Learn. Вы можете прочитать документацию по пакету кластеризации K-Means здесь.

Давайте сначала импортируем пакеты.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

Чтобы проиллюстрировать, как работает этот алгоритм, мы собираемся использовать пакет make_blob в sklearn.datasets.. Фрагмент кода ниже сгенерирует 5 кластеров. Мы не будем использовать здесь обозначения кластеров (y) для нашей кластеризации.

# Create 5 blobs of 2,000 random data
n_samples = 2000
random_state = 42
X, y = make_blobs(n_samples=n_samples, 
                  random_state=random_state, 
                  centers=5)

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

# Plot the random blub data
plt.figure(figsize=(6, 6))
plt.scatter(X[:, 0], X[:, 1], s=5)
plt.title(f"No Clusters Assigned")

Глядя на капли, мы видим, что у нас есть три разные «зоны», состоящие из 5 капель:

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

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

# Plot the data and color code based on clusters
# changing the number of clusters 
for i in range(1,11):
    plt.figure(figsize=(6, 6))
    
    # Predicting the clusters
    y_pred = KMeans(n_clusters=i, random_state=random_state).fit_predict(X)
# plotting the clusters
    plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=5)
    plt.title(f"Number of Clusters: {i}")
plt.show();

Анимированный сюжет создан с помощью пакета Image.Io. Дополнительную информацию об этом можно найти в блоге Johannes Huessy (Щелкните здесь).

Оценка алгоритма кластеризации K-средних

Итак, вы выполнили кластеризацию, но насколько хороша эта кластеризация и как вы можете измерить производительность алгоритма?

Инерция: мы говорили об одной метрике в предыдущем разделе, которая представляет собой внутрикластерную сумму квадратов расстояний до центра кластера. Это называется «инерцией». Алгоритм нацелен на выбор центроидов, которые минимизируют инерцию, которую можно распознать как меру внутренней когерентности кластеров.

Вы можете использовать следующий код, чтобы получить inertia оценку для кластеров:

km = KMeans(n_clusters=i, random_state=random_state)
km.fit(X)
km.inertia_

В приведенном ниже коде вычисляется оценка inertia для 10 различных номеров кластеров, которые мы делали ранее, и сохраняется их в списке, который мы используем для построения графика (подробнее об этом позже). График инерционной оценки в зависимости от количества кластеров называется «кривой локтя».

Оценка силуэта: оценка силуэта основана на комбинации кластера Сплоченность (насколько близки точки в кластере друг относительно друга) и Разделение (расстояние между кластерами друг относительно друга) .

Оценка силуэта находится между -1 (плохая кластеризация) и +1 (отличная кластеризация).

Инерция

# Calculating the inertia and silhouette_score¶
inertia = []
sil = []
# changing the number of clusters 
for k in range(2,11):
    
    km = KMeans(n_clusters=k, random_state=random_state)
    km.fit(X)
    y_pred = km.predict(X)
    
    inertia.append((k, km.inertia_))
    sil.append((k, silhouette_score(X, y_pred)))

Теперь, когда у нас есть оценки инерции и силуэта, давайте построим их и оценим производительность алгоритма кластеризации.

fig, ax = plt.subplots(1,2, figsize=(12,4))
# Plotting Elbow Curve
x_iner = [x[0] for x in inertia]
y_iner  = [x[1] for x in inertia]
ax[0].plot(x_iner, y_iner)
ax[0].set_xlabel('Number of Clusters')
ax[0].set_ylabel('Intertia')
ax[0].set_title('Elbow Curve')
# Plotting Silhouetter Score
x_sil = [x[0] for x in sil]
y_sil  = [x[1] for x in sil]
ax[1].plot(x_sil, y_sil)
ax[1].set_xlabel('Number of Clusters')
ax[1].set_ylabel('Silhouetter Score')
ax[1].set_title('Silhouetter Score Curve')

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

Сопоставление изгиба локтя с кривой оценки силуэта дает неоценимое представление об эффективности K-средних.

Другие варианты использования K-средних

Метод K-средних имеет множество вариантов использования, от векторизации изображений до кластеризации текстовых документов. Вы можете найти здесь несколько примеров.

Я надеюсь, что вы нашли это руководство полезным для понимания метода кластеризации K-средних с использованием пакета Python SkLearn. Следите за новостями на похожие темы!

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