Во второй части серии «Объяснимый ИИ» мы обсудим, что такое значения Шепли и как использовать значения Шепли для интерпретации предсказания модели.

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

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

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

Если мы углубимся в детали, «игра» — это задача прогнозирования для одного экземпляра набора данных. «Выигрыш» — это фактический прогноз для данного экземпляра минус средний прогноз для всех экземпляров. «Игроки» — это значения характеристик экземпляра, которые сотрудничают для получения выигрыша.

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

Квартира имеет площадь 30 м2, расположена на 3-м этаже, рядом есть парк, кошки запрещены.

Средний прогноз для всех квартир составляет €110 000. Теперь нам нужно выяснить, насколько значение каждого признака повлияло на прогноз по сравнению со средним прогнозом?

Значения функций «парк поблизости», «запрещено кошками», «район 30» и «3-й этаж» работали вместе, чтобы достичь прогноза в 100 000 евро. Наша цель — объяснить разницу между фактическим прогнозом (100 000 евро) и средним прогнозом (110 000 евро): разница составляет -10 000 евро.

Ответ может быть таким: близлежащий парк внес 30 000 евро; Area-30 внесла 40 000 евро; 3-й этаж внес 0 евро; cat-banned внес -20 000 евро. Взносы в сумме составляют -10 000 евро, окончательный прогноз минус средняя прогнозируемая цена квартиры.

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

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

В этом мы будем:

  1. Обучите модель CNN на наборе данных моды MNIST.
  2. Вычислите значения Шепли для примеров каждого класса.
  3. Визуализируйте значения Шепли и извлеките из них информацию.

Давайте сначала установим библиотеку SHAP

pip install shap

Давайте загрузим набор данных моды MNIST

import shap
import numpy as np
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
# Download the dataset
(x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data()
# Reshape and normalize data
x_train = x_train.reshape(60000, 28, 28, 1).astype("float32") / 255
x_test = x_test.reshape(10000, 28, 28, 1).astype("float32") / 255

Давайте создадим простую модель CNN для обучения набору данных моды MNIST.

# Define the model architecture using the functional API
inputs = keras.Input(shape=(28, 28, 1))
x = keras.layers.Conv2D(32, (3, 3), activation='relu')(inputs)
x = keras.layers.MaxPooling2D((2, 2))(x)
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(256, activation='relu')(x)
outputs = keras.layers.Dense(10, activation='softmax')(x)
# Create the model with the corresponding inputs and outputs
model = keras.Model(inputs=inputs, outputs=outputs, name="CNN")
# Compile the model
model.compile(
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]
)
# Train it!
model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))

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

Чтобы вычислить значения формы для модели, мы будем использовать класс DeepExplainer из библиотеки shap.

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

Это делается потому, что вычисления, выполняемые объектом DeepExplainer, очень интенсивно используют оперативную память, и у нас может не хватить памяти.

# Take a random sample of 5000 training images
background = x_train[np.random.choice(x_train.shape[0], 5000, replace=False)]
# Use DeepExplainer to explain predictions of the model
e = shap.DeepExplainer(model, background)
# Compute shap values
# shap_values = e.shap_values(x_test[1:5])

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

# Save an example of each class from the test set
x_test_dict = dict()
for i, l in enumerate(y_test):
   if len(x_test_dict)==10:
      break
   if l not in x_test_dict.keys():
      x_test_dict[l] = x_test[i]
# Convert to list preserving order of classes
x_test_each_class = [x_test_dict[i] for i in sorted(x_test_dict)]
# Convert to tensor
x_test_each_class = np.asarray(x_test_each_class)

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

# Compute shap values using DeepExplainer instance
shap_values = e.shap_values(x_test_each_class)
# Plot reference column
plot_categories(images_dict)
# Print an empty line to separate the two plots
print()
# Plot shap values
shap.image_plot(shap_values, -x_test_each_class)

Теперь взгляните на вычисленные значения формы.

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

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

Вы можете узнать исходный код, используя следующий URL-адрес Github.



Часть 1 «Объяснимого ИИ» доступна по следующему URL-адресу носителя.



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



https://www.investopedia.com/terms/s/shapley-value.asp#:~:text=The%20Shapley%20value%20is%20a,a%20desired%20outcome%20or%20payoff.