Что влияет на метрику X В нашей работе может достаточно часто возникать задача в следующей формулировке: "А что влияет на метрику X?". Метрика X может быть произвольна. В дальнейшем бизнес может сделать упор над тем, а что можно улучшить, на что стоит обратить внимание. Для решения этой задачи можно подступиться следующим способом:
🆎 Проверить это на интересующей поверхности через A/B тест. Например, мы проводим ухудшающий эксперимент на главной и хотим понять какие метрики шатаются вместе с целевой (какие в общем бывают прокси). Эксперимент может показать насколько сонаправлены различные метрики + возможно его придется долго держать, чтобы проверить необходимые гипотезы.
💻 Собрать таблицу с фичами, которые экспертно могут быть выбраны для обучения модели машинного обучения.
Что здесь можно придумать? 📊 Линейная регрессия. Все мы любим линейную регрессию за ее простую интерпретируемость, но есть существенный минус: между фичой и таргетом должна быть линейная зависимость. Коэффициенты, которые мы получаем при обучении (coef_), по сути коэффициенты при которых минимизируется функция потерь. Кроме того, важно следить за мультиколлинеарностью, чтобы важность фичей не перераспределялась между различными признаками (для этого нужно определить насколько сильно они коррелируют друг с другом). doc `from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression import pandas as pd
X, y = make_regression(n_samples=1000, n_features=10, noise=10, random_state=42) feature_names = [f"feature_{i}" for i in range(X.shape[1])]
model = LinearRegression() model.fit(X, y)
importance = pd.Series(model.coef_, index=feature_names).sort_values(ascending=False)
🌲 Деревья решений и градиентный бустинг. Когда мы работаем с нелинейными зависимостями, линейная регрессия уже не даёт нам полной картины. В таких случаях можно использовать деревья решений и градиентный бустинг. Эти модели оценивают важность признаков по тому, насколько они помогают уменьшать неопределённость (снижать критерий ошибки, например, Gini или MSE) при разбиениях. catboost doc
Здесь можно получить встроенную важность фичей. Это показатель, сколько раз признак использовался для разбиения и насколько он помог улучшить модель. Если признаки сильно коррелируют, модель может выбрать один из них, а другой посчитать неважным.
`from catboost import CatBoostRegressor
model = CatBoostRegressor(iterations=200, verbose=False) model.fit(X, y)
feature_importance = pd.Series(model.get_feature_importance(), index=feature_names)
🤨 Permutation Importance. Метод, который отвечает на вопрос: "Что будет, если убрать этот признак?". doc Шаги: а) Перемешиваем значения одного признака случайным образом. б) Смотрим, как падает качество модели. в) Если качество сильно ухудшается, то признак важен.
`from sklearn.ensemble import RandomForestRegressor from sklearn.inspection import permutation_importance 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 = RandomForestRegressor(n_estimators=100) model.fit(X_train, y_train)
perm_importance = permutation_importance(model, X_test, y_test, scoring="r2") importance = pd.Series(perm_importance.importances_mean, index=feature_names)
Может долго считаться, если данных много + если есть коррелирующие признаки, можем не учесть важность одной из фич
🙄 SHAP. Когда важно не просто узнать, какие признаки важны, но и как именно они влияют. doc `import shap
explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, feature_names=feature_names)
Линейная регрессия подходит для простых зависимостей, деревья и бустинг – для сложных, Permutation Importance – когда нужна честная оценка вклада признаков, а SHAP – для объяснения модели 🤔 Наберется 100 реакций, **напишу более подробно про SHAP. А вы применяете эти методы или какие-то другие?**````