Понижение размерности и PCA

Когда признаков слишком много, их можно сжать в несколько — почти ничего не потеряв.

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

Зачем это нужно

В реальных задачах признаков бывают десятки и сотни. Это создаёт проблемы:

  • Не видно глазами. Данные с 50 признаками не нарисуешь на графике, а понять их форму хочется.
  • Лишний шум и дублирование. Многие признаки коррелируют (рост в см и рост в дюймах несут одно и то же), часть — почти бесполезны.
  • Скорость и переобучение. Чем больше признаков, тем медленнее обучение и выше риск, что модель ухватится за случайные совпадения.

Понижение размерности сжимает признаки до 2–3 «главных», которые несут основную долю информации. После этого данные можно нарисовать и быстрее обучать модели.

Идея PCA на пальцах

PCA (Principal Component Analysis, метод главных компонент) — самый известный способ. Интуиция такая: представьте облако точек, вытянутое по диагонали. PCA находит направление, вдоль которого точки разбросаны сильнее всего (в нём больше всего информации), и делает его новой главной осью. Второе по важности направление — перпендикулярное первому, и так далее.

Если облако вытянуто почти в линию, то одной новой оси хватит, чтобы описать почти всё: два признака сжались в один, а форма сохранилась. Аналогия — тень: объёмный предмет отбрасывает плоскую тень, и если выбрать удачный угол света, по тени всё ещё узнаёшь предмет. PCA ищет такой «удачный угол».

# Интуиция: два сильно скоррелированных признака
height_cm = [150, 160, 170, 180, 190]
height_in = [round(h / 2.54, 1) for h in height_cm]

print("см:    ", height_cm)
print("дюймы: ", height_in)
# Дюймы почти не несут новой информации сверх сантиметров —
# по сути это один и тот же признак в разных единицах.
# PCA как раз выявляет такую избыточность и сжимает её.

Вывод:

см:     [150, 160, 170, 180, 190]
дюймы:  [59.1, 63.0, 66.9, 70.9, 74.8]

Здесь невооружённым глазом видно: дюймы — это рост в сантиметрах, поделённый на 2.54. Два признака фактически дублируют друг друга, и PCA свёл бы их к одному.

Где применяют

  • Визуализация. Сжать многомерные данные до 2D и нарисовать — увидеть кластеры и выбросы.
  • Сжатие. Уменьшить объём данных (например, изображений), сохранив главное.
  • Ускорение моделей. Меньше признаков — быстрее обучение и меньше шума.

На практике

# Иллюстрация (scikit-learn в браузере не запустится)
from sklearn.decomposition import PCA

# X — данные с многими признаками
pca = PCA(n_components=2)     # сжать до 2 компонент
X_small = pca.fit_transform(X)

print(X_small.shape)                       # теперь 2 столбца
print(pca.explained_variance_ratio_)       # доля информации в каждой

Поле explained_variance_ratio_ показывает, какую долю «разброса» (информации) сохранила каждая новая ось — так видно, не потеряли ли мы слишком много.

Итог

  • Понижение размерности сжимает много признаков в несколько, сохраняя суть.
  • Польза: визуализация, ускорение, борьба с шумом и дублированием.
  • PCA ищет направления наибольшего разброса данных и делает их новыми осями.
  • Доля сохранённой информации показывает, насколько удачно прошло сжатие.
Проверьте себя
1. Зачем понижают размерность данных?
AЧтобы добавить больше признаков
BЧтобы сжать много признаков в несколько — для визуализации, скорости и борьбы с шумом
CЧтобы превратить задачу в регрессию
DЧтобы увеличить число меток
2. Какую интуицию использует PCA?
AНаходит направления наибольшего разброса точек и делает их новыми осями
BСлучайно удаляет половину признаков
CДобавляет к данным шум
DСортирует объекты по метке
3. Если два признака — это рост в сантиметрах и тот же рост в дюймах, что сделает PCA?
AОставит оба признака как независимые
BЗаметит, что они дублируют друг друга, и сожмёт их практически в один
CУдалит оба признака полностью
DПревратит их в метку
Поддержать проект