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

Введение

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

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

Обычный способ вычисления важности каждой из характеристик вашей модели — использование значений Шепли, поскольку этот метод 1) широко применим ко многим задачам, 2) основан на прочном теоретическом обосновании и 3) легко реализовать с помощью библиотеки SHAP Python.

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

Пример панели Trivia

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

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

Можем ли мы количественно оценить влияние каждого члена команды на результативность викторины? Мы можем использовать значения Шепли для каждого игрока со следующей интерпретацией: они должны соответствовать ожидаемому изменению счета при добавлении этого игрока в викторину. Существуют и другие возможные интерпретации*, но мы будем использовать эту.

(*Примечание. Этот класс методов для вычисления значений Шепли, называемый «интервенционными» значениями Шепли, измеряет «ожидаемое изменение оценки при добавлении этой функции». Другой тип известен как «условные» значения Шепли. Ключевое отличие Между интервенционным методом и условным методом заключается в том, как они относятся к признаку, ожидаемое изменение оценки которого равно нулю — каким должно быть его значение Шепли? Ноль? Если вы думаете, что ответ «да», используйте интервенционный метод. Если вместо этого, вы считаете, что функция все еще может иметь важность из-за корреляций, и если вы считаете, что важность должна быть включена в ее значение Шепли, рассмотрите возможность использования условного метода.)

С точки зрения геометрии, полезный способ изобразить все эти результаты игры с тремя игроками с разными командами — это точки на кубе, расположенные так, чтобы соседние точки отличались только на одного игрока. Затем пути между точками (также известными как ребра куба) будут представлять изменение счета при добавлении игрока в команду.

(Примечание: с двумя игроками мы начертим это как квадрат. С четырьмя или более игроками нам придется построить это как гиперкуб)

Назовем эту форму GameCube; это будет полезно для нас, потому что и значения Shapley, и ребра GameCube будут соответствовать изменению счета при добавлении игрока.

Рисунок 1. Нанесение каждой викторины на разные вершины куба, соответствующие игрокам, присутствовавшим в команде в тот вечер.

В нашей истории Рид разбирается только в спортивных мелочах, а GW знает кино, музыку, историю, географию, литературу — почти все, кроме спортивных мелочей. Поэтому, когда Рид играет, он немного улучшает счет; когда GW играет, она намного увеличивает счет. А я, ну, в основном за пивом и компанией.

Значение Шепли является идеальной мерой объяснимости, только когда игрок всегда вносит одну и ту же сумму в счет команды. . И поскольку до сих пор изменение счета каждого игрока в нашей истории постоянно, мы можем присвоить значение Шепли, равное 1, Рейду, значение Шепли, равное 9, GW и значение Шепли, равное 0, Максу. Эти значения Шепли представляют собой ожидаемое изменение счета, когда каждый игрок присоединяется к команде!

Рисунок 2. Просмотр изменений в счете команды при добавлении каждого игрока.

Говоря более технически, игра, в которой влияние каждого игрока постоянно (как наша история до сих пор), называется «несущественной игрой». Кроме того, мы будем использовать символ ▽v для представления «градиента» GameCube v, который вычисляет значения вдоль ребер между значениями в вершинах, и мы будет использовать ▽_player_v для представления значений границ для направлений конкретного игрока и нуля для всех остальных границ.

Например, градиент GameCube ▽_Reid_ν представляет все возможные изменения в счете при добавлении Reid.

Рисунок 3. Выражение изменения очков при добавлении игрока в виде частичного градиента GameCube по отношению к каждому игроку

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

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

Давайте изменим нашу историю.

Предположим, что поведение Макса меняется в зависимости от того, с кем он играет. Играя с GW, он довольно хладнокровен, пьет пиво, занимается своими делами и позволяет GW делать большую часть работы, поэтому он не снижает счет. Но когда Макс играет с Ридом, он завидует тому, как много Рид разбирается в спорте, поэтому Макс начинает говорить больше, предлагая неправильные ответы и снижая счет на 1!

Рисунок 4. Новый GameCube с непоследовательным вкладом игроков

На этом новом GameCube края GW постоянны, поэтому ее значение Шепли, равное 9, по-прежнему точно соответствует изменению счета во время игры. Но преимущества Макса и Рида не являются постоянными, поскольку их влияние на счет зависит от того, с кем они играют. Таким образом, наш способ использования ребер GameCube для количественной оценки того, что Макс и Рид привносят в таблицу, теперь имеет проблему.

Когда настоящие специалисты по данным используют значения Шепли, они решают эту проблему, беря средний вклад игрока в свою команду — на GameCube это означает количественную оценку вклада игрока как среднее значение преимущества в его направлении. . Таким образом, на нашем GameCube выше значение Шепли GW по-прежнему будет равно 9, как и раньше, но значение Шепли Рейда теперь будет 0,5, а значение Шепли Макса теперь будет -0,5. В некоторых случаях история на этом заканчивается — средний вклад игрока иногда может быть достаточно хорошей количественной оценкой его влияния!

Однако это может вызвать проблемы, когда речь идет о доверии значениям Shapley. Потому что мы можем доверять ценностям Шепли GW больше, чем ценностям Шепли Макс или Рейд, поскольку ее вклад в команду более постоянен, чем вклад Макса или Рида.

Остатки Шепли

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

Авторы оригинальной статьи об остатках Шепли формулируют эту отсутствующую информацию как член ошибки в регрессии по методу наименьших квадратов. Например, для игрока Рейд:

▽_Reid_ν = ▽_ν_Reid + r_Reid

Левая часть этого уравнения представляет собой тот же частичный градиент, что и ранее. Правая часть уравнения представляет собой сумму нового градиента GameCube, ▽_ν_Reid, плюс остаточный куб, r_Reid, который измеряет величину отклонения нашей игры от несущественности. по отношению к Риду.

Рисунок 5. Остаточный куб – это величина, на которую игра отклоняется от несущественности по отношению к данному игроку.

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

Код для расчета остатков Шепли

Импорт

Создать синтетический набор данных

Модель обучения и объяснитель KernelSHAP

Вычислите ожидаемые значения коалиций функций

При этом используется explainer.synth_data, набор образцов синтетических данных, сгенерированных библиотекой shap при обучении эксплейнера.

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

(Обратите внимание, что мы преобразовываем списки в строки, так как списки не являются типами, поддерживающими хеширование в Python.)

Проверка прогресса

coalition_estimated_values должно выглядеть примерно так:

{'[]': 0,
 '[0]': -0.3576234198270127,
 '[1]': 0.010174318030605423,
 '[2]': -0.08009846972721224,
 '[0 1]': -0.34261386138613864,
 '[0 2]': -0.37104950495049505,
 '[1 2]': 0.14435643564356437,
 '[0 1 2]': -0.396}

Создать объект гиперкуба

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

Не стесняйтесь использовать код класса Python Hypercube в приложении к этой статье или написать свой собственный. Ему нужно поместить coalition_estimated_values в вершины куба, и ему нужно вычислить значения ребер как разность между значениями соседних вершин.

Вычислите остатки Шепли

Для каждой функции сверните || ▼_feature_cube — ▼_cube_feature || для вычисления остатка. При этом используется вспомогательная функция с именем residual_norm defined в приложении в конце этой статьи.

Заключение

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

Отдельное спасибо авторам оригинальной статьи об остатках Шепли за их работу!

Приложение

Все изображения в произведении созданы автором.

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