← Назад к вопросам
Как оценивал важность признаков получившейся модели?
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) | Быстро, интуитивно | Смещён к корневым листам |
| Permutation | Model-agnostic, надёжен | Медленнее |
| SHAP | Теоретически обоснован | Вычислительно дорого |
| PDP | Хорошо интерпретируется | Не показывает локальное влияние |
Ключевые советы:
- Используй несколько методов одновременно для подтверждения
- Проверяй на валидационном наборе, не на тренировочном
- Нормализуй важность к [0, 1] для сравнения
- Визуализируй top-10 признаков для очевидности
- Проверяй согласованность методов между собой
- Изучай взаимодействия между признаками
- Документируй выводы для стейкхолдеров