Методы снижения размерности¶
Обзор¶
Снижение размерности — это процесс уменьшения количества признаков в данных при сохранении важной информации. Используется для: - Визуализации данных - Ускорения обучения моделей - Борьбы с проклятием размерности - Удаления шума и коррелированных признаков
PCA (Principal Component Analysis)¶
Принцип работы¶
PCA находит новые оси (главные компоненты), которые: 1. Максимально сохраняют дисперсию данных 2. Ортогональны друг другу
Алгоритм¶
- Стандартизировать данные
- Вычислить ковариационную матрицу
- Найти собственные значения и собственные векторы
- Отсортировать по убыванию собственных значений
- Выбрать top-k компонент
Выбор количества компонент¶
- Объясненная дисперсия: выбрать k, чтобы сохранить 95% дисперсии
- Каменистая осыпь (Scree plot): поиск "излома" на графике
Преимущества и недостатки¶
| Преимущества | Недостатки |
|---|---|
| Линейная сложность | Только линейные зависимости |
| Сохраняет глобальную структуру | Чувствителен к выбросам |
| Уникальное решение | Трудно интерпретировать компоненты |
t-SNE (t-Distributed Stochastic Neighbor Embedding)¶
Принцип работы¶
t-SNE сохраняет локальные структуры данных, моделируя сходства между точками в исходном и низкоразмерном пространствах.
Ключевые идеи¶
- Использует распределение Стьюдента для тяжеловесных хвостов
- Минимизирует KL-дивергенцию между распределениями
- Хорошо сохраняет локальные кластеры
Гиперпараметры¶
n_components: целевая размерность (обычно 2 или 3)perplexity: баланс локальной/глобальной структуры (5-50)learning_rate: темп обучения (10-1000)n_iter: количество итераций (минимум 250)
Преимущества и недостатки¶
| Преимущества | Недостатки |
|---|---|
| Сохраняет локальную структуру | Вычислительно сложный O(n²) |
| Визуализация кластеров | Не сохраняет глобальную структуру |
| Работает с нелинейными данными | Результаты зависят от параметров |
| Не подходит для новых данных |
UMAP (Uniform Manifold Approximation and Projection)¶
Принцип работы¶
UMAP строит топологическое представление данных, предполагая, что данные лежат на многообразии.
Ключевые идеи¶
- Теория римановой геометрии
- Сохраняет как локальную, так и глобальную структуру
- Быстрее t-SNE
Гиперпараметры¶
n_components: целевая размерностьn_neighbors: баланс локальной/глобальной структуры (5-50)min_dist: минимальное расстояние между точками (0.0-0.99)metric: метрика расстояния
Преимущества и недостатки¶
| Преимущества | Недостатки |
|---|---|
| Быстрее t-SNE | Сложнее в настройке |
| Сохраняет глобальную структуру | |
| Масштабируемость | |
| Может трансформировать новые данные |
Сравнение методов¶
| Метод | Тип | Скорость | Локальная структура | Глобальная структура | Новые данные |
|---|---|---|---|---|---|
| PCA | Линейный | Очень быстро | Средне | Хорошо | Да |
| t-SNE | Нелинейный | Медленно | Отлично | Плохо | Нет |
| UMAP | Нелинейный | Быстро | Отлично | Хорошо | Да |
Другие методы¶
LDA (Linear Discriminant Analysis)¶
- Обучение с учителем
- Максимизирует разделимость классов
- Для классификации
Kernel PCA¶
- Нелинейное расширение PCA
- Использует kernel trick
- Для нелинейных зависимостей
Autoencoders¶
- Нейросетевой подход
- Нелинейное снижение размерности
- Гибкая архитектура
Пример кода¶
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import umap
import matplotlib.pyplot as plt
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# Объясненная дисперсия
explained_variance = pca.explained_variance_ratio_
cumulative_variance = explained_variance.cumsum()
# Scree plot
plt.plot(range(1, len(explained_variance)+1), cumulative_variance, 'bo-')
plt.xlabel('Количество компонент')
plt.ylabel('Накопленная дисперсия')
plt.axhline(y=0.95, color='r', linestyle='--', label='95%')
plt.legend()
plt.show()
# t-SNE
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
# Визуализация
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis', alpha=0.6)
plt.title('t-SNE визуализация')
plt.colorbar()
plt.show()
# UMAP
umap_model = umap.UMAP(n_components=2, n_neighbors=15, min_dist=0.1, random_state=42)
X_umap = umap_model.fit_transform(X_scaled)
# Визуализация
plt.scatter(X_umap[:, 0], X_umap[:, 1], c=y, cmap='viridis', alpha=0.6)
plt.title('UMAP визуализация')
plt.colorbar()
plt.show()
# Трансформация новых данных (только PCA и UMAP)
X_new_pca = pca.transform(X_new)
X_new_umap = umap_model.transform(X_new)
Практические советы¶
- Всегда стандартизируйте данные перед PCA
- Начните с PCA как базового метода
- Используйте t-SNE/UMAP для визуализации
- Подбирайте perplexity для t-SNE экспериментально
- Сохраняйте обученные модели для трансформации новых данных
- Интерпретируйте компоненты через loadings (PCA)
Применение¶
- Визуализация высокоразмерных данных
- Предобработка для других алгоритмов
- Сжатие признаков
- Удаление шума
- Исследовательский анализ