Как выполнить отбор признаков для модели машинного обучения?

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

Ответ

Отбор признаков (feature selection) — это критический этап для повышения производительности модели, сокращения времени обучения и предотвращения переобучения. Я обычно применяю комбинацию методов, начиная с быстрых фильтров и заканчивая более точными встроенными или обёрточными подходами.

Основные методы, которые я использую:

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

    • Удаление константных и квази-константных признаков.
    • Удаление сильно коррелирующих признаков: Я удаляю один из пары признаков с корреляцией выше 0.85-0.9, чтобы снизить мультиколлинеарность.
      
      import numpy as np
      import pandas as pd

    corr_matrix = df.corr().abs() upper_triangle = corr_matrix.where(np.triu(np.ones_like(corr_matrix), k=1).astype(bool)) to_drop = [col for col in upper_triangle.columns if any(upper_triangle[col] > 0.9)] df_reduced = df.drop(to_drop, axis=1)

    
    *   **Статистические тесты:** `SelectKBest` с `f_classif` (ANOVA) для классификации или `f_regression` для регрессии.
  2. Встроенные методы (Embedded Methods): Признаки отбираются в процессе обучения модели.

    • Важность признаков из деревьев: Использую feature_importances_ у RandomForestClassifier или GradientBoostingClassifier. Это даёт понимание, какие признаки модель считает ключевыми.
    • L1-регуляризация (Lasso): В линейных моделях L1-регуляризация обнуляет веса неинформативных признаков. Это эффективный способ автоматического отбора.
  3. Методы-обёртки (Wrapper Methods): Точные, но вычислительно дорогие. Использую для финальной тонкой настройки набора признаков.

    • Recursive Feature Elimination (RFE): Итеративно удаляет наименее важные признаки, используя оценку важности от модели (например, SVM или того же RandomForest).
      
      from sklearn.feature_selection import RFE
      from sklearn.ensemble import RandomForestClassifier

    estimator = RandomForestClassifier(n_estimators=50) selector = RFE(estimator, n_features_to_select=15, step=1) selector = selector.fit(X_train, y_train) X_train_selected = selector.transform(X_train)

Мой типичный рабочий процесс:

  1. Удаляю константы и дубликаты.
  2. Анализирую и удаляю высокие корреляции.
  3. Применяю SelectKBest для быстрого сужения круга.
  4. Обучаю модель с L1-регуляризацией или смотрю важность признаков из RandomForest.
  5. Для наиболее важных задач финализирую набор с помощью RFE.

Ключевой принцип — всегда проверять качество модели на отложенной выборке (validation set) после каждого этапа отбора, чтобы убедиться, что мы не выбросили что-то важное.