Ответ
Для оценки важности признаков я использовал несколько методов, в зависимости от типа модели и требований к интерпретируемости.
1. Встроенная важность признаков (для ансамблей на деревьях)
# Для RandomForest, XGBoost, LightGBM
import pandas as pd
import matplotlib.pyplot as plt
# Получение важности
feature_importance = pd.Series(
model.feature_importances_,
index=X_train.columns
).sort_values(ascending=False)
# Визуализация
plt.figure(figsize=(10, 6))
feature_importance.head(15).plot.barh()
plt.title('Top 15 Feature Importances')
plt.xlabel('Importance Score')
plt.tight_layout()
plt.show()
2. Permutation Importance (универсальный метод)
Этот метод показывает, насколько упадет качество модели, если «испортить» конкретный признак, перемешав его значения. Он работает для любых моделей.
from sklearn.inspection import permutation_importance
result = permutation_importance(
model, X_test, y_test,
n_repeats=10, # Количество перестановок для стабильности
random_state=42,
n_jobs=-1
)
# Сортировка и вывод
sorted_idx = result.importances_mean.argsort()[::-1]
for idx in sorted_idx[:10]:
print(f"{X_test.columns[idx]:<30} {result.importances_mean[idx]:.4f} ± {result.importances_std[idx]:.4f}")
3. SHAP (SHapley Additive exPlanations) для детальной интерпретации
SHAP показывает вклад каждого признака в конкретное предсказание и глобально по всему датасету, учитывая взаимодействия признаков.
import shap
# Для tree-based моделей
shap_explainer = shap.TreeExplainer(model)
shap_values = shap_explainer.shap_values(X_test)
# Summary plot для глобальной важности
shap.summary_plot(shap_values, X_test, plot_type="bar")
# Beeswarm plot для распределения влияний
shap.summary_plot(shap_values, X_test)
Ключевые моменты при выборе метода:
feature_importances_— быстрый, но может завышать вес признаков с большим количеством уникальных значений.- Permutation Importance — более надежный, но требует больше вычислений. Хорош для сравнения важности между разными типами моделей.
- SHAP — самый ресурсоемкий, но дает наиболее полную картину, включая направление влияния (положительное/отрицательное) и анализ отдельных наблюдений.
На практике я часто начинаю с Permutation Importance для отбора ключевых признаков, а затем использую SHAP для глубокого анализа и объяснения бизнесу, почему модель принимает те или иные решения.
Ответ 18+ 🔞
А, ну это ж классика, ебать мои старые костыли! Смотри, тут всё просто, как три копейки. Когда надо понять, какие признаки в данных самые важные, я обычно пользуюсь несколькими штуками, в зависимости от того, какая модель и насколько надо всё объяснить.
1. Встроенная важность (для моделей на деревьях)
Это как встроенный в машину спидометр — показывает, но не всегда правду на все сто. Для всяких RandomForest, XGBoost, LightGBM.
# Для RandomForest, XGBoost, LightGBM
import pandas as pd
import matplotlib.pyplot as plt
# Получение важности
feature_importance = pd.Series(
model.feature_importances_,
index=X_train.columns
).sort_values(ascending=False)
# Визуализация
plt.figure(figsize=(10, 6))
feature_importance.head(15).plot.barh()
plt.title('Top 15 Feature Importances')
plt.xlabel('Importance Score')
plt.tight_layout()
plt.show()
Быстро, понятно, но есть нюанс — иногда он может наебать и завысить вес признаков, где просто много разных значений. Доверия ебать ноль, если смотреть только на это.
2. Permutation Importance (метод перестановок)
Вот это уже серьёзнее, ёпта. Суть проще некуда: берём признак, хуячим его значения в случайном порядке, как карты в колоде, и смотрим, насколько модель обосрётся и упадёт в качестве. Работает для чего угодно, хоть для нейросети, хоть для линейной регрессии.
from sklearn.inspection import permutation_importance
result = permutation_importance(
model, X_test, y_test,
n_repeats=10, # Количество перестановок для стабильности
random_state=42,
n_jobs=-1
)
# Сортировка и вывод
sorted_idx = result.importances_mean.argsort()[::-1]
for idx in sorted_idx[:10]:
print(f"{X_test.columns[idx]:<30} {result.importances_mean[idx]:.4f} ± {result.importances_std[idx]:.4f}")
Метод надёжный, но, бля, требует времени, потому что модель надо переобучать кучу раз. Зато картинка выходит честная.
3. SHAP (SHapley Additive exPlanations)
А это, дружок, уже высшая лига, ядрёна вошь! Тут не просто важность, а полный разбор полётов: как каждый признак толкает конкретное предсказание в плюс или в минус. Учитывает даже взаимодействия между признаками, что вообще пиздец как круто.
import shap
# Для tree-based моделей
shap_explainer = shap.TreeExplainer(model)
shap_values = shap_explainer.shap_values(X_test)
# Summary plot для глобальной важности
shap.summary_plot(shap_values, X_test, plot_type="bar")
# Beeswarm plot для распределения влияний
shap.summary_plot(shap_values, X_test)
Красота, конечно, но жрёт ресурсов, как не в себя. Овердохуища вычислений.
Так какого хуя выбирать?
Слушай сюда, чувак:
feature_importances_— это как быстрый осмотр на глазок. Быстро, но можешь и обмануться.- Permutation Importance — это уже нормальный техосмотр. Надёжно, можно сравнивать разные модели между собой.
- SHAP — это полная разборка двигателя с микроскопом. Долго, дорого, но ты понимаешь каждую гаечку. Идеально, когда надо отчитаться перед начальством, которое вечно спрашивает «а почему модель так решила?».
Я обычно так и делаю: сначала Permutation Importance, чтобы отсеять явный шлак и понять, что вообще важно. А потом, если проект серьёзный и надо всё расписать, включаю SHAP и делаю красивые графики, от которых у бизнеса волнение ебать.