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

Ответ

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

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

  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) на валидационной выборке до и после отбора. Цель — сохранить или улучшить метрику, значительно сократив пространство признаков.

Ответ 18+ 🔞

Слушай, я тут подумал про твой вопрос про фичи, когда их дохуя, тысячи. Ну, ёпта, это же классика — овердохуища признаков, а толку с них как с козла молока. Я обычно действую по чёткому плану, этапами, чтобы не сойти с ума и не переобучить модель на хер знает чём.

Вот как я обычно разбираюсь с этой кучей:

  1. Быстрая чистка (Фильтрующие методы): Первым делом — убрать явный мусор, чтобы не тратить на него время. Это как перед генеральной уборкой выкинуть пустые бутылки.

    • Выкидываю признаки-константы — они нихуя не несут. И квази-константные тоже, от них один шум.
    • Ищу и удаляю дубликаты. Ну и самое главное — признаки, которые друг на друга похожи как две капли воды (корреляция за 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. Умный отбор (Встроенные методы): Тут уже даю поработать моделям, пусть сами решают, что важно. Это как отправить на склад умного кладовщика, который сам выкинет ненужное.

    • Очень люблю Lasso (L1 регуляризацию). Она жёсткая такая — неважные веса просто в ноль загоняет. Красота.
    • Ну или смотрю на feature_importances_ из RandomForest или какого-нибудь бустинга. Лес, например, хорошо показывает, какими признаками он чаще всего пользуется для принятия решений.
      
      from sklearn.ensemble import RandomForestClassifier

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

    Отбираю только топовые, самые важные признаки

    top_n_indices = np.argsort(importances)[-20:] # Допустим, 20 лучших X_selected = X_filtered.iloc[:, top_n_indices]

    
    Вот после этого этапа обычно остаётся уже что-то вменяемое, а не первоначальная **пиздопроебибна**.
  3. Тонкая настройка (Методы-обёртки): Если проект важный и время есть, могу заморочиться. Например, запустить Recursive Feature Elimination (RFE). Это когда модель итеративно отбрасывает худшие признаки и смотрит, не стало ли лучше. Долго, но иногда того стоит.

А когда остановиться-то? Вот тут всё просто, чувак. Главный критерий — качество на валидации. Замеряю метрику (допустим, ROC-AUC) ДО и ПОСЛЕ всей этой чистки. Если метрика не просела (а в идеале — даже выросла), а признаков стало в разы меньше — я молодец, цель достигнута. Если же после моих танцев с бубном модель стала предсказывать как полупидор, значит, я перестарался и выкинул что-то важное. Тогда надо возвращаться на шаг назад. В общем, доверия ебать ноль к красивому графику, только холодные цифры валидации.