Понижение размерности и 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 ищет направления наибольшего разброса данных и делает их новыми осями.
- Доля сохранённой информации показывает, насколько удачно прошло сжатие.