Как выполнить ранжирование признаков (feature ranking)?

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

Ответ

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

1. Встроенные важности из ансамблевых моделей (Model-based)

from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np

# Обучаем модель
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# Извлекаем важность признаков (на основе среднего уменьшения примеси Gini/ MSE)
importances = rf.feature_importances_
feature_ranking = pd.DataFrame({'feature': X_train.columns, 'importance': importances})
feature_ranking = feature_ranking.sort_values('importance', ascending=False)

2. Перестановочная важность (Permutation Importance) Более надежный метод, который не смещён в сторону высокоразмерных или категориальных признаков. Он измеряет, насколько падает качество модели, если значения признака случайно перемешаны.

from sklearn.inspection import permutation_importance

perm_result = permutation_importance(rf, X_val, y_val, n_repeats=10, random_state=42)
sorted_idx = perm_result.importances_mean.argsort()[::-1]
# Ранжированные признаки: X_train.columns[sorted_idx]

3. Статистические методы для фильтрации

  • Для регрессии: Коэффициент корреляции Пирсона или Спирмена между признаком и целевой переменной.
  • Для классификации: F-статистика (ANOVA) или взаимная информация (mutual information).

4. Коэффициенты линейных моделей с L1-регуляризацией (Lasso) Lasso обнуляет веса неважных признаков, выполняя отбор автоматически.

from sklearn.linear_model import LassoCV
lasso = LassoCV(cv=5).fit(X_scaled, y)
# Ненулевые коэффициенты: np.where(lasso.coef_ != 0)[0]

Мой практический workflow:

  1. Использую перестановочную важность на валидационной выборке как основной устойчивый метод.
  2. Сравниваю результат с важностью из RandomForest/Gradient Boosting.
  3. Для линейных зависимостей дополнительно смотрю на коэффициенты Lasso или взаимную информацию.
  4. Принимаю решение об отборе признаков, ориентируясь на консенсус среди топ-фич по разным методам. Это позволяет избежать зависимости от артефактов одного конкретного алгоритма.