Читать книгу «Алгоритмы машинного обучения: базовый курс» онлайн полностью📖 — Тайлера Венс — MyBook.

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

PCA – это линейный метод, который ищет новые оси координат, вдоль которых данные максимально разнесены. Эти оси называются основными компонентами. Процесс можно представить следующим образом:

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

2. Проекция данных на новые оси: исходные данные проецируются на найденные главные компоненты, что приводит к новому представлению данных в пространстве меньшей размерности.

3. Выбор количества компонент: можно выбрать количество компонент, которые сохраняют наибольшее количество информации, и отбросить менее значимые компоненты.

Зачем нужно снижать размерность?

1. Ускорение обучения: с уменьшением числа признаков модели обучаются быстрее, так как уменьшается количество вычислений.

2. Предотвращение переобучения: уменьшая количество признаков, можно снизить риск переобучения модели, так как она не будет "подгоняться" под шум в данных.

3. Визуализация данных: для многомерных данных снижение размерности позволяет визуализировать данные, что помогает понять их структуру.

4. Уменьшение коллинеарности: если признаки в данных сильно коррелируют друг с другом, это может приводить к проблемам в работе моделей. PCA помогает уменьшить коллинеарность, заменяя связанные признаки на независимые компоненты.

Как работает PCA?

1. Центрирование данных: перед применением PCA данные нужно центрировать, т.е. вычесть среднее значение каждого признака из всех его значений. Это делается для того, чтобы компоненты были вычислены относительно нулевой средней.

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

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

4. Проекция данных: теперь можно проецировать исходные данные на найденные компоненты. Это преобразует данные в новое пространство меньшей размерности.

Пример использования PCA

Допустим, у нас есть набор данных с множеством признаков, и мы хотим уменьшить их количество, чтобы улучшить производительность модели. Рассмотрим следующий пример с использованием библиотеки scikit-learn на Python.

Пример: применение PCA на данных о цветах ирисов

В этом примере мы будем работать с известным набором данных Iris. Данные содержат информацию о 4 признаках для каждого из 150 цветов ирисов (длина и ширина чашелистика и лепестка). Мы будем использовать PCA, чтобы уменьшить размерность до 2-х компонентов для визуализации.

```python

# Импортируем необходимые библиотеки

import numpy as np

import matplotlib.pyplot as plt

from sklearn.decomposition import PCA

from sklearn.datasets import load_iris

from sklearn.preprocessing import StandardScaler

# Загружаем набор данных Iris

iris = load_iris()

X = iris.data # Признаки

y = iris.target # Метки классов

# Масштабируем данные

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X)

# Применяем PCA для уменьшения размерности до 2

pca = PCA(n_components=2)

X_pca = pca.fit_transform(X_scaled)

# Визуализируем данные

plt.figure(figsize=(8, 6))

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')

plt.title("PCA на данных о цветах ирисов")

plt.xlabel("Первая главная компонента")

plt.ylabel("Вторая главная компонента")

plt.colorbar(label='Метка класса')

plt.show()

# Смотрим долю объясненной дисперсии

print("Доля объясненной дисперсии для каждой компоненты:", pca.explained_variance_ratio_)

print("Общая объясненная дисперсия (для 2 компонент):", np.sum(pca.explained_variance_ratio_))

```

Объяснение кода:

1. Загрузка данных: Мы загружаем стандартный набор данных Iris, который содержит 4 признака (длина и ширина чашелистика и лепестка) для 150 цветов ирисов.

2. Масштабирование данных: Признаки масштабируются, чтобы все признаки имели одинаковый масштаб (среднее значение 0 и стандартное отклонение 1). Это важно для PCA, так как этот метод чувствителен к масштабу данных.

3. Применение PCA: Мы используем PCA для уменьшения размерности с 4 до 2 компонент. Это позволяет нам визуализировать данные в двумерном пространстве.

4. Визуализация: Рисуем график, где каждая точка представляет один ирис, и цвет указывает на класс (вид ириса).

5. Доля объясненной дисперсии: Мы выводим долю дисперсии, которую объясняют главные компоненты. Чем выше эта доля, тем больше информации сохраняется при уменьшении размерности.

Результат:

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

Преимущества и ограничения PCA

Преимущества:

– Ускорение обработки: Уменьшение размерности позволяет быстрее обучать модели.

– Снижение переобучения: Уменьшение количества признаков помогает избежать переобучения, так как модель фокусируется на более значимых признаках.

– Визуализация: Снижение размерности позволяет визуализировать многомерные данные, что важно для анализа и принятия решений.

Ограничения:

– Потеря информации: Хотя PCA сохраняет максимально возможную информацию, всегда существует некоторая потеря информации при уменьшении размерности.

– Линейность: PCA – линейный метод, и если данные имеют сложные, нелинейные зависимости, то PCA может не дать хороших результатов.

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

Пример: Сегментация данных с использованием PCA на наборе данных о клиентах

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

Мы будем использовать сконструированный набор данных, который включает два признака:

– Сумма покупок: сколько клиент тратит за месяц.

– Частота покупок: как часто клиент делает покупки в месяц.

Цель – сегментировать клиентов на основе этих признаков.

Шаг 1: Генерация данных

Для начала создадим искусственные данные с использованием библиотеки `numpy`. Мы сгенерируем данные с 2 признаками для 300 клиентов и будем использовать PCA для уменьшения размерности, а затем применим K-means для сегментации.

```python

import numpy as np

import matplotlib.pyplot as plt

from sklearn.decomposition import PCA

from sklearn.cluster import KMeans

from sklearn.preprocessing import StandardScaler

from sklearn.datasets import make_blobs

# Генерация искусственного набора данных

np.random.seed(42)

# Создадим два кластера с различной суммой покупок и частотой покупок

X, _ = make_blobs(n_samples=300, centers=[[10, 5], [60, 15]], cluster_std=[15, 15], random_state=42)

# Масштабируем данные

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X)

# Визуализируем исходные данные

plt.scatter(X_scaled[:, 0], X_scaled[:, 1], alpha=0.5)

plt.title("Изначальные данные о покупках")

plt.xlabel("Сумма покупок")

plt.ylabel("Частота покупок")

plt.show()

```

Шаг 2: Применение PCA для снижения размерности

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

```python

# Применяем PCA для уменьшения размерности

pca = PCA(n_components=2)

X_pca = pca.fit_transform(X_scaled)

# Визуализируем данные после PCA

plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.5)

plt.title("Данные после PCA")

plt.xlabel("Первая главная компонента")

plt.ylabel("Вторая главная компонента")

plt.show()

```

Шаг 3: Применение K-means для кластеризации

Теперь, когда мы применили PCA для снижения размерности, можно использовать алгоритм K-means для сегментации данных. Для этого мы заранее определим количество кластеров, например, 2, так как мы знаем, что данные состоят из двух групп клиентов.

```python

# Применяем K-means для кластеризации

kmeans = KMeans(n_clusters=2, random_state=42)

y_kmeans = kmeans.fit_predict(X_pca)

# Визуализируем результаты кластеризации

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y_kmeans, cmap='viridis', alpha=0.5)

plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X', label='Центроиды')

plt.title("Результаты кластеризации K-means")

plt.xlabel("Первая главная компонента")

plt.ylabel("Вторая главная компонента")

plt.legend()

plt.show()

```

Шаг 4: Анализ результатов

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

Шаг 5: Проверка объяснённой дисперсии с помощью PCA

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

```python

# Выводим долю объясненной дисперсии для каждой главной компоненты

print("Доля объясненной дисперсии для каждой компоненты:", pca.explained_variance_ratio_)

print("Общая объясненная дисперсия (для 2 компонент):", np.sum(pca.explained_variance_ratio_))

```

Результат:

1. Визуализация после применения PCA: После применения PCA мы видим данные, упорядоченные вдоль двух главных компонент. Хотя у нас всего два исходных признака, PCA позволяет выразить данные в линейной комбинации этих признаков, что помогает выделить важные закономерности.

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

3. Объяснённая дисперсия: Ожидаемая доля объяснённой дисперсии поможет понять, сколько информации мы потеряли при применении PCA. В случае с двумя компонентами результат обычно будет достаточно высоким, особенно для данных с явными группами.

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

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

1
...
...
11