Представьте и продемонстрируйте, как оценивать важность функций модели, используя перестановку функций, удаление столбца, значения SHAP и метрики, специфичные для модели.

Один из наиболее часто задаваемых вопросов при рассмотрении режима машинного обучения в компании: «Какие основные факторы влияют на прогнозирование модели?»

Чтобы ответить на этот вопрос, специалист по анализу данных всегда использует важность функции как часть ответа. Итак, в этой истории мы исследуем важность функции и рассмотрим три способа ее оценки.

  1. Важность встроенных функций для конкретных моделей
  2. Перестановка и падение важности
  3. Значения 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

Важность конкретных характеристик модели

Во многих случаях мне нравится классифицировать модели на модели на основе дерева и модели на основе регрессии.

Древовидная модель

Для модели на основе дерева важность функции обычно основывается на критериях разделения узла дерева. При разделении любого узла дерева мы пробуем все функции и выбираем функцию, которая может максимально оптимизировать критерии, такие как Джини, получение информации и т. Д., До разделения узла и после разделения дочерних узлов.

Поэтому, естественно, мы можем рассмотреть следующие факторы для расчета и агрегирования важности функций.

  1. Как часто выбирается объект для разделения узла дерева
  2. Какое усиление при расщеплении достигается функцией расщепления
  3. Сколько наблюдений было включено или затронуто расщеплением

В нашем примере RandomForestRegressor, основанный на дереве, scikit-learn реализует важность функции с помощью «взвешенного (размер наблюдения) усиления Джини».

Модель регрессии

Давайте воспользуемся линейной регрессией для построения интуиции. Обычно мы можем использовать абсолютное значение коэффициентов признаков для обозначения важности признаков, но будьте осторожны с двумя нижеследующими пунктами.

  1. Значение функции имеет разные масштабы, нам может потребоваться стандартизировать все функции в одну шкалу (например, значение функции только в пределах от 0 до 1) для сравнения коэффициентов
  2. Стандартная ошибка коэффициента, мы знаем, что коэффициент - это оценочное среднее значение из предполагаемого нормального распределения, поэтому, если стандартная ошибка σ слишком велика, то среднее значение неточно для представления диапазона.

Обычно библиотека 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")

Важность перестановки и отбрасывания столбца

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

С другой стороны, если функция важна для прогнозирования результата, и мы изменяем или переставляем ее значение, то на прогноз результата будет оказано огромное негативное влияние.

Ниже приведены общие шаги:

  1. Учитывая обученную модель, тестовый набор данных и метрику оценки обученной модели (базовую метрику) в наборе тестов, значение функции перестановки выбирает столбец функции из набора тестов и создает случайную перестановку в этом столбце функции (перетасовывает значения этого столбца ), затем оценивает производительность обученной модели на модифицированном наборе данных.
  2. Оценка важности определяется как снижение метрики производительности по сравнению с базовой метрикой после перетасовки значений функций.
  3. Это делается итеративно для каждого столбца функций, по одному.

Падение важности столбца похоже на обратный процесс выбора функции, но с удалением только одной функции. Интуиция подсказывает, что если функция важна для прогнозирования модели, то ее удаление определенно снизит производительность модели. Шаги ниже:

  1. Даны обученная модель, обучающий набор данных, тестовый набор данных и метрика оценки обученной модели (базовая метрика) в наборе тестов.
  2. Отбросьте одну функцию из обучающего набора данных и повторно обучите модель с помощью обучающего набора данных drop-one feature, затем вычислите повторно обученные метрики производительности модели на тестовом наборе.
  3. Оценка важности определяется как уменьшение метрики производительности повторно обученной модели по сравнению с базовой метрикой.
  4. Это делается итеративно для каждого столбца функций, по одному.

Значение 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')

Резюме

Цель использования важности функции - провести глобальное сравнение предсказательной силы каждой функции.

И чтобы иметь более точную важность функции, есть два препятствия, с которыми мы всегда должны иметь дело:

  1. Функция Мультиколлинеарность: если есть сильная корреляция между функциями, важность функции, которую мы получаем с помощью вышеупомянутых методов, может быть неверной.
  2. Взаимодействие функций, мы всегда анализируем важность отдельной функции, как насчет того, чтобы в некоторых случаях отдельная функция не имела большого эффекта, но совместная работа имеет сильную предсказательную силу.

Я напишу несколько историй о двух вышеупомянутых сценариях позже, спасибо за чтение.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

  1. Интерпретируемое машинное обучение: https://christophm.github.io/interpretable-ml-book/shap.html
  2. Остерегайтесь значения случайного леса по умолчанию: https://explained.ai/rf-importance/
  3. Важность функции перестановки: https://docs.microsoft.com/en-us/archive/blogs/machinelearning/permutation-feature-importance