Метод главных компонент PCA: сокращение числа признаков
Метод главных компонент, или PCA, заменяет связанные числовые признаки новыми осями так, чтобы первые компоненты сохраняли как можно больше дисперсии данных. Это помогает сжимать представление, визуализировать многомерные объекты и уменьшать шум, но новые координаты теряют прямой предметный смысл.
От исходных осей к компонентам
Если рост в сантиметрах и рост в метрах находятся в одной таблице, они описывают почти одно направление. PCA поворачивает систему координат: первая компонента проходит вдоль наибольшего разброса, следующая перпендикулярна первой и объясняет максимум оставшейся дисперсии.
Компоненты являются линейными комбинациями исходных столбцов. Они упорядочены по объяснённой дисперсии и взаимно ортогональны в рамках метода. Знак оси условен: компоненту можно умножить на −1 без изменения геометрического смысла.
Почему масштабирование критично
Дисперсия зависит от единиц. Признак с величинами в тысячах может захватить первую компоненту только из-за масштаба. Обычно PCA применяют после StandardScaler, если нет предметной причины сохранить исходное соотношение вариаций.
Scaler и PCA должны обучаться только на train. Если вычислить компоненты по всей таблице, структура test попадёт в представление ещё до проверки модели.
Pipeline с PCA
from sklearn.datasets import load_breast_cancer
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, y = load_breast_cancer(return_X_y=True)
X_train, _, y_train, _ = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
model = make_pipeline(
StandardScaler(),
PCA(n_components=0.95),
LogisticRegression(max_iter=1_000),
)
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print('CV accuracy:', scores.mean().round(3))
model.fit(X_train, y_train)
pca = model.named_steps['pca']
print('Компонент:', pca.n_components_)n_components=0.95 выбирает минимальное число компонент, сохраняющее не менее 95% оценённой дисперсии train. Это не означает сохранение 95% информации, важной именно для целевого ответа.
Дисперсия не равна предсказательной силе
Слабый по общей вариативности признак может идеально разделять классы. PCA не видит y и способен отбросить такое направление. Поэтому число компонент выбирают не только по cumulative explained variance, но и по итоговой метрике задачи на кросс-валидации.
Для визуализации две компоненты дают удобную плоскость, однако пересекающиеся точки не доказывают, что классы неразделимы в полном пространстве. Проекция неизбежно теряет часть структуры.
Когда PCA полезен
Метод хорошо подходит для множества коррелирующих числовых измерений, ускорения некоторых моделей и предварительного исследования. В актуальном scikit-learn PCA принимает разреженный вход только с некоторыми solver, например arpack и covariance_eigh. Для разреженного текста чаще используют TruncatedSVD: он не центрирует матрицу и сохраняет её разреженность. Для деревьев уменьшение размерности иногда только ухудшает понятные пороговые разбиения.
Компоненты затрудняют объяснение: вместо «доход» модель использует смесь десятков столбцов. Если интерпретируемость важнее небольшого выигрыша, отбор исходных признаков может быть предпочтительнее.
Практика: сравните три представления
Возьмите числовой датасет и обучите одну модель на стандартизованных признаках, вторую — после PCA с 95% дисперсии, третью — после двух компонент. Сравните число столбцов, CV-метрику и время. Нарисуйте первые две компоненты, раскрасив известные классы только для анализа.
Что важно запомнить
- PCA создаёт ортогональные линейные компоненты с убывающей дисперсией.
- Масштаб признаков меняет найденные направления.
- Объяснённая дисперсия не гарантирует сохранение сигнала для target.
- PCA обучается внутри Pipeline и проверяется по конечной задаче.