Представьте и продемонстрируйте, как оценивать важность функций модели, используя перестановку функций, удаление столбца, значения SHAP и метрики, специфичные для модели.
Один из наиболее часто задаваемых вопросов при рассмотрении режима машинного обучения в компании: «Какие основные факторы влияют на прогнозирование модели?»
Чтобы ответить на этот вопрос, специалист по анализу данных всегда использует важность функции как часть ответа. Итак, в этой истории мы исследуем важность функции и рассмотрим три способа ее оценки.
- Важность встроенных функций для конкретных моделей
- Перестановка и падение важности
- Значения SHAP на основе важности функции
Один важный момент, касающийся важности функции. Обычно, когда мы говорим о важности функции, мы исходим из глобальной агрегированной позиции. Мы рассматриваем все экземпляры в обучающем наборе, а затем даем количественное сравнение, какие функции относительно больше влияют на прогнозирование модели.
Я буду использовать один пример модели и применять разные способы оценки важности функции.
Пример модели
Модель представляет собой RandomForestRegressor и источник данных от Kaggle Boston Housing.
import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn import metrics from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor boston = load_boston() X = pd.DataFrame(boston.data, columns=boston.feature_names) y = boston.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=22) model = RandomForestRegressor(n_estimators=200) model.fit(X_train, y_train) y_pred = model.predict(X_test) print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, y_pred))) print('R-Squared:', metrics.r2_score(y_test, y_pred)) #RMSE: 3.656865370315698 #R-Squared: 0.8405983138750325
Важность конкретных характеристик модели
Во многих случаях мне нравится классифицировать модели на модели на основе дерева и модели на основе регрессии.
Древовидная модель
Для модели на основе дерева важность функции обычно основывается на критериях разделения узла дерева. При разделении любого узла дерева мы пробуем все функции и выбираем функцию, которая может максимально оптимизировать критерии, такие как Джини, получение информации и т. Д., До разделения узла и после разделения дочерних узлов.
Поэтому, естественно, мы можем рассмотреть следующие факторы для расчета и агрегирования важности функций.
- Как часто выбирается объект для разделения узла дерева
- Какое усиление при расщеплении достигается функцией расщепления
- Сколько наблюдений было включено или затронуто расщеплением
В нашем примере RandomForestRegressor, основанный на дереве, scikit-learn реализует важность функции с помощью «взвешенного (размер наблюдения) усиления Джини».
Модель регрессии
Давайте воспользуемся линейной регрессией для построения интуиции. Обычно мы можем использовать абсолютное значение коэффициентов признаков для обозначения важности признаков, но будьте осторожны с двумя нижеследующими пунктами.
- Значение функции имеет разные масштабы, нам может потребоваться стандартизировать все функции в одну шкалу (например, значение функции только в пределах от 0 до 1) для сравнения коэффициентов
- Стандартная ошибка коэффициента, мы знаем, что коэффициент - это оценочное среднее значение из предполагаемого нормального распределения, поэтому, если стандартная ошибка σ слишком велика, то среднее значение неточно для представления диапазона.
Обычно библиотека ML имеет встроенные свойства для важности конкретной функции модели, как показано ниже в примере scikit-learn RandomForestRegressor.
sorted_idx = model.feature_importances_.argsort() plt.barh( boston.feature_names[sorted_idx], model.feature_importances_[sorted_idx]) plt.xlabel("RandomForestRegressor Feature Importance")
Важность перестановки и отбрасывания столбца
Важность функции перестановки основана на интуиции, что, если функция не полезна для прогнозирования результата, изменение или перестановка ее значений не приведет к значительному снижению производительности модели.
С другой стороны, если функция важна для прогнозирования результата, и мы изменяем или переставляем ее значение, то на прогноз результата будет оказано огромное негативное влияние.
Ниже приведены общие шаги:
- Учитывая обученную модель, тестовый набор данных и метрику оценки обученной модели (базовую метрику) в наборе тестов, значение функции перестановки выбирает столбец функции из набора тестов и создает случайную перестановку в этом столбце функции (перетасовывает значения этого столбца ), затем оценивает производительность обученной модели на модифицированном наборе данных.
- Оценка важности определяется как снижение метрики производительности по сравнению с базовой метрикой после перетасовки значений функций.
- Это делается итеративно для каждого столбца функций, по одному.
Падение важности столбца похоже на обратный процесс выбора функции, но с удалением только одной функции. Интуиция подсказывает, что если функция важна для прогнозирования модели, то ее удаление определенно снизит производительность модели. Шаги ниже:
- Даны обученная модель, обучающий набор данных, тестовый набор данных и метрика оценки обученной модели (базовая метрика) в наборе тестов.
- Отбросьте одну функцию из обучающего набора данных и повторно обучите модель с помощью обучающего набора данных drop-one feature, затем вычислите повторно обученные метрики производительности модели на тестовом наборе.
- Оценка важности определяется как уменьшение метрики производительности повторно обученной модели по сравнению с базовой метрикой.
- Это делается итеративно для каждого столбца функций, по одному.
Значение Drop Column Importance требует переобучения модели для каждого отбрасывания одной функции, поэтому это намного медленнее, чем Permutation Feature Importance, и во многих случаях повторно обучать модель нецелесообразно.
При применении важности функции перестановки и важности отбрасываемого столбца мне нравится использовать библиотеку python rfpimp, как показано ниже.
pip install rfpimp
Пример важности функции перестановки
from rfpimp import permutation_importances perm_importance = permutation_importances( model, X_train, y_train, oob_regression_r2_score) perm_importance.sort_values( by=['Importance']).plot.barh(y='Importance')
Пример важности выпадающего столбца
from rfpimp import dropcol_importances def custom_regression_r2_score(model, X, y, sample_weights): y_pred = model.predict(X) oob_score = r2_score(y, y_pred) return oob_score drop_importance = dropcol_importances( model, X_train, y_train, None, None, custom_regression_r2_score) drop_importance.sort_values( by=['Importance']).plot.barh(y='Importance')
Значения SHAP на основе важности функции
Значения SHAP - это метод расчета вклада функций экземпляра, и если мы усредним вклад функций всех экземпляров, мы можем получить важность функции.
Сначала нам нужно установить библиотеку SHAP
pip install shap or if in conda environment conda install -c conda-forge shap
Затем мы можем создать объяснитель SHAP и получить сводную информацию о функциях.
import shap explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_train) shap_imp_pd=pd.DataFrame( index=boston.feature_names, data = np.mean(np.absolute(shap_values), axis = 0), columns=["Importance"]) shap_imp_pd.sort_values( by=['Importance']).plot.barh(y='Importance')
Резюме
Цель использования важности функции - провести глобальное сравнение предсказательной силы каждой функции.
И чтобы иметь более точную важность функции, есть два препятствия, с которыми мы всегда должны иметь дело:
- Функция Мультиколлинеарность: если есть сильная корреляция между функциями, важность функции, которую мы получаем с помощью вышеупомянутых методов, может быть неверной.
- Взаимодействие функций, мы всегда анализируем важность отдельной функции, как насчет того, чтобы в некоторых случаях отдельная функция не имела большого эффекта, но совместная работа имеет сильную предсказательную силу.
Я напишу несколько историй о двух вышеупомянутых сценариях позже, спасибо за чтение.
ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА
- Интерпретируемое машинное обучение: https://christophm.github.io/interpretable-ml-book/shap.html
- Остерегайтесь значения случайного леса по умолчанию: https://explained.ai/rf-importance/
- Важность функции перестановки: https://docs.microsoft.com/en-us/archive/blogs/machinelearning/permutation-feature-importance