← Назад к вопросам

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

2.0 Middle🔥 241 комментариев
#Pandas и обработка данных#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стратегия отбора признаков (Feature Selection)

При работе с большим количеством признаков я применяю комбинированный подход, который начинается с самых быстрых методов и переходит к более сложным анализам.

1. Анализ вариативности и пропусков

Первый фильтр — убираю признаки без информационной ценности:

from sklearn.feature_selection import VarianceThreshold

selector = VarianceThreshold(threshold=0.01)
X_filtered = selector.fit_transform(X)

missing_threshold = 0.5
cols_to_drop = [col for col in X.columns 
                if X[col].isna().sum() / len(X) > missing_threshold]
X = X.drop(columns=cols_to_drop)

2. Корреляционный анализ

Удаляю дублирующиеся (сильнокоррелированные) признаки:

import pandas as pd
import numpy as np

corr_matrix = X.corr().abs()
upper_triangle = corr_matrix.where(
    np.triu(np.ones(corr_matrix.shape), k=1).astype(bool)
)

to_drop = [column for column in upper_triangle.columns 
           if any(upper_triangle[column] > 0.95)]
X = X.drop(columns=to_drop)

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

Для задач классификации использую chi-square для категориальных и f-score для численных признаков:

from sklearn.feature_selection import SelectKBest, f_classif, chi2

selector = SelectKBest(f_classif, k=50)
X_selected = selector.fit_transform(X, y)

selected_features = X.columns[selector.get_support()].tolist()

4. Древовидные модели для важности признаков

Random Forest и XGBoost дают встроенную оценку важности:

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)

importance_df = pd.DataFrame({
    'feature': X.columns,
    'importance': rf.feature_importances_
}).sort_values('importance', ascending=False)

print(importance_df.head(20))

5. Рекурсивное удаление признаков (RFE)

Когда нужно оставить определенное количество признаков:

from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier

estimator = RandomForestClassifier(n_estimators=100)
rfe = RFE(estimator, n_features_to_select=30, step=10)
X_rfe = rfe.fit_transform(X, y)

selected = X.columns[rfe.support_].tolist()

6. Пермутационная важность

Более надежный метод, не зависит от архитектуры модели:

from sklearn.inspection import permutation_importance

rf = RandomForestClassifier()
rf.fit(X_train, y_train)

perm_importance = permutation_importance(rf, X_val, y_val, n_repeats=10)

importance_df = pd.DataFrame({
    'feature': X.columns,
    'importance': perm_importance.importances_mean
}).sort_values('importance', ascending=False)

Комбинированный Pipeline

На практике я применяю эти методы последовательно:

X = X.loc[:, (X != X.iloc[0]).any()]

selector = SelectKBest(f_classif, k=100)
X = selector.fit_transform(X, y)

Ключевые рекомендации

  • Не упускайте контекст: Доменные знания помогают отбросить явно ненужные признаки
  • Кросс-валидация: Оценивайте эффект каждого признака на тестовой выборке
  • Избегайте перефита: Отбор признаков на обучающей выборке может привести к перефиту
  • Итерационность: Это не одноразовый процесс — пересматривайте по мере развития проекта