Интерпретируемость модели

InterpretML: еще один способ объяснить вашу модель

Обзор пакета InterpretML, который предлагает новые инструменты объяснимости наряду с существующими.

Интерпретируемость может иметь решающее значение при реализации моделей ML. Интерпретируя модели, клиенты могут завоевать доверие к модели и облегчить принятие. Это также может быть полезно при отладке вашей модели, а в некоторых ситуациях вам потребуется предоставить пояснения к предсказаниям, сгенерированным моделью. В моем предыдущем сообщении в блоге я рассказал о двух методах: LIME и SHAP, которые я использовал в одном из наших проектов в Dell.

В этом сообщении блога я представлю обзор пакета InterpretML, который содержит новую разработанную интерпретируемую модель (объяснимую повышающую машину), которая может объяснить вашу модель как в глобальном, так и в локальном контексте, наряду с существующими методами, такими как LIME, SHAP и больше с отличными визуализациями, которые могут вывести объяснения вашей модели на новый уровень.

Этот блог будет охватывать следующее:

  1. Обзор InterpretML
  2. Объяснимая бустерная машина (EBM)
  3. Примеры
  4. Краткое содержание
  5. дальнейшее чтение

1. Обзор InterpretML

InterpretML — это пакет Python с открытым исходным кодом, который содержит различные алгоритмы интерпретации, которые могут использоваться как практиками, так и исследователями. Пакет предлагает два типа методов интерпретации: стеклянный ящик и черный ящик. Методы стеклянного ящика включают в себя как интерпретируемые модели, такие как линейная регрессия, логистическая регрессия, деревья решений, которые можно обучать как часть пакета, так и соответствующие инструменты объяснимости. В то время как модели черного ящика включают только инструменты объяснимости, не зависящие от модели, такие как LIME и Kernel SHAP, которые совместимы с моделями, обученными вне пакета, модели стеклянного ящика предоставляют как глобальные, так и локальные объяснения, в то время как модели черного ящика поддерживают только локальные объяснения. Кроме того, InterpretML имеет встроенную платформу визуализации, которая позволяет пользователям легко сравнивать различные методы. Более того, поскольку InterpretML совместим с scikit-learn, гиперпараметры моделей Glassbox можно настраивать так же, как и другие модели scikit-learn. Чтобы подчеркнуть разницу, использование модели «стеклянного ящика» в вашем проекте позволит вам как обучать, так и визуализировать объяснения с помощью InterpretML, в то время как использование другой модели позволит вам только визуализировать объяснения, созданные моделью «черного ящика», после обучения модели другим пакетом. .

Наконец, пакет также включает новую интерпретируемую модель — объяснимую повышающую машину (EBM), которая была разработана исследователями Microsoft и будет обсуждаться в следующем разделе.

2. Объяснимая бустерная машина (EBM)

EBM — это модель стеклянного ящика, точность которой сопоставима с моделями машинного обучения, такими как Random Forest и Boosted Trees, а также возможности интерпретации. EBM — это обобщенная аддитивная модель (GAM), которая очень похожа на линейные модели. В линейных моделях связь между наблюдениями Y и зависимыми переменными Xi формулируется как:

Y = β0 + β1X1 + β2X2 + β3X3 + … + βnXn

в то время как в обобщенных аддитивных моделях отношение формализуется как:

Y = β0 + f(X1) + f(X2) + f(X3) + … + f(Xn)

Итак, теперь каждый вклад в предиктор представляет собой некоторую функцию f. EBM предлагает некоторые улучшения по сравнению с традиционными GAM: каждая функция функции изучается с использованием современных методов машинного обучения, таких как бэггинг и бустинг. Обучение проводится в несколько итераций, каждая из которых состоит из построения процедуры бустинга отдельно для каждого признака. Поскольку это делается с низкой скоростью обучения, порядок признаков не имеет значения. Большое количество итераций направлено на смягчение эффектов колинеарности, чтобы лучше понять, каков вклад каждой функции в прогноз модели. Кроме того, EBM может автоматически обнаруживать и включать парные условия взаимодействия, что повышает точность модели при сохранении ее объяснимости. Поскольку EBM является аддитивной моделью, вклад каждой функции можно зафиксировать и визуализировать, что повышает объяснимость.

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

3. Примеры

В качестве примера воспользуемся набором данных предсказание сердечной недостаточности от Kaggle. Набор данных содержит 12 признаков, которые можно использовать для прогнозирования смертности (DEATH_EVENT-0/1) от сердечной недостаточности. Некоторые из характеристик включают в себя: возраст, пол, наличие у пациента анемии/диабета/высокого кровяного давления и многое другое.
Мы рассмотрим следующие модели и соответствующие объяснения, созданные InterpretML:

  1. ЭБМ (стеклянный ящик)

2. Логистическая регрессия (стеклянный ящик)

3. LightGBM с использованием Lime и SHAP (черный ящик)

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

Прежде чем приступить к примерам, важно отметить, что, в отличие от реализаций LIME и SHAP, для задач классификации с EBM/логистической регрессией вклад признаков выражается в виде логарифмических шансов, а не вероятностей. Фактически, как и в логистической регрессии, для получения вероятности логарифмические шансы передаются через функцию логит-ссылки. Очки отображаются в аддитивном логарифмическом пространстве шансов, потому что это позволяет честно сравнивать вклад каждой функции. Это связано с нелинейностью логарифмических шансов и вероятности. Посмотрите эту проблему GitHub для получения дополнительной информации.

После этого я поделюсь некоторыми примерами того, что еще вы можете сделать с InterpretML, кроме того, что это объяснимо.

ДМ

Начнем с глобального объяснения.

ebm_global = trained_ebm.explain_global()
show(ebm_global)

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

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

Как упоминалось ранее, вы можете изучить каждую функцию по отдельности и посмотреть, как значение функции влияет на оценку. Вы также заметите серую разметку, это планки погрешностей. Это оценки неопределенности модели в определенных областях объекта. Чем шире полоса, тем сильнее влияние небольших изменений в обучающих данных. Исходя из этого, к интерпретации этих точек данных следует подходить с осторожностью. Вы можете получить доступ к размерам полосы ошибок с помощью следующего кода:

trained_ebm.term_standard_deviations_[4]

Это даст нам стандартные отклонения четвертого признака в данных.

Теперь давайте посмотрим на местное объяснение. Вы можете исследовать несколько наблюдений вместе, используя следующий код:

ebm_local = trained_ebm.explain_local(X_test[10:15], y_test[10:15])
show(ebm_local)

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

Логистическая регрессия

Начнем с глобального объяснения:

lr_global = trained_lr.explain_global()
show(lr_global)

Здесь, в отличие от EBM, глобальное объяснение дает не только величину, но и знак. Как и раньше, вы также можете изучить каждую функцию отдельно.

Теперь давайте рассмотрим местные объяснения:

Теперь вы можете сравнить локальные объяснения, предоставленные моделью EBM, с локальными объяснениями, предоставленными моделью логистической регрессии.
Основываясь на своих знаниях или с помощью экспертов в предметной области, вы можете решить, какое из них лучше подходит.

LightGBM с использованием LIME и SHAP

В зависимости от данных вы можете использовать модель, отличную от EBM или логистической регрессии. Одной из таких причин может быть наличие пропущенных значений в данных — в то время как LightGBM может обрабатывать пропущенные значения, другие модели могут потребовать заполнения пропущенных значений до обучения.

В отличие от ранее представленных методов, используя пакет InterpretML, вы не можете генерировать глобальные объяснения для модели, отличной от «стеклянного ящика». Однако прямое использование SHAP позволит вам сделать это. Еще один важный момент, который следует отметить, заключается в том, что использование SHAP через InterpretML предоставляет только KernalSHAP, который не зависит от модели. Использование SHAP напрямую предлагает дополнительные объяснения, такие как: TreeSHAP и DeepSHAP.

мы начнем с изучения SHAP:

from interpret.blackbox import ShapKernel
shap = ShapKernel(predict_fn=trained_LGBM.predict_proba, data=X_train)
shap_local = shap.explain_local(X_test[10:15], y_test[10:15])
show(shap_local)

Теперь давайте посмотрим на LIME:

lime = LimeTabular(predict_fn=trained_LGBM.predict_proba, data=X_train)
lime_local = lime.explain_local(X_test[10:15], y_test[10:15])
show(lime_local)

Как видите, локальные пояснения как для моделей стеклянного ящика, так и для моделей черного ящика имеют одинаковый формат.

Обратите внимание, что если у вас есть категориальные признаки в данных, которые были закодированы одним горячим кодированием, результаты могут быть не совсем надежными. Это связано с тем, что LIME создает объяснения путем перестановки данных. Если функции являются одним горячим кодированием, LIME не может знать, какие столбцы являются частью одной и той же исходной функции, и в результате создает точку данных, которая не согласуется с исходными данными.

Чтобы узнать больше о SHAP, LIME и о том, как работать с категориальными данными, ознакомьтесь с моим предыдущим сообщением в блоге.

InterpretML не поддается объяснению

InterpretML можно использовать для выполнения EDA с данными, пакет предлагает некоторые базовые возможности EDA с использованием plotly.

from interpret import show
from interpret.provider import InlineProvider
from interpret import set_visualize_provider
set_visualize_provider(InlineProvider())
from interpret.data import ClassHistogram
hist = ClassHistogram().explain_data(X_train, y_train, name="Train Data")
show(hist)

Вы также можете выполнить гиперметрическую настройку моделей в пакете. Здесь в качестве примера я использовал RandomizedSearchCV с 3-кратной перекрестной проверкой.

from interpret.glassbox import ExplainableBoostingClassifier
from sklearn.model_selection import RandomizedSearchCV
param_test = {'learning_rate': [0.001,0.005,0.01,0.03],
              'interactions': [5,10,15],
              'max_interaction_bins': [10,15,20],
              'max_rounds': [5000,10000,15000,20000],
              'min_samples_leaf': [2,3,5],
              'max_leaves': [3,5,10]}
n_HP_points_to_test=10
LGBM_clf = LGBMClassifier(random_state=314, n_jobs=-1)
LGBM_gs = RandomizedSearchCV(
    estimator=LGBM_clf,
    param_distributions=param_test,
    n_iter=n_HP_points_to_test,
    scoring="roc_auc",
    cv=3,
    refit=True,
    random_state=314,
    verbose=False,
)
LGBM_gs.fit(X_train, y_train)

Вы можете использовать следующий код для дальнейшего сравнения результатов, построив кривые ROC для каждой модели:

from interpret import perf
roc = perf.ROC(gs.best_estimator_.predict_proba, feature_names=X_train.columns)
roc_explanation = roc.explain_perf(X_test, y_test)
show(roc_explanation)

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

show([hist, ebm_global, lr_global], share_tables=True)

Вы должны знать, что это не поддерживается, если вы используете облачную среду.

4. Резюме

InterpretML предлагает различные методы объяснимости под одной крышей. Он также предлагает инструменты EDA и отличные визуализации для лучшего понимания результатов, а также для сравнения различных методов. Его определенно следует рассматривать как возможный инструмент объяснения вашей модели. Страница GitHub пакета (в частности, вкладка Проблемы) была чрезвычайно полезной и помогла мне глубже понять пакет во время исследования и написания этого сообщения в блоге.

5. Дополнительная литература

Вот несколько дополнительных рекомендаций по чтению и просмотру:

1- Документация InterpretML

2- Гитхаб-страница

3- Видео You Tube- Наука, стоящая за InterpretML: объяснимая повышающая машина

4- Бумага- InterpretML: унифицированная структура для машинного обучения интерпретируемости

Особая благодарность Ору Херману-Саффару и Рэйчел Шалом за рецензирование и предоставление ценных отзывов об этом сообщении в блоге.