Ответ
Ранжирование признаков — ключевой этап для понимания данных, отбора наиболее информативных фич и борьбы с проклятием размерности. Я обычно комбинирую несколько методов для получения устойчивой оценки.
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:
- Использую перестановочную важность на валидационной выборке как основной устойчивый метод.
- Сравниваю результат с важностью из RandomForest/Gradient Boosting.
- Для линейных зависимостей дополнительно смотрю на коэффициенты Lasso или взаимную информацию.
- Принимаю решение об отборе признаков, ориентируясь на консенсус среди топ-фич по разным методам. Это позволяет избежать зависимости от артефактов одного конкретного алгоритма.