Введение

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

Кластеризация — это неконтролируемый метод машинного обучения, целью которого является определение подгрупп в наборах данных. Одним из популярных алгоритмов кластеризации является KMeans, который делит наблюдения на несколько групп (k кластеров). Этот алгоритм часто применяется в таких областях, как сегментация рынка, когда объекты внутри одного кластера больше похожи друг на друга, чем на объекты вне кластера.

Я буду применять метод кластеризации KMeans для набора данных о рыбе.

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

Импортируйте соответствующие библиотеки и загрузите данные

# Import necessary packages
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler


# Load the fish data from the CSV file and store it in the 'fish' variable
fish = pd.read_csv('datasets/fish.csv', header=None)

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

# Convert the fish data to a numpy array and store the data points (columns 1-5) in the 'points' variable
# and the fish species (column 0) in the 'Species' variable
arr = fish.to_numpy()
points = arr[:, 1:6]
Species = arr[:, 0]

Определить наилучшее количество кластеров

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

# Define a range of values for k, the number of clusters to use in k-means clustering
ks = range(1, 9)

# Create an empty list to store the inertia values for each k
inertias = []

# Iterate over the range of k values
for k in ks:
    # Create a KMeans object with k clusters and fit it to the data points
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(points)
    
    # Append the inertia value of the k-means clustering to the 'inertias' list
    inertias.append(kmeans.inertia_)
    
# Plot the values of k versus the corresponding inertia values as a line plot with markers
plt.plot(ks, inertias, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.title('Elbow method for fish dataset')
plt.show()

Кривая локтя показывает сумму квадратов расстояний каждой точки от кластеров (это можно узнать с помощью метода kmeans.inertia_) в зависимости от количества кластеров. Согласно кривой локтя, идеальное количество кластеров должно быть равно 4.

Выполните кластеризацию K-средних с оптимальным k.

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

# Create a StandardScaler object to standardize the data points
scaler = StandardScaler()

# Create a KMeans object with 4 clusters
km = KMeans(n_clusters=4, random_state=45)

# Create a pipeline to chain the scaler and KMeans objects together
pipeline = make_pipeline(scaler, km)

# Fit the pipeline to the data points
pipeline.fit(points)

# Predict the labels of the data points using the pipeline
labels = pipeline.predict(points)

# Create a DataFrame to store the predicted labels and the true fish species
df = pd.DataFrame({'Labels': labels, 'Species': Species})

# Print the DataFrame to see the predicted labels and true fish species side-by-side
print(df)

Прежде всего создается объект StandardScaler: этот объект используется для стандартизации точек данных, что означает, что он масштабирует объекты так, чтобы их среднее значение равнялось 0, а стандартное отклонение равнялось 1. Это важно, потому что KMeans — это алгоритм, основанный на расстоянии, и он может быть чувствителен к масштабу объектов. Стандартизируя данные, вы гарантируете, что алгоритм одинаково обрабатывает все функции.

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

Кроме того, функция make_pipeline используется для объединения объектов StandardScaler и KMeans. Это обеспечивает более эффективный рабочий процесс, позволяя обрабатывать данные как скалером, так и алгоритмом KMeans за один шаг.

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

DataFrame создается с использованием Pandas для одновременного хранения предсказанных меток и истинных видов рыб. Это может быть полезно для сравнения результатов алгоритма кластеризации с фактическими метками видов, что может помочь оценить производительность алгоритма.

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

# Create a cross-tabulation table to count the number of data points 
# in each combination of predicted label and true fish species

ct = pd.crosstab(df['Labels'], df['Species'])
print(ct)

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

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