Примечание. Изначально этот пост был опубликован на веб-сайте Canopy Labs и описывает работу, которую мне посчастливилось делать там как специалисту по данным.

Важный вопрос в области машинного обучения - почему алгоритм принял определенное решение.

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

Однако это сложная и все еще развивающаяся область машинного обучения. В этом посте я собираюсь обсудить, что именно означает интерпретация модели, и исследую новую технику под названием SHAP (https://github.com/slundberg/shap), которая особенно эффективна, позволяя нам использовать избавьтесь от сложных алгоритмов.

Что значит интерпретировать модель (и почему это так сложно)?

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

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

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

Однако есть два разных способа интерпретировать это:

  1. На глобальном уровне. Глядя на весь набор данных, какие функции алгоритм нашел наиболее предсказуемыми? Функция get_score() XGBoost, которая подсчитывает, сколько раз функция использовалась для разделения данных, является примером учета важности глобальной функции, поскольку она смотрит на то, что было извлечено из всех данных.
  2. На местном уровне. Возможно, для всех людей возраст был самой важной характеристикой, и молодые люди гораздо чаще любят компьютерные игры. Но если Фрэнку 50 лет, и он работает тестером видеоигр, вполне вероятно, что его род занятий будет гораздо более значимым, чем его возраст, при определении того, любит ли он компьютерные игры. Определение того, какие функции были наиболее важными для Фрэнка, в частности, включает в себя определение важности функций на «местном», индивидуальном, уровне.

Разобравшись с этим определением, давайте перейдем к одной из серьезных проблем интерпретируемости модели:

Компромисс между интерпретируемостью и сложностью

Давайте рассмотрим очень простую модель: линейную регрессию. Выход модели:

В модели линейной регрессии, приведенной выше, я назначаю каждой из своих функций x_i коэффициент ϕ_i и складываю все, чтобы получить свой результат. В случае моей проблемы с компьютерными играми мои функции ввода были бы такими: (x_Age, x_Gender, x_Job).

В этом случае очень легко определить важность функции; если ϕ_i имеет большое абсолютное значение, то функция xi оказала большое влияние на конечный результат (например, если ∣ ϕ_Age ∣ велико, то возраст был важной характеристикой). Однако есть и недостаток, заключающийся в том, что эта модель настолько проста, что может выявить только линейные отношения.

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

Чтобы раскрыть эти более сложные отношения, мне понадобится более сложная модель.

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

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

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

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

Как мы можем интерпретировать сложные модели?

Размышление о линейной регрессии дало хороший способ размышления об интерпретации модели:

Я назначу каждому объекту x_i коэффициент ϕ_i, который линейно описывает, как объект влияет на результат модели. Мы уже обсуждали недостатки этой модели, но будьте терпеливы:

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

Например, рассмотрим случай Фрэнка, 50-летнего тестировщика видеоигр, который любит компьютерные игры. Для него ϕ_Job будет высоким, а ϕ_Age - низким.

Но тогда для Бобби, 14-летнего, ϕ_Age будет высоким, поскольку модель увидела, что 14-летние, как правило, любят компьютерные игры, потому что им 14 лет. Старый.

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

Итак, подведем итоги:

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

Кроме того, чтобы еще больше упростить мою простую модель, я не буду умножать коэффициенты ϕ на исходное значение функции, x. Вместо этого я умножу его на 1, если функция присутствует, и на 0, если ее нет.

В случае предсказания того, кто любит компьютерные игры, я получаю следующее:

где g_Frank = p_Frank, исходное предсказание модели для Фрэнка.

Обратите внимание, что коэффициенты применимы только к Фрэнку; если я хочу узнать, как модель вела себя для Бобби, мне нужно найти новый набор коэффициентов. Кроме того, поскольку у Бобби нет работы, я умножил ϕ_Bobby Job на 0 (поскольку нет x_Bobby Job). Поэтому его простая модель будет

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

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

Значения Шепли (или, как я могу вычислить ϕ?)

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

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

Есть несколько вещей, с которыми каждый может согласиться; выполнение следующих условий будет означать, что игра будет «честной» в соответствии с ценностями Шепли:

  1. Сумма того, что каждый получает, должна равняться общей награде.
  2. Если два человека внесли одинаковую ценность, они должны получить одинаковую сумму от вознаграждения.
  3. Тот, кто не внес никакой ценности, не должен ничего получать
  4. Если группа играет в две игры, тогда индивидуальная награда в обеих играх должна равняться его награде за первую игру плюс награду за вторую игру.

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

  1. g_Frank должен быть равен p_Fran k, вероятности, которую сложная модель назначила Фрэнку, чтобы он полюбил компьютерные игры.

2. Если два объекта x внесли одно и то же значение в окончательный прогноз, то их коэффициенты ϕ должны иметь одинаковое значение.

3. Если функция ничего не повлияла на окончательный прогноз (или если она отсутствует), то ее вклад в g должен быть равен 0.

4. Если я сложу g_ (Frank + Bobby), то это должно быть равно g_Frank + g_Bobby.

Стоит отметить, что пока наша простая модель по умолчанию соблюдает правила 3 ​​и 4.

Оказывается, существует только один метод вычисления ϕ, так что он также будет соответствовать правилам 1 и 2. Ллойд Шепли представил этот метод в 1953 году (поэтому значения ϕ вычисленные таким образом известны как значения Шепли).

Значение Шепли для определенной функции i (из n общих функций) с учетом прогноза p (это прогноз сложной модели ) является

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

Это интуитивно понятно; Я могу просто добавить функции и посмотреть, как меняются прогнозы модели по мере появления новых функций. Изменение прогноза модели - это, по сути, эффект функции.

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

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

Напоминаем, что вот дерево решений (с пометкой Бобби):

Сначала мы увидим возраст Бобби, а затем его пол.

Когда модель узнает возраст Бобби, на первом сплите он повернет налево. Затем, поскольку у него еще нет пола, он присвоит ему среднее значение листьев ниже, или (2 + 0,1) / 2 = 1,05. Таким образом, эффект возрастной особенности равен 1,05.

Затем, когда модель узнает, что он мужчина, она получит 2 балла. Таким образом, влияние гендерной характеристики составляет 2–1,05 = 0,95.

Итак, в этом сценарии ϕ_Age Bobby = 1.05 и ϕ_Gender Bobby = 0.95.

Далее, допустим, мы видим его пол, а затем его возраст.

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

Во-первых, среднее значение глубины 2 листа: (2 + 0,1) / 2 = 1,05. Затем этот результат усредняется с другим листом глубины 1: (1,05 + (-1)) / 2 = 0,025. Итак, эффект гендерного признака равен 0,025.

Затем, когда модель узнает, что ему 14 лет, она получает 2 балла. Тогда эффект возрастной особенности будет (2–0,025) = 1,975.

Итак, в этом сценарии ϕ_Age Bobby = 1,975 и ϕ_Gender Bobby = 0,025.

Какое значение мы должны присвоить ϕ_Age Bobby? Если мы присвоим ϕ_Age Bobby значение 1,975, означает ли это, что мы присвоим ϕ_Gender Bobby значение 0,025 (поскольку, согласно правилу 1 справедливости Шепли, общие коэффициенты должны равняться окончательное предсказание модели для Бобби, в данном случае 2)?

Это далеко от идеала, поскольку игнорируется первая последовательность, в которой ϕ_Gender Bobby получит 0,95, а ϕ_Age Bobby - 1,05.

Значение Шепли рассматривает оба значения, вычисляя взвешенную сумму, чтобы найти окончательное значение. Вот почему уравнение для ϕ_i (p) должно переставляться по всем возможным наборам S группировок объектов (минус признак i нас интересует). Это описано в SN / i под суммированием, где N - все функции.

Каким образом присваиваются веса каждому компоненту суммы? Он в основном учитывает, сколько существует различных перестановок наборов, учитывая как функции, которые находятся в наборе S (это делается с помощью ∣ S ∣!), Так и функции, которые еще предстоит добавить (это делается с помощью (n −∣ S ∣ − 1) !. Наконец, все нормализуется функциями, которые есть в общий.

Расчет значения Шепли

Что бы Шепли ценил для своего возраста Бобби?

Во-первых, мне нужно построить свои наборы S. Это все возможные комбинации черт Бобби, за исключением его возраста. Поскольку у него есть только одна особенность - его пол - это дает два набора: {x_Gender} и пустой набор {}.

Затем мне нужно вычислить ϕ_i (p) или каждый из этих наборов, S. Обратите внимание, что, поскольку у меня есть 2 функции, n = 2 .

В случае, когда S = {}:

Прогноз модели, когда она не видит никаких особенностей, - это среднее значение всех листьев, которое, по нашим расчетам, составляет 0,025. Мы также подсчитали, что когда он видит только возраст, он равен 1,05, поэтому

Это дает

В случае, когда S = {x_Gender}:

Мы подсчитали, что прогноз модели только с полом составляет 0,025, а затем, когда он видит, что его возраст и пол равны 2, поэтому

So

Сложение этих двух значений вместе дает

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

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

Shap ценности

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

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

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

Заключение

Значения Шепли и библиотека SHAP - мощные инструменты для выявления закономерностей, выявленных алгоритмом машинного обучения.

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

Источники

С. Лундберг, С. Ли, Единый подход к интерпретации модельных прогнозов, 2017