← Назад к вопросам
Как отбираешь признаки для анализа при их большом количестве?
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)
Ключевые рекомендации
- Не упускайте контекст: Доменные знания помогают отбросить явно ненужные признаки
- Кросс-валидация: Оценивайте эффект каждого признака на тестовой выборке
- Избегайте перефита: Отбор признаков на обучающей выборке может привести к перефиту
- Итерационность: Это не одноразовый процесс — пересматривайте по мере развития проекта