Какие методы отбора признаков (feature selection) вы знаете?

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

Ответ

Отбор признаков — это процесс выбора наиболее информативных переменных для модели. Я использую комбинацию методов в зависимости от объема данных, вычислительных ресурсов и типа модели.

Три основных подхода:

1. Методы-фильтры (Filter Methods) Оценивают значимость признаков независимо от модели, на основе статистических мер.

  • Корреляция: Удаление сильно коррелирующих признаков (мультиколлинеарность).
    corr_matrix = X.corr().abs()
    upper_tri = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
    to_drop = [column for column in upper_tri.columns if any(upper_tri[column] > 0.85)]
    X_filtered = X.drop(to_drop, axis=1)
  • Взаимная информация (Mutual Information): Измеряет нелинейную зависимость между признаком и целевой переменной.
    from sklearn.feature_selection import mutual_info_classif
    mi_scores = mutual_info_classif(X, y)
  • ANOVA F-test: Оценивает различия между группами для категориальных целей.

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

  • Важность признаков в деревьях: Модели на основе деревьев (Random Forest, XGBoost) вычисляют feature_importances_.
    from sklearn.ensemble import RandomForestClassifier
    rf = RandomForestClassifier()
    rf.fit(X, y)
    importances = rf.feature_importances_
    # Выбираем топ-N признаков
    indices = np.argsort(importances)[-10:]
  • L1-регуляризация (Lasso): Штрафует абсолютные значения весов, обнуляя неважные.
    from sklearn.linear_model import LassoCV
    lasso = LassoCV().fit(X, y)
    selected_features = X.columns[lasso.coef_ != 0]

3. Методы-обертки (Wrapper Methods) Используют производительность модели как критерий отбора. Точны, но требуют больших вычислений.

  • Рекурсивное исключение признаков (RFE): Последовательно удаляет наименее важные признаки.
    from sklearn.feature_selection import RFE
    from sklearn.svm import SVC
    estimator = SVC(kernel="linear")
    selector = RFE(estimator, n_features_to_select=5, step=1)
    selector = selector.fit(X, y)
    X_rfe = X.loc[:, selector.support_]
  • Последовательный отбор (Forward/Backward Selection): Пошаговое добавление или удаление признаков.

Дополнительно: Методы на основе дисперсии (удаление константных и квази-константных признаков) и методы уменьшения размерности (PCA, t-SNE), которые не отбирают, а преобразуют признаки.