Обзор

  • Узнайте, как использовать значения Шепли в теории игр для интерпретации машинного обучения
  • Интерпретация моделей машинного обучения черного ящика - это уникальный и иной подход.

Вступление

Давайте вернемся в 2007 год, когда был организован первый в истории чемпионат мира по крикету Т20. Мир твердил об этом, но ассоциации крикета смотрели на это с осторожностью - рекламные паузы были сокращены с 99 секунд до 39 секунд. Ой! Это небольшое сокращение дохода.

Но это решение было самым полезным в долгосрочной перспективе, и теперь это самый высокий доход в истории крикета!

Индийская сборная по крикету на чемпионате мира Т-20 в 2020 году захватит мир штурмом! Наш капитан Вират Кохли снова будет в центре внимания, принимая важные решения. Разве это не очень напряженная работа? Особенно, когда на тебя возлагаются надежды миллионов людей?

Постойте, какое отношение все это имеет к интерпретируемости машинного обучения, ценностям Шепли и теории игр? Вот мысль, чтобы поместить вещи в контекст:

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

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

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

Оглавление

  • Что такое теория игр?
  • Кооперативная теория игр
  • Ценности Шепли: интуиция
  • Ценности Шепли для интерпретируемости машинного обучения
  • Интерпретация модели с использованием SHAP в Python
  • Глобальная интерпретация с использованием значений Шепли

Что такое теория игр?

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

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

Ключевыми пионерами теории игр были математики Джон фон Нейман и Джон Нэш, а также экономист Оскар Моргенштерн.

Теперь вы можете спросить - что такое игра? Это похоже на шахматы? Видеоигры?

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

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

  • Возможно, удастся достичь равновесия (поэтому все мы едем по одной стороне дороги в пределах страны)
  • Может быть, это равновесие будет хуже для всех игроков (вот почему люди мусорят или загрязняют общие ресурсы)
  • Что ж, каждый будет стараться быть максимально непредсказуемым в своих действиях (как это может случиться с развертыванием войск на войне).

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

Кооперативная теория игр

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

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

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

Интуиция, лежащая в основе ценностей Шепли

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

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

  1. Если Рам ест один, он заплатит 800
  2. Если Абхирадж ест один, он заплатит 560
  3. Если Пранав ест один, он заплатит 700
  4. Если Рам и Абхирадж будут есть в одиночестве, они заплатят 800
  5. Если бы Рам и Пранав поели в одиночестве, они заплатили бы 850
  6. Если Абхирадж и Пранав едят одни, они заплатят 720.
  7. Если бы Рам, Абхирадж и Пранав все вместе поели, они заплатили бы 900

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

Мы адаптируем следующий метод:

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

Итак, здесь последовательность - это Рам, Абхирадж, а затем Пранав по очереди. Как описано выше, Рам приходит и платит 800. Теперь Рам и Абхирадж платят только 800, так что никакой дополнительной выплаты для Абхираджа нет. Следовательно, мы получаем 0. И, наконец, все трое едят вместе и платят 900, так что дополнительная выплата за Пранав составляет 100.

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

  • (Рам, Абхирадж, Пранав) - (800,0,100)
  • (Абхирадж, Рам, Пранав) - (560, 240, 100)
  • (Абхирадж, Пранав, Рам) - (560, 160, 180)
  • (Пранав, Рам, Абхирадж) - (700, 150, 50)
  • (Пранав, Абхирадж, Рам) - (700, 20, 180)
  • (Рам, Пранав, Абхирадж) - (800, 50, 50)

Итак, каково значение Шепли для Рама, Абхираджа и Пранава каждый? Это просто среднее значение предельной выплаты для каждого!

Например, для Рама это (800 + 240 + 180 + 150 + 180 + 800) / 6 = 392. Точно так же для Абхираджа это 207, а для Пранава оказывается 303. Сумма оказывается равной 900.

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

Ценности Шепли для интерпретируемости машинного обучения

У вас есть интуитивное представление о ценностях Шепли, поэтому подумайте, как они могут помочь в интерпретации модели машинного обучения черного ящика.

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

Предположим следующий сценарий:

Мы обучили модель машинного обучения прогнозированию цен на жилье в Дели. Для определенного дома наша модель предсказывает 51 000 000 индийских рупий, и нам необходимо объяснить этот прогноз. Квартира размером 50 ярдов, имеет частный бассейн, а также гараж:

Средний прогноз для всех квартир - 50 000 000 индийских рупий. Насколько значение каждого признака повлияло на прогноз по сравнению со средним прогнозом?

Теперь, если мы говорим с точки зрения теории игр, «игра» здесь - это задача прогнозирования для одного экземпляра набора данных. «Игроки» - это значения характеристик экземпляра, которые совместно участвуют в игре. игра (предскажите значение), аналогичная примеру с едой, когда Пранав, Рам и Абхирадж вместе пошли обедать.

В нашем домашнем примере значения характеристик has_pool, has_garage и area-50 работали вместе, чтобы получить прогноз в 51 00 000 индийских рупий. Наша цель - объяснить разницу между фактическим прогнозом (51 000 000 индийских рупий) и средним прогнозом (50 000 000): разница в 1 000 000 индийских рупий.

Возможным объяснением может быть has_pool внесенный 30 000 индийских рупий, гараж внес 50 000 индийских рупий, а площадь 50 ярдов внесла 20 000 индийских рупий. Сумма взносов составляет 100 000 индийских рупий - окончательный прогноз за вычетом средней прогнозируемой цены на дом.

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

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

Интерпретация модели с использованием SHAP в Python

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

В независимом от модели объяснителе SHAP использует значения Шепли следующим образом. Чтобы понять важность функции X {i}:

  1. Получить все подмножества функций S, не содержащие X {i}
  2. Вычислить влияние на наши прогнозы добавления X {i} ко всем этим подмножествам.
  3. Сгруппируйте все вклады, чтобы вычислить предельный вклад функции.

Теперь для этих подмножеств SHAP не продолжает переобучать модель для каждого подмножества. Вместо этого для удаленного или пропущенного объекта он просто заменяет его средним значением объекта и генерирует прогнозы.

Пришло время поработать над настоящим набором данных! Как и в предыдущей статье, мы будем использовать проблему продаж Big Mart, размещенную на нашей платформе Datahack.

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

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

Вы можете установить библиотеку SHAP с помощью команды терминала:

conda install -c conda-forge shap

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

# importing the required libraries
import pandas as pd
import numpy as np
import shap
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error 
from sklearn.linear_model import LinearRegression 
from sklearn.tree import DecisionTreeRegressor 
from sklearn.ensemble import RandomForestRegressor 
from xgboost.sklearn import XGBRegressor 
from sklearn.preprocessing import OneHotEncoder, LabelEncoder 
from sklearn import tree 
import matplotlib.pyplot as plt
%matplotlib inline
import warnings warnings.filterwarnings('ignore')

Чтение данных

# reading the data
df = pd.read_csv('data.csv')

Обработка отсутствующих значений

# imputing missing values in Item_Weight by median and Outlet_Size with mode
df['Item_Weight'].fillna(df['Item_Weight'].median(), inplace=True) df['Outlet_Size'].fillna(df['Outlet_Size'].mode()[0], inplace=True)

Разработка функций

# creating a broad category of type of Items df['Item_Type_Combined'] = df['Item_Identifier'].apply(lambda df: df[0:2])
df['Item_Type_Combined'] = df['Item_Type_Combined'].map({'FD':'Food', 'NC':'Non-Consumable', 'DR':'Drinks'})
df['Item_Type_Combined'].value_counts() 
#operating years of the store
df['Outlet_Years'] = 2013 - df['Outlet_Establishment_Year'] 
#modifying categories of Item_Fat_Content
df['Item_Fat_Content'] = df['Item_Fat_Content'].replace({'LF':'Low Fat', 'reg':'Regular', 'low fat':'Low Fat'}) df['Item_Fat_Content'].value_counts()

Предварительная обработка данных

# label encoding the ordinal variables
le = LabelEncoder() 
df['Outlet'] = le.fit_transform(df['Outlet_Identifier'])
var_mod = ['Item_Fat_Content','Outlet_Location_Type','Outlet_Size','Item_Type_Combined','Outlet_Type','Outlet']
le = LabelEncoder()
for i in var_mod: 
  df[i] = le.fit_transform(df[i]) 
# one hot encoding the remaining categorical variables
df = pd.get_dummies(df, columns=['Item_Fat_Content','Outlet_Location_Type','Outlet_Size','Outlet_Type', 'Item_Type_Combined','Outlet'])

Разделение на тренировку и тест

#dropping the ID variables and variables that have been used to extract new variables df.drop(['Item_Type','Outlet_Establishment_Year', 'Item_Identifier', 'Outlet_Identifier'],axis=1,inplace=True)
#separating the dependent and independent variables X = df.drop('Item_Outlet_Sales',1) y = df['Item_Outlet_Sales'] 
#creating the training and validation set X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=42)

Инициализировать Shap

# Need to load JS vis in the notebook
shap.initjs()

Установка XGBoost

xgb_model = XGBRegressor(n_estimators=1000, max_depth=10, learning_rate=0.001, random_state=0)
xgb_model.fit(X_train, y_train)

Создание прогнозов

y_predict = xgb_model.predict(X_test)

Оценка эффективности

mean_squared_error(y_test, y_predict)**(0.5)

Локальный перевод с использованием SHAP (для прогнозирования с идентификационным номером 4776)

explainer = shap.TreeExplainer(xgb_model)
shap_values = explainer.shap_values(X_train)
i = 4776
shap.force_plot(explainer.expected_value, shap_values[i], features=X_train.loc[4776], feature_names=X_train.columns)

Синим цветом показаны отрицательные значения Shap, которые показывают все, что влияет на стоимость продаж в отрицательном направлении. В то время как значение Shap, выделенное красным, представляет все, что подталкивает его в положительном направлении. Обратите внимание, что это только для наблюдения номер 4776.

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

Глобальная интерпретация с использованием значений Шепли

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

shap.summary_plot(shap_values, features=X_train, feature_names=X_train.columns)

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

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

Конечные заметки

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

С появлением глубокого обучения проводится больше исследований о том, как интерпретировать модели Обработка естественного языка (NLP) и компьютерное зрение. В некоторой степени был рассмотрен аспект интерпретируемости компьютерного зрения.

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

Первоначально опубликовано на https://www.analyticsvidhya.com 25 ноября 2019 г.