Глубокое погружение в LIME, ценности Shapely и SHAP

Вас беспокоит платный доступ? Нажмите здесь, чтобы обойти его.

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

5. Локальные интерпретируемые объяснения, не зависящие от модели (LIME)

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

LIME[2] использует для объяснения локальную суррогатную модель, обученную возмущениям точки данных, которую мы исследуем. Это гарантирует, что даже если объяснение не имеет глобальной точности (верности исходной модели), оно имеет локальную точность. В документе [2] также признается, что существует компромисс между интерпретируемостью и точностью, и предлагается формальная структура для выражения этой структуры.

ξ(x) — объяснение, L(f, g, πₓ) — обратное значение локальной точности (или насколько неверно g в аппроксимации f в данной местности), а Ω(g) — сложность локальной модели, g. Чтобы обеспечить как локальную достоверность, так и интерпретируемость, нам необходимо свести к минимуму недостоверность (или максимизировать локальную точность), помня о том, что сложность должна быть достаточно низкой, чтобы люди могли ее понять.

Несмотря на то, что мы можем использовать любую интерпретируемую модель в качестве локального суррогата, в статье используется регрессия Лассо, чтобы вызвать разреженность объяснений. Авторы статьи ограничили свои исследования точностью модели и сохранили сложность в качестве пользовательского ввода. В случае регрессии Лассо это количество признаков, которым следует приписать объяснение.

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

Преимущества этого метода:

  • И методология, и объяснения очень интуитивно понятны человеку.
  • Сгенерированные объяснения скудны, что повышает интерпретируемость.
  • Модель-агностик
  • LIME работает как со структурированными, так и с неструктурированными данными (текст, изображения).
  • Доступно в R и Python (оригинальная реализация авторов статьи)
  • Возможность использовать другие интерпретируемые функции, даже если модель обучена сложным функциям, таким как встраивание и тому подобное. Например, регрессионная модель может быть обучена на нескольких компонентах PCA, но объяснения могут быть сгенерированы на исходных функциях, понятных человеку.

Алгоритм

  • Чтобы найти объяснение для одной точки данных и данного классификатора
  • Равномерно и случайным образом произведите выборку местности вокруг выбранной отдельной точки данных и сгенерируйте набор данных возмущенных точек данных с соответствующим прогнозом из модели, которую мы хотим объяснить.
  • Используйте указанную методологию выбора функций, чтобы выбрать количество функций, необходимых для объяснения.
  • Вычислите выборочные веса с помощью функции ядра и функции расстояния. (это фиксирует, насколько близко или как далеко точки выборки от исходной точки)
  • Соответствуйте интерпретируемой модели на возмущенном наборе данных с помощью выборочных весов, чтобы взвесить целевую функцию.
  • Предоставляйте локальные объяснения, используя недавно обученную интерпретируемую модель

Выполнение

Реализация авторов статьи доступна на Github, а также установочный пакет в pip. Прежде чем мы рассмотрим, как мы будем их реализовывать, давайте обсудим несколько особенностей реализации, которые вы должны знать, прежде чем работать с ней (сосредоточьтесь на табличном объяснении).

Основные шаги следующие

  • Инициализируйте TabularExplainer, предоставив данные, на которых он был обучен (или статистику данных обучения, если данные обучения недоступны), некоторые сведения о функциях и именах классов (в случае классификации).
  • Вызовите метод в классе explain_instance и укажите экземпляр, для которого вам нужно объяснение, метод предсказания вашей обученной модели и количество функций, которые необходимо включить в объяснение.

Ключевые вещи, которые вы должны иметь в виду:

  • По умолчанию режим — классификация. Поэтому, если вы пытаетесь объяснить проблему регрессии, обязательно упомяните об этом.
  • По умолчанию выбор функции установлен на авто. 'auto' выбирает между выбором вперед и наивысшими весами в зависимости от количества признаков в обучающих данных (если их меньше 6, выбор вперед. Наивысшие веса просто подгоняет гребневую регрессию к масштабированным данным и выбирает n самых высоких весов. Если вы укажете none в качестве параметра выбора объекта, выбор объекта не будет выполняться. А если вы передадите lasso_path как выбор функции, он использует из sklearn, чтобы найти регуляризацию правильного уровня, которая предоставляет n ненулевые функции.
  • По умолчанию в качестве интерпретируемой модели используется гребневая регрессия. Но вы можете передать любую модель обучения из научного набора, если она имеет параметры coef_ и «sample_weight».
  • Есть два других ключевых параметра, kernel и kernel_width, которые определяют способ расчета весов выборки, а также ограничивают локальность, в которой может произойти возмущение. Они сохраняются как гиперпараметры в алгоритме. Хотя в большинстве случаев подойдут значения по умолчанию.
  • По умолчанию для параметра discretize_continuous установлено значение True. Это означает, что непрерывные функции дискретизируются либо до квартилей, либо до децилей, либо на основе энтропии. Значением по умолчанию для discretizer является квартиль.

Теперь давайте продолжим работу с тем же набором данных, с которым мы работали в предыдущей части, и посмотрим на LIME в действии.

import lime import lime.lime_tabular 
# Creating the Lime Explainer 
# Be very careful in setting the order of the class names lime_explainer = lime.lime_tabular.LimeTabularExplainer( X_train.values, training_labels=y_train.values, feature_names=X_train.columns.tolist(), feature_selection="lasso_path", class_names=["<50k", ">50k"], discretize_continuous=True, discretizer="entropy", )
#Now let's pick a sample case from our test set. 
row = 345

exp = lime_explainer.explain_instance(X_test.iloc[row], rf.predict_proba, num_features=5) exp.show_in_notebook(show_table=True)

Для разнообразия рассмотрим еще один пример. Тот, который модель неправильно классифицировала.

Интерпретация

Пример 1

  • Первый пример, который мы рассмотрели, — 50-летний женатый мужчина со степенью бакалавра. Он работает в частной фирме на руководящей/управляющей должности 40 часов в неделю. Наша модель справедливо классифицировала его как зарабатывающего более 50 тысяч.
  • Прогноз как таковой имеет смысл в нашей ментальной модели. Кто-то, кому 50 лет и кто работает на руководящей должности, имеет очень высокую вероятность заработать более 50 тысяч.
  • Если мы посмотрим, как модель приняла это решение, мы увидим, что оно связано с его семейным положением, возрастом, образованием и тем фактом, что он занимает руководящую/управленческую должность. Тот факт, что его профессия не является профессиональной, пытался снизить его вероятность, но в целом модель решила, что весьма вероятно, что этот человек зарабатывает более 50 тысяч.

Пример 2

  • Второй пример, который у нас есть, это 57-летний женатый мужчина с высшим образованием. Он самозанятый человек, работающий в сфере продаж, и он работает всего 30 часов в неделю.
  • Даже в нашей ментальной модели нам немного сложно предсказать, зарабатывает такой человек больше 50 тысяч или нет. И модель пошла дальше и предсказала, что этот человек зарабатывает меньше 50 тысяч, тогда как на самом деле он зарабатывает больше.
  • Если мы посмотрим, как модель приняла это решение, мы увидим, что в локальности прогноза существует сильный эффект «тяни-толкай». С одной стороны, его семейное положение и возраст подталкивают его к ведру выше 50 тысяч. А с другой стороны, тот факт, что он не является руководителем/менеджером, его образование и количество часов в неделю работают на то, чтобы сбить его с толку. И, в конце концов, нисходящий толчок выиграл игру, и модель предсказала, что его доход будет ниже 50 тысяч.

Субмодульный выбор и глобальные объяснения

Как упоминалось ранее, в статье упоминается еще один метод под названием «субмодульный выбор» для поиска нескольких объяснений, которые пытаются объяснить большинство случаев. Попробуем получить и это. Эта конкретная часть библиотеки Python не так стабильна, и предоставленные примеры блокнотов выдавали мне ошибки. Но потратив некоторое время на чтение исходного кода, я нашел выход из ошибок.

from lime import submodular_pick 
sp_obj = submodular_pick.SubmodularPick(lime_explainer, X_train.values, rf.predict_proba, sample_size=500, num_features=10, num_exps_desired=5) 
#Plot the 5 explanations [exp.as_pyplot_figure(label=exp.available_labels()[0]) for exp in sp_obj.sp_explanations]; 
# Make it into a dataframe W_pick=pd.DataFrame([dict(this.as_list(this.available_labels()[0])) for this in sp_obj.sp_explanations]).fillna(0) 
W_pick['prediction'] = [this.available_labels()[0] for this in sp_obj.sp_explanations] 
#Making a dataframe of all the explanations of sampled points W=pd.DataFrame([dict(this.as_list(this.available_labels()[0])) for this in sp_obj.explanations]).fillna(0) 
W['prediction'] = [this.available_labels()[0] for this in sp_obj.explanations] 
#Plotting the aggregate importances 
np.abs(W.drop("prediction", axis=1)).mean(axis=0).sort_values(ascending=False).head( 25 ).sort_values(ascending=True).iplot(kind="barh") 
#Aggregate importances split by classes 
grped_coeff = W.groupby("prediction").mean() 
grped_coeff = grped_coeff.T 
grped_coeff["abs"] = np.abs(grped_coeff.iloc[:, 0]) grped_coeff.sort_values("abs", inplace=True, ascending=False) grped_coeff.head(25).sort_values("abs", ascending=True).drop("abs", axis=1).iplot( kind="barh", bargap=0.5 )

Интерпретация

Есть две диаграммы, на которых мы объединили объяснения по 500 точкам, которые мы выбрали из нашего тестового набора (мы можем запустить его для всех точек тестовых данных, но выбрали выборку только для вычисления).

Первая диаграмма агрегирует эффект функции для случаев >50 000 и ‹50 000 и игнорирует знак при вычислении среднего значения. Это дает вам представление о том, какие функции были важны в более широком смысле.

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

  • В самом верху первой диаграммы мы можем найти «семейное_статус › 0,5». Согласно нашей кодировке, это означает одиночный. Таким образом, одиночество является очень сильным показателем того, получаете ли вы больше или меньше 50 тысяч. Но подождите, замужество стоит на втором месте в списке. Как это нам поможет?
  • Если посмотреть на второй график, то картина более ясна. Вы можете сразу увидеть, что, будучи одиноким, вы попадаете в корзину на 50 000 фунтов стерлингов, а будучи женатым — на корзину на 50 000 фунтов стерлингов.
  • Прежде чем броситься искать партнера, имейте в виду, что именно его модель использует для поиска. Это не обязательно должно быть причиной в реальном мире. Может быть, модель улавливает какую-то другую черту, которая во многом связана с вступлением в брак, чтобы предсказать потенциальный доход.
  • Здесь мы также можем наблюдать оттенки дискриминации по половому признаку. если вы посмотрите на «пол> 0,5», то есть на мужчину, распределение между двумя классами потенциального заработка почти равное. Но только взгляните на «пол‹0,5». Он показывает большой перекос в сторону сегмента ‹50 тыс.

Наряду с этим субмодуль также выбирает (фактически это основная цель модуля) набор из n точек данных из набора данных, который лучше всего объясняет модель. Мы можем рассматривать это как репрезентативную выборку различных случаев в наборе данных. Поэтому, если нам нужно объяснить кому-то несколько случаев из модели, это дает вам те случаи, которые охватывают большую часть информации.

Джокер в стае

Судя по всему, это очень хорошая техника, не так ли? Но не без проблем.

Самая большая проблема здесь — правильное определение окрестности, особенно в табличных данных. Для изображений и текста это более просто. Поскольку авторы статьи оставили ширину ядра в качестве гиперпараметра, выбор правильного остается за пользователем. Но как настроить параметр, если у вас нет достоверной информации? Вам просто нужно попробовать разные ширины, посмотреть объяснения и посмотреть, имеет ли это смысл. Настройте их снова. Но в какой момент мы пересекаем черту, чтобы настроить параметры, чтобы получить нужные нам объяснения?

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

И, наконец, выбор линейной интерпретируемой модели для локальных объяснений может быть справедлив не для всех случаев. Если граница решения слишком нелинейна, линейная модель может плохо ее объяснить (локальная точность может быть высокой).

6. Стройные ценности

Прежде чем мы обсудим, как Shapely Values ​​можно использовать для объяснения модели машинного обучения, давайте попробуем понять, что они из себя представляют. А для этого нам нужно сделать небольшой экскурс в теорию игр.

Теория игр — одна из самых увлекательных областей математики, которая занимается математическими моделями стратегического взаимодействия между рациональными лицами, принимающими решения. Когда мы говорим «игра», мы имеем в виду не только шахматы или, если уж на то пошло, монополию. Игра может быть обобщена на любую ситуацию, когда два или более игрока/стороны участвуют в решении или серии решений, направленных на улучшение своего положения. Когда вы смотрите на это таким образом, его применение распространяется на военные стратегии, экономические стратегии, игру в покер, стратегии ценообразования, переговоры и контракты, список бесконечен.

Но поскольку наша тема не Теория игр, мы просто рассмотрим некоторые основные термины, чтобы вы могли следить за обсуждением. Стороны, участвующие в Игре, называются Игроки. Различные действия, которые могут предпринять эти игроки, называются выборами. Если существует конечное множество вариантов выбора для каждого игрока, то существует также конечное множество комбинаций вариантов выбора каждого игрока. Таким образом, если каждый игрок делает выбор, это приводит к результату, и если мы определяем эти результаты количественно, это называется выигрышем. И если мы перечислим все комбинации и выплаты, связанные с ними, это называется матрица выплат.

В теории игр есть две парадигмы — некооперативные и кооперативные игры. А ценности Shapely — важная концепция в кооперативных играх. Попробуем разобраться на примере.

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

Теперь с этой информацией проведем небольшой мысленный эксперимент. Предположим, что А идет в ресторан, затем появляется В и С. Таким образом, для каждого человека, который присоединяется, мы можем получить дополнительные деньги (маржинальный вклад), который каждый человек должен внести. Мы начинаем с 80 (это то, что А заплатил бы, если бы он ел один). Теперь, когда присоединился B, мы смотрим на выигрыш, когда A и B ели вместе — тоже 80. Таким образом, дополнительный вклад B, внесенный в коалицию, равен 0. А когда C присоединился, общий выигрыш равен 90. Таким образом, предельный вклад C 10. Таким образом, вклад при соединении A, B, C в указанном порядке равен (80,0,10). Теперь повторим этот эксперимент для всех комбинаций трех друзей.

Теперь, когда у нас есть все возможные порядки прибытия, у нас есть предельные вклады всех игроков во всех ситуациях. А ожидаемый предельный вклад каждого игрока — это среднее значение их предельного вклада по всем комбинациям. Например. предельный вклад A составит (80+80+56+16+5+70)/6 = 51,17. И если мы посчитаем ожидаемые предельные вклады каждого из игроков и сложим их вместе, мы получим 90 — это общий выигрыш, если все трое ели вместе.

Вам должно быть интересно, какое отношение все это имеет к машинному обучению и интерпретируемости. Много. Если задуматься, прогноз машинного обучения похож на игру, в которой различные функции (игроки) играют вместе, чтобы получить результат (прогноз). сильный>). И поскольку функции работают вместе, взаимодействуя между собой, чтобы сделать прогноз, это становится случаем кооперативных игр. Это прямо на переулке Shapely Values.

Но есть только одна проблема. Расчет всех возможных коалиций и их результатов быстро становится невозможным по мере увеличения характеристик. Поэтому в 2013 году Эрик Штрумбель и др. предложил аппроксимацию с использованием выборки Монте-Карло. И в этой конструкции выигрыш моделируется как разница в прогнозах разных выборок Монте-Карло от среднего прогноза.

где f — модель машинного обучения «черный ящик», которую мы пытаемся объяснить, x — экземпляр, который мы пытаемся объяснить, j — функция, для которой мы пытаемся найти ожидаемый предельный вклад, xᵐ₋ⱼ и xᵐ₊ⱼ — это два экземпляра x, которые мы случайным образом переставили, выбрав другую точку из самого набора данных, и M — количество выборок, которые мы извлекаем из обучающей выборки.

Давайте рассмотрим несколько желаемых математических свойств значений Shapely, которые делают их очень желательными в приложении для интерпретируемости. Shapely Values ​​— единственный метод атрибуции, который удовлетворяет свойствам эффективности, симметрии, фиктивности и аддитивности. И удовлетворение их вместе считается определением справедливой выплаты.

  • Эффективность. Вклады функций складываются в разницу в прогнозе для x и среднего значения.
  • Симметрия. Вклады двух значений признаков должны быть одинаковыми, если они в равной степени вносят вклад во все возможные коалиции.
  • Dummy — функция, которая не меняет прогнозируемое значение, независимо от того, к какой коалиции она была добавлена, должна иметь значение Shapely, равное 0.
  • Аддитивность — для игры с комбинированными выплатами соответствующие значения Shapely можно сложить вместе, чтобы получить окончательное значение Shapely.

Хотя все свойства делают этот способ атрибуции характеристик желательным, одно, в частности, имеет далеко идущий эффект — аддитивность. Это означает, что для модели ансамбля, такой как RandomForest или Gradient Boosting, это свойство гарантирует, что если мы вычислим значения Shapely признаков для каждого дерева отдельно и усредним их, вы получите значения Shapely для ансамбля. Это свойство может быть распространено на другие методы ансамбля, такие как наложение моделей или усреднение моделей.

Мы не будем рассматривать алгоритм и рассматривать реализацию Shapely Values ​​по двум причинам:

  • В большинстве реальных приложений невозможно рассчитать Shapely Values ​​даже с приближением.
  • Существует лучший способ вычисления Shapely Values ​​вместе со стабильной библиотекой, которую мы рассмотрим далее.

7. Shapely Additive Explanations (SHAP)

SHAP (Shapely Additive exPlanations) предлагает единый подход к интерпретации предсказаний модели. Скотт Лундберг et.al предлагает структуру, которая объединяет шесть ранее существовавших методов атрибуции признаков (включая LIME и DeepLIFT), и они представляют свою структуру как аддитивную модель атрибуции признаков.

Они показывают, что каждый из этих методов можно сформулировать в виде приведенного выше уравнения, а значения Shapely можно легко рассчитать, что дает несколько гарантий. Несмотря на то, что в документе упоминаются несколько иные свойства, чем Shapely Values, в принципе они одинаковы. Это обеспечивает прочную теоретическую основу для методов (таких как LIME), когда-то адаптированных к этой структуре оценки значений Shapely. В статье авторы предложили новый независимый от модели способ аппроксимации значений Shapely, называемый Kernel SHAP (LIME + Shapely Values), и некоторые методы, специфичные для модели, такие как DeepSHAP (который является адаптацией DeepLIFT, метода для оценки важности функций). для нейронных сетей). В дополнение к этому они также показали, что для линейных моделей значения Shapely могут быть аппроксимированы непосредственно из весовых коэффициентов модели, если мы предполагаем независимость признаков. А в 2018 году Скотт Лундберг et.al[6] предложил еще одно расширение фреймворка, которое точно вычисляет значения Shapely для ансамблей на основе деревьев, таких как RandomForest или Gradient Boosting.

Ядро ШАП

Несмотря на то, что это не очень интуитивно понятно из приведенного ниже уравнения, LIME также является методом аддитивной атрибуции признаков. А для аддитивного метода объяснения признаков Скотт Лундберг et.al показал, что единственным решением, которое удовлетворяет желаемым свойствам, являются Shapely Values. И это решение зависит от функции потерь L, весового ядра πₓ и члена регуляризации Ω.

Если вы помните, когда мы обсуждали LIME, я упомянул, что одним из недостатков является то, что он оставил функцию ядра и расстояние до ядра в качестве гиперпараметров, и они выбираются с помощью эвристики. Kernel SHAP устраняет эту неопределенность, предлагая Shapely Kernel и соответствующую функцию потерь, которая гарантирует, что решение приведенного выше уравнения приведет к значениям Shapely, и наряду с этим пользуется математическими гарантиями.

Алгоритм

  • Образец вектора коалиции (вектор коалиции — это вектор двоичных значений той же длины, что и количество признаков, что указывает на то, включен ли конкретный признак в коалицию или нет. z'ₖ ϵ { 0,1}ₘ, k ϵ {1, …, K} (1 = функция присутствует, 0 = функция отсутствует)
  • Получите прогнозы модели для вектора коалиции z’ₖ, преобразовав вектор коалиции в исходное пространство выборки с помощью функции hₓ. hₓ — это просто причудливый способ сказать, что мы используем один набор преобразований для получения соответствующего значения из исходных входных данных. Например, для всех единиц в векторе коалиции мы заменяем его фактическим значением этого признака из экземпляра, который мы объясняем. А для 0 это немного отличается в зависимости от приложения. Для табличных данных 0 заменяются некоторым другим значением того же признака, выбранным случайным образом из данных. Для данных изображения 0 можно заменить эталонным значением или нулевым значением пикселя. Рисунок ниже пытается сделать этот процесс понятным для табличных данных.
  • Вычислить вес образца с помощью Shapely Kernel
  • Повторите это для K образцов
  • Теперь подберите взвешенную линейную модель и верните значения Shapely, коэффициенты модели.

Дерево ШАП

Tree SHAP, как упоминалось ранее [6], представляет собой быстрый алгоритм, который вычисляет точные значения Shapely для моделей на основе дерева решений. Для сравнения, Kernel SHAP лишь приблизительно соответствует значениям Shapely и намного дороже в вычислении.

Алгоритм

Давайте попробуем получить некоторое представление о том, как он рассчитывается, не вдаваясь в математику (те из вас, кто склонен к математике, ссылка на статью есть в ссылках, получайте удовольствие!).

Сначала мы поговорим о том, как алгоритм работает для одного дерева. Если вы помните дискуссию о значениях Shapely, вы помните, что для точного расчета нам нужны прогнозы, основанные на всех подмножествах вектора признаков экземпляра. Итак, пусть вектор признаков экземпляра, который мы пытаемся объяснить, равен x, а подмножество признаков, для которого нам нужен ожидаемый прогноз, будет S.

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

  • Если мы обусловливаем все функции, т. е. S — это набор всех функций, то прогноз в узле, в который попадает x, является ожидаемым прогнозом. то есть › 50 тыс.
  • Если мы не обусловливаем никакие функции, равновероятно (игнорируя распределение точек по узлам), что вы окажетесь в любом из узлов принятия решений. И, следовательно, ожидаемый прогноз будет представлять собой средневзвешенное значение прогнозов всех конечных узлов. В нашем примере есть 3 узла, которые выводят 1 (‹50k), и три узла, которые выводят 0 (>50k). Если мы предположим, что все точки обучающих данных были равномерно распределены по этим узлам, ожидаемый прогноз при отсутствии всех признаков равен 0,5.
  • Если мы обусловливаем некоторые функции S, мы вычисляем ожидаемое значение для узлов, которые с равной вероятностью для экземпляра x окажутся в конце. Например, если мы исключим семейное_статус из набора S экземпляр с одинаковой вероятностью окажется в узле 5 или узле 6. Таким образом, ожидаемый прогноз для такого S будет средневзвешенным значением выходные данные узлов 5 и 6. Итак, если мы исключим hours_worked из S, будут ли какие-либо изменения в ожидаемых прогнозах? Нет, потому что hours_worked не входит в путь принятия решения для экземпляра x.
  • Если мы исключаем функцию, которая находится в корне дерева, например age, она создаст несколько поддеревьев. В этом случае у него будет два дерева: одно начинается с блока женат справа, а другое начинается с блока отработано_часов слева. Также будет заглушка решения с узлом 4. И теперь экземпляр x распространяется вниз по обоим деревьям (исключая путь принятия решения с age), и ожидаемый прогноз рассчитывается как средневзвешенное значение всех вероятных узлов (узлы 3, 4 и 5).

И теперь, когда у вас есть ожидаемые прогнозы для всех подмножеств в одном дереве решений, вы повторяете это для всех деревьев в ансамбле. А помните свойство аддитивность значений Shapely? Он позволяет агрегировать их по деревьям в ансамбле путем вычисления среднего значения Shapely по всем деревьям.

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

Преимущества

  • SHAP и Shapely Values ​​опираются на прочную теоретическую основу теории игр. А значения Shapely гарантируют, что прогноз справедливо распределяется по различным функциям. Возможно, это единственный метод атрибуции признаков, который выдержит натиск теоретических и практических исследований, будь то академические или нормативные.
  • SHAP связывает другие методы интерпретации, такие как LIME и DeepLIFT, с прочной теоретической основой теории игр.
  • SHAP имеет молниеносную реализацию моделей на основе дерева, которые являются одним из самых популярных наборов методов в машинном обучении.
  • SHAP также можно использовать для глобальной интерпретации путем вычисления значений Shapely для всего набора данных и их агрегирования. Он обеспечивает прочную связь между вашей локальной и глобальной интерпретацией. Если вы используете LIME или SHAP для локального объяснения, а затем полагаетесь на графики PDP для их глобального объяснения, на самом деле это не сработает, и вы можете получить противоречивые выводы.

Реализация (местное объяснение)

В этом разделе мы будем рассматривать TreeSHAP только по двум причинам:

  1. Мы просматривали структурные данные на протяжении всей серии блогов, и модель, которую мы выбрали для запуска методов объяснимости, — это RandomForest, который представляет собой ансамбль на основе дерева.
  2. TreeSHAP и KernelSHAP имеют практически одинаковый интерфейс в реализации, и должно быть довольно просто заменить TreeSHAP на KernelSHAP (за счет вычислений), если вы пытаетесь объяснить SVM или какую-либо другую модель, которая не основана на дереве.
import shap 
# load JS visualization code to notebook 
shap.initjs() 
explainer = shap.TreeExplainer(model = rf, model_output='margin') shap_values = explainer.shap_values(X_test)

Эти строки кода вычисляют значения Shapely. Несмотря на то, что алгоритм быстрый, это все равно займет некоторое время.

  • В случае классификации shap_values будет списком массивов, а длина списка будет равна количеству классов.
  • То же самое и с explainer.expected_value.
  • Итак, мы должны выбрать, какую метку мы пытаемся объяснить, и использовать соответствующие shap_value и expected_value на дальнейших графиках. В зависимости от прогноза экземпляра мы можем выбрать соответствующие значения SHAP и построить их график.
  • В случае регрессии shap_values ​​вернет только один элемент.

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

shap.force_plot( base_value=explainer.expected_value[1], shap_values=shap_values[1][row], features=X_test.iloc[row], feature_names=X_test.columns, link="identity", out_names=">50k", ) 
# We provide new_base_value as the cutoff probability for the classification mode 
# This is done to increase the interpretability of the plot shap.decision_plot( base_value=explainer.expected_value[1], shap_values=shap_values[1][row], features=X_test.iloc[row], feature_names=X_test.columns.tolist(), link="identity", new_base_value=0.5, )

Теперь проверим второй пример.

Интерпретация

Пример 1

  • Подобно LIME, SHAP также приписывает большое влияние на семейное_статус, возраст, education_num и т. д.
  • На силовом графике показано, как различные функции подталкивают и извлекают вывод, чтобы переместить его из base_value в прогноз. Прогноз здесь — это вероятность или вероятность того, что человек заработает >50 тысяч (потому что это прогноз для экземпляра).
  • На силовом графике вы можете видеть, что семейное_статус, образование_номер и т. д. с левой стороны приближают прогноз к 1, а число часов в неделю — в другом направлении. Мы можем видеть, что из базового значения 0,24 функции толкались и тянулись, чтобы довести результат до 0,8.
  • В сюжете решения картина немного более ясна. У вас есть много функций, таких как функции профессии и другие, которые снижают выходные данные модели, но сильное влияние от возраста, оккупации_Exec-managerial, education_num и семейного_статуса сдвинуло стрелку до 0,8.
  • Эти объяснения соответствуют нашей ментальной модели процесса.

Пример 2

  • Это тот случай, когда мы неправильно классифицировали. И здесь прогноз, который мы объясняем, заключается в том, что человек заработал 50 тысяч фунтов стерлингов, тогда как на самом деле он зарабатывает 50 тысяч фунтов стерлингов.
  • График силы показывает равное соответствие между обеими сторонами, но модель в конечном итоге сошлась на 0,6. Образование, отработанные часы и тот факт, что этот человек не занимает руководящую должность, — все это пыталось увеличить вероятность заработка ‹ 50 000, потому что они были ниже среднего, в то время как семейное положение, тот факт, что он работает не по найму, и его возраст, пытался уменьшить вероятность.
  • Как видите, еще одним фактором, способствующим этому, являются базовые значения (или априорные значения). Модель начинается с априорного значения, которое смещено в сторону ‹=50k, потому что в обучающих данных это вероятность, наблюдаемая моделью. Таким образом, функции должны работать очень усердно, чтобы модель поверила, что человек зарабатывает 50 тысяч.
  • Это становится более ясным, если вы сравните графики решений двух примеров. Во втором примере вы можете увидеть сильный зигзагообразный паттерн в конце, где несколько сильных влиятельных лиц толкают и тянут, что приводит к меньшему отклонению от предыдущего убеждения.

Реализация (глобальные пояснения)

Библиотека SHAP также предоставляет простые способы агрегирования и построения графиков значений Shapely для набора точек (в нашем случае тестового набора), чтобы получить глобальное объяснение модели.

#Summary Plot as a bar chart 
shap.summary_plot(shap_values = shap_values[1], features = X_test, max_display=20, plot_type='bar') 
#Summary Plot as a dot chart 
shap.summary_plot(shap_values = shap_values[1], features = X_test, max_display=20, plot_type='dot') 
#Dependence Plots (analogous to PDP) 
# create a SHAP dependence plot to show the effect of a single feature across the whole dataset shap.dependence_plot("education_num", shap_values=shap_values[1], features=X_test) 
shap.dependence_plot("age", shap_values=shap_values[1], features=X_test)

Интерпретация

  • В бинарной классификации вы можете построить любое из двух значений SHAP, которые вы получаете для интерпретации модели. Мы выбрали ›50k для интерпретации, потому что просто более интуитивно думать о модели таким образом.
  • В сводной сводке мы видим обычных подозреваемых в верхней части списка.
  • Примечание: мы можем предоставить список shap_values ​​(многоклассовая классификация) для метода summary_plot, если мы укажем plot_type = 'бар'. Он отобразит суммарные значения SHAP для каждого класса в виде гистограммы с накоплением. Для бинарной классификации я обнаружил, что это гораздо менее интуитивно понятно, чем просто построение графика одного из классов.
  • Точечная диаграмма гораздо интереснее, так как раскрывает гораздо больше информации, чем гистограмма. Помимо общей важности, он также показывает, как значение признака влияет на результат модели. Например. мы можем ясно видеть, что семейное_статус оказывает сильное положительное влияние (скорее всего >50 000), когда значение признака низкое. И мы знаем из кодировки нашей метки, что marital_status = 0 означает женат, а 1 означает холост. Таким образом, женатость увеличивает ваши шансы заработать ›50 тысяч.
  • Примечание. Мы не можем использовать список значений формы при использовании plot_type= ‘dot. Вам нужно будет построить несколько диаграмм, чтобы понять каждый класс, который вы прогнозируете.
  • Точно так же, если вы посмотрите на возраст, вы увидите, что низкая ценность функции почти всегда снижает ваши шансы на заработок ›50 000. Но когда значение признака велико (т. е. вы старше), возникает смешанный набор точек, который говорит нам о множестве эффектов взаимодействия с другими признаками при принятии решения о модели.
  • Вот тут-то и появляются графики зависимости. Идея очень похожа на графики PD, которые мы рассмотрели в последней записи блога. Но вместо частичной зависимости мы используем значения SHAP для построения зависимости. Интерпретация остается аналогичной с небольшими изменениями.
  • По оси X это значение функции, а по оси Y — значение SHAP или его влияние на выходные данные модели. Как вы видели на точечной диаграмме, положительное влияние означает, что выход модели приближается к прогнозу (> 50 тыс. В нашем случае), а отрицательное означает другое направление. Таким образом, на графике зависимости от возраста мы можем видеть то же явление, которое мы обсуждали ранее, но более четко. Когда вы моложе, влияние в основном отрицательное, а когда вы старше, влияние положительное.
  • График зависимости в SHAP также делает еще одну вещь. Он выбирает другую функцию, которая больше всего взаимодействует с исследуемой функцией, и окрашивает точки в соответствии со значением этой функции. В случае возраста метод выбрал семейное_статус. И мы видим, что большая часть разброса по возрастной оси объясняется семейным положением.
  • Если мы посмотрим на график зависимости для образования (который является порядковой характеристикой), мы увидим ожидаемую тенденцию: чем выше образование, тем выше ваши шансы на хороший заработок.

Джокер в стае

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

  • Вычислительно интенсивные. TreeSHAP в некоторой степени решает эту проблему, но все же работает медленно по сравнению с большинством других методов, которые мы обсуждали. KernelSHAP работает медленно и становится невозможным для расчета больших наборов данных. (Хотя существуют такие методы, как кластеризация с использованием K-средних для уменьшения набора данных перед вычислением значений Shapely, они все еще медленные)
  • Значения SHAP могут быть неверно истолкованы, поскольку это не самая интуитивная идея. Концепция, согласно которой он представляет собой не фактическую разницу в прогнозах, а разницу между фактическим прогнозом и средним прогнозом, представляет собой тонкий нюанс.
  • SHAP не создает разреженных объяснений, как LIME. Люди предпочитают иметь скудные объяснения, которые хорошо вписываются в ментальную модель. Но добавление термина регуляризации, такого как LIME, не гарантирует значений Shapely.
  • KernelSHAP игнорирует зависимость функций. Так же, как важность перестановок, LIME или любые другие методы, основанные на перестановках, KernelSHAP рассматривает «маловероятные» образцы при попытке объяснить модель.

Бонус: текст и изображение

Некоторые из методов, которые мы обсуждали, также применимы к данным Text и Image. Хотя мы не будем углубляться, я дам ссылки на некоторые блокноты, в которых показано, как это сделать.

ИЗВЕСТЬ ТЕКСТОВЫХ ДАННЫХ — МУЛЬТИЭТИКЕТОЧНАЯ КЛАССИФИКАЦИЯ

КЛАССИФИКАЦИЯ ИЗВЕСТИ НА ИЗОБРАЖЕНИИ — INCEPTION_V3 — KERAS

DEEP EXPLAINER — SHAP-MNIST

GRADIENT EXPLAINER — SHAP — ПРОМЕЖУТОЧНЫЙ СЛОЙ В VGG16 В IMAGENET

Заключительные слова

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

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

Полный код доступен в моем Github

Серия блогов

использованная литература

  1. Кристоф Молнар, «Интерпретируемое машинное обучение: руководство по созданию объяснимых моделей черного ящика»
  2. Марко Тулио Рибейро, Самир Сингх, Карлос Гестрин, Почему я должен вам доверять?: объяснение предсказаний любого классификатора, arXiv:1602.04938 [cs.LG]
  3. Шепли, Ллойд С. «Ценность для игр с участием n человек». Вклад в теорию игр 2.28 (1953): 307–317.
  4. Штрумбель, Э., и Кононенко, И. (2013). Объяснение моделей прогнозирования и отдельных прогнозов с учетом особенностей. Знания и информационные системы, 41, 647–665.
  5. Лундберг, Скотт М. и Су-Ин Ли. Единый подход к интерпретации предсказаний моделей. Достижения в области нейронных систем обработки информации. 2017.
  6. Лундберг, Скотт М., Габриэль Г. Эрион и Су-Ин Ли. «Последовательная индивидуализированная атрибуция признаков для ансамблей деревьев.» Препринт arXiv arXiv: 1802.03888 (2018).

Первоначально опубликовано на http://deep-and-shallow.com 24 ноября 2019 г.