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

Как оценивал важность признаков получившейся модели?

2.0 Middle🔥 251 комментариев
#Машинное обучение#Метрики и оценка моделей

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

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

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

Оценка важности признаков в моделях машинного обучения

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

1. Встроенные методы (tree-based модели)

XGBoost, LightGBM, CatBoost

from xgboost import XGBClassifier
import matplotlib.pyplot as plt
import pandas as pd

model = XGBClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

feature_importance = model.feature_importances_

importance_df = pd.DataFrame({
    "feature": X_train.columns,
    "importance": feature_importance
}).sort_values("importance", ascending=False)

print(importance_df)

plt.figure(figsize=(10, 6))
plt.barh(importance_df["feature"][:15], importance_df["importance"][:15])
plt.xlabel("XGBoost Feature Importance")
plt.tight_layout()
plt.show()

# Разные типы важности
importance_gain = model.get_booster().get_score(importance_type="gain")
importance_cover = model.get_booster().get_score(importance_type="cover")
importance_freq = model.get_booster().get_score(importance_type="frequency")

2. Permutation Feature Importance

Показывает, насколько падает качество при перемешивании значений:

from sklearn.inspection import permutation_importance

perm_importance = permutation_importance(
    model, 
    X_val, 
    y_val,
    n_repeats=10,
    random_state=42,
    n_jobs=-1
)

perm_importance_df = pd.DataFrame({
    "feature": X_val.columns,
    "importance": perm_importance.importances_mean,
    "std": perm_importance.importances_std
}).sort_values("importance", ascending=False)

print(perm_importance_df)

# Визуализация с доверительными интервалами
plt.figure(figsize=(10, 6))
plt.barh(perm_importance_df["feature"][:15], perm_importance_df["importance"][:15],
         xerr=perm_importance_df["std"][:15])
plt.xlabel("Permutation Importance")
plt.tight_layout()
plt.show()

3. SHAP (SHapley Additive exPlanations)

Наиболее мощный метод, основан на теории игр:

import shap

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_val)

# Глобальная важность
shap.summary_plot(shap_values, X_val, plot_type="bar")

# Детальный summary plot
shap.summary_plot(shap_values, X_val)

# Зависимость признака
shap.dependence_plot("feature_name", shap_values, X_val)

# Локальная интерпретируемость для отдельного примера
sample_idx = 0
shap.plots.waterfall(explainer.explain(X_val.iloc[sample_idx]))

4. Метод исключения (Leave-One-Out)

from sklearn.metrics import roc_auc_score

def feature_importance_by_exclusion(model, X_val, y_val):
    """Важность путём исключения каждого признака"""
    baseline_score = roc_auc_score(y_val, model.predict_proba(X_val)[:, 1])
    importance_scores = {}
    
    for feature in X_val.columns:
        X_val_without = X_val.drop(columns=[feature])
        score_without = roc_auc_score(y_val, model.predict_proba(X_val_without)[:, 1])
        importance_scores[feature] = baseline_score - score_without
    
    return sorted(importance_scores.items(), key=lambda x: x[1], reverse=True)

feature_importance = feature_importance_by_exclusion(model, X_val, y_val)
for feature, score in feature_importance[:10]:
    print(f"{feature}: {score:.4f}")

5. Partial Dependence Plot (PDP)

Показывает среднее влияние признака на предсказание:

from sklearn.inspection import partial_dependence, PartialDependenceDisplay

# Для одного признака
fig, ax = plt.subplots(figsize=(10, 6))
PartialDependenceDisplay.from_estimator(
    model, X_val,
    features=["feature_name"],
    ax=ax
)
plt.show()

# Для нескольких признаков
fig, axes = plt.subplots(2, 3, figsize=(15, 8))
PartialDependenceDisplay.from_estimator(
    model, X_val,
    features=[0, 1, 2, 3, 4, 5],
    grid_resolution=50,
    axes=axes.ravel()
)
plt.tight_layout()
plt.show()

6. Cohort Analysis (анализ когорт)

def cohort_analysis(X, y, feature_name, n_bins=5):
    """Анализ влияния признака по когортам"""
    X["target"] = y
    X["percentile"] = pd.qcut(X[feature_name], q=n_bins, duplicates="drop")
    
    cohort_stats = X.groupby("percentile").agg({
        "target": ["mean", "count", "sum"],
        feature_name: ["min", "max"]
    })
    
    print(f"Cohort Analysis for {feature_name}:")
    print(cohort_stats)
    
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
    cohort_stats["target"]["mean"].plot(ax=ax1, kind="bar")
    ax1.set_title(f"Average Target by {feature_name}")
    
    cohort_stats["target"]["count"].plot(ax=ax2, kind="bar")
    ax2.set_title("Sample Count by Percentile")
    
    plt.tight_layout()
    plt.show()

7. Практический пример (полный pipeline)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = XGBClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 1. Встроенная важность
builtin_importance = pd.DataFrame({
    "feature": X_train.columns,
    "importance": model.feature_importances_
}).sort_values("importance", ascending=False)

print("=== XGBoost Built-in Importance ===")
print(builtin_importance.head(10))

# 2. Permutation Importance
from sklearn.inspection import permutation_importance
perm_imp = permutation_importance(model, X_test, y_test, n_repeats=10, random_state=42)

perm_importance = pd.DataFrame({
    "feature": X_test.columns,
    "importance": perm_imp.importances_mean,
    "std": perm_imp.importances_std
}).sort_values("importance", ascending=False)

print("\n=== Permutation Importance ===")
print(perm_importance.head(10))

# 3. SHAP
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, plot_type="bar")

# 4. Сравнение методов
comparison = pd.DataFrame({
    "feature": X_train.columns,
    "builtin": builtin_importance.set_index("feature").loc[X_train.columns, "importance"].values,
    "permutation": perm_importance.set_index("feature").loc[X_train.columns, "importance"].values
})

print("\n=== Comparison ===")
print(comparison.sort_values("permutation", ascending=False).head(10))

8. Рекомендации по выбору метода

МетодПреимуществаНедостатки
Built-in (Gain)Быстро, интуитивноСмещён к корневым листам
PermutationModel-agnostic, надёженМедленнее
SHAPТеоретически обоснованВычислительно дорого
PDPХорошо интерпретируетсяНе показывает локальное влияние

Ключевые советы:

  1. Используй несколько методов одновременно для подтверждения
  2. Проверяй на валидационном наборе, не на тренировочном
  3. Нормализуй важность к [0, 1] для сравнения
  4. Визуализируй top-10 признаков для очевидности
  5. Проверяй согласованность методов между собой
  6. Изучай взаимодействия между признаками
  7. Документируй выводы для стейкхолдеров
Как оценивал важность признаков получившейся модели? | PrepBro