Как отбирать признаки, если их слишком много?

«Как отбирать признаки, если их слишком много?» — вопрос из категории Предобработка данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При работе с высокоразмерными данными (тысячи признаков) я применяю многоэтапный подход к отбору фич, комбинируя фильтрующие, встроенные и модельные методы.

Моя типичная стратегия:

  1. Фильтрующие методы (Filter Methods): Быстрая первичная отсечка.

    • Удаляю константные и квази-константные признаки.
    • Удаляю дубликаты и признаки с очень высокой корреляцией (например, >0.95).
      
      import pandas as pd
      import numpy as np

    Вычисление корреляционной матрицы

    corr_matrix = X.corr().abs()

    Выбор верхнего треугольника матрицы

    upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))

    Поиск признаков с корреляцией выше порога

    to_drop = [column for column in upper.columns if any(upper[column] > 0.95)] X_filtered = X.drop(columns=to_drop)

  2. Встроенные методы (Embedded Methods): Отбор в процессе обучения модели.

    • Использую модели с регуляризацией L1 (Lasso), которая зануляет неважные веса.
    • Анализирую feature_importances_ из ансамблевых моделей (RandomForest, Gradient Boosting).
      
      from sklearn.ensemble import RandomForestClassifier

    rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_filtered, y) importances = rf.featureimportances

    Выбираю топ-N признаков

    top_n_indices = np.argsort(importances)[-20:] # топ-20 X_selected = X_filtered.iloc[:, top_n_indices]

  3. Методы-обёртки (Wrapper Methods): Для финальной тонкой настройки, если позволяет время.

    • Recursive Feature Elimination (RFE) с простой моделью-оценщиком.

Критерий остановки: Я сравниваю качество модели (например, ROC-AUC) на валидационной выборке до и после отбора. Цель — сохранить или улучшить метрику, значительно сократив пространство признаков.