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

Как ранжировать признаки?

1.2 Junior🔥 161 комментариев
#Машинное обучение

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

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

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

Как ранжировать признаки?

Введение

Ранжирование признаков (Feature Ranking) — это процесс определения важности каждого признака для прогноза модели. Это критически важно для понимания влияния переменных на целевую переменную, выбора наиболее информативных признаков и борьбы с проклятием размерности.

1. Встроенные методы (Model-based Feature Importance)

1.1 Random Forest и Gradient Boosting

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
import pandas as pd

X, y = load_breast_cancer(return_X_y=True)

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

# Получение важности признаков
feature_importance_rf = pd.DataFrame({
    feature: range(X.shape[1]),
    importance: rf.feature_importances_
}).sort_values(importance, ascending=False)

print("Top 5 признаков (Random Forest):")
print(feature_importance_rf.head())

# Gradient Boosting
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb.fit(X, y)
feature_importance_gb = gb.feature_importances_

1.2 Линейные модели (коэффициенты)

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression(max_iter=1000)
lr.fit(X, y)

# Коэффициенты = важность признаков
coefficients = pd.DataFrame({
    feature: range(X.shape[1]),
    coefficient: lr.coef_[0]
}).sort_values(coefficient, ascending=False, key=abs)

print("Важность признаков (Logistic Regression):")
print(coefficients.head())

2. Методы на основе перестановок (Permutation Importance)

Используется для любой модели. Идея: если перетасовать значения признака, и качество модели сильно упадёт, значит признак важный.

from sklearn.inspection import permutation_importance
from sklearn.ensemble import RandomForestClassifier

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

# Вычисление permutation importance
result = permutation_importance(
    rf, X, y, 
    n_repeats=10, 
    random_state=42
)

perm_importance = pd.DataFrame({
    feature: range(X.shape[1]),
    importance: result.importances_mean,
    std: result.importances_std
}).sort_values(importance, ascending=False)

print("Permutation Importance:")
print(perm_importance.head())

3. SHAP (SHapley Additive exPlanations)

Самый продвинутый и интерпретируемый метод. Основан на теории игр (значения Шепли).

import shap
from sklearn.ensemble import RandomForestClassifier

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

# Создание объекта SHAP explainer
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X)

# Средняя абсолютная важность
feature_importance_shap = pd.DataFrame({
    feature: range(X.shape[1]),
    importance: shap_values[1].mean(axis=0)  # Для классификации берём class 1
}).sort_values(importance, ascending=False, key=abs)

print("SHAP Feature Importance:")
print(feature_importance_shap.head())

# Визуализация
shap.summary_plot(shap_values[1], X, show=False)
shap.force_plot(explainer.expected_value[1], shap_values[1][0], X[0])

4. Корреляция и взаимная информация

4.1 Корреляция Пирсона

import pandas as pd
import numpy as np

correlation = np.corrcoef(X.T, y)[:-1, -1]
feature_corr = pd.DataFrame({
    feature: range(X.shape[1]),
    correlation: correlation
}).sort_values(correlation, ascending=False, key=abs)

print("Корреляция с целевой переменной:")
print(feature_corr.head())

4.2 Взаимная информация

from sklearn.feature_selection import mutual_info_classif

mi_scores = mutual_info_classif(X, y, random_state=42)
feature_mi = pd.DataFrame({
    feature: range(X.shape[1]),
    mutual_info: mi_scores
}).sort_values(mutual_info, ascending=False)

print("Взаимная информация:")
print(feature_mi.head())

5. Методы отбора признаков

5.1 RFE (Recursive Feature Elimination)

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

rfe = RFE(LogisticRegression(max_iter=1000), n_features_to_select=5)
rfe.fit(X, y)

selected_features = np.where(rfe.support_)[0]
print(f"Выбранные признаки: {selected_features}")
print(f"Ранжирование: {rfe.ranking_}")

5.2 SelectKBest

from sklearn.feature_selection import SelectKBest, f_classif

selector = SelectKBest(f_classif, k=5)
selector.fit(X, y)

scores = pd.DataFrame({
    feature: range(X.shape[1]),
    score: selector.scores_
}).sort_values(score, ascending=False)

print("SelectKBest результаты:")
print(scores.head())

6. Сравнение методов

МетодКогда использоватьПреимуществаНедостатки
Tree-basedTree modelsБыстро, встроеноМожет переоценить корреляции
PermutationЛюбые моделиМодель-агностикМедленнее, зависит от корреляции признаков
SHAPИнтерпретацияТеоретически обоснованноМедленнее на больших данных
Мутуальная информацияКатегориальные данныеЗахватывает нелинейностьТребует дискретизации
CorrelationБыстрая разведкаОчень быстроНе захватывает нелинейность

Практические рекомендации

  • Используйте несколько методов для перекрестной проверки
  • Для интерпретируемости предпочитайте SHAP
  • Для скорости используйте tree-based importance
  • Учитывайте корреляцию между признаками
  • Удаляйте признаки постепенно, проверяя качество модели

Заключение

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