Эта статья основана на работе из репозитория: https://github.com/ADMAntwerp/CounterfactualBenchmark и из следующей препринтной статьи: https://arxiv.org/abs/2107.04680.

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

С тех пор было создано несколько методологий для создания контрфактических объяснений. Однако одной из самых больших проблем является тестирование таких алгоритмов в разных условиях и наборах данных.

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

Какова цель инструмента?

Тестируйте алгоритмы генерации контрфактов (для нейронных сетей или независимых от моделей) в различных моделях и наборах данных.

Каковы требования?

  • Убунту 18.04
  • Анаконда 2020 или новее

Шаг 0: Создание простого генератора контрфактов

Если у вас есть собственный алгоритм генерации CF, вы можете пропустить эту часть.

Давайте сначала создадим простой алгоритм генерации контрфактов.

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

Хотя этот контрфактический (CF) выглядит хорошо, у него есть серьезный недостаток. Он терпит неудачу при работе с числовыми непрерывными данными. Однако для проверки этого потребуется получить набор данных, выполнить предварительную обработку, сгенерировать модель и настроить ее для работы с генератором CF. С Универсальной Контрфактической Структурой эталонных показателей эта задача значительно упрощается.

Шаг 1. Клонируйте репозиторий Universal Counterfactual Benchmark Framework.

Это простой шаг, который вам нужно клонировать репо:

git clone https://github.com/ADMAntwerp/CounterfactualBenchmark.git

Затем перейдите в папку репозитория:

cd CounterfactualBenchmark/

Шаг 2: Создайте виртуальную среду

Если вы используете IDE, например PyCharm, вы можете действовать по-другому.

С Anaconda создайте виртуальную среду с Python 3.8:

conda create --name CFBenchTest python=3.8 -y

Затем активируйте его:

conda activate CFBenchTest

Шаг 3: Установите необходимые пакеты

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

pip install -r requirements.txt

Шаг 4: Протестируйте имитацию генератора CF

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

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

Для этого просто запустите файл simple_test.py на терминале или в предпочитаемой вами среде IDE:

python3 simple_test.py

В случае успеха он проверит несколько фактических случаев и вернет несколько результатов, таких как:

CF GENERATION: DATA - BalanceScale / C - 0 /ROW - 0
Failed counterfactual!
Factual class:3.676223957410976e-14
CF class:3.676223957410976e-14

Вам не нужно ждать всего теста, затем нажмите ctrl+c, чтобы остановить алгоритм.

Шаг 5: Включите алгоритм генерации CF

Теперь пришло время включить наш (или ваш) контрфактический алгоритм генерации для тестирования.

В том же файле simple_test.py есть 6 полей (обозначенных комментариями !!CHANGE BELOW!!), которые можно изменить:

1 — Имя фреймворка

# !!CHANGE BELOW!!: Add the name of your CF generation framework
framework_name = 'NAME_OF_FRAMEWORK'

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

2 — Типы наборов данных для тестирования

# !!CHANGE BELOW!!:(optional) Indicate the types of dataset you want to test, below, all dataset types are tested
test_ds_types = ['categorical', 'numerical', 'mixed']

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

3 — Количество выходных классов

# !!CHANGE BELOW!!:(optional) Add the output number of classes for the neuronal network (it can be 1 or 2)
# If 1 it will return only one binary probability result (from 0.0 to 1.0)
# If 2 it will return two probabilities, where the first is the factual class and second the counterfactual
output_number = 1

Там вы определяете количество классов, требуемых вашим генератором. Если ваш генератор работает с одним выходом (одно число от 0,0 до 1,0, представляющее вероятность быть классифицированным как 1), вы должны указать 1, как указано выше. Если вам нужны два вывода (первое число представляет вероятность класса 0, второе число — вероятность класса 1), вы должны изменить его на 2.

4 — Настройка генератора CF

# !!CHANGE BELOW!!: Below there's a dummy function to represent a CF generator, it just takes the factual
# instance and returns the same factual instance without any modification
my_cf_generator = lambda factual_instance: factual_instance

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

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

5 — Добавить скрипт для запуска генератора CF

# Here you generate the counterfactual
# !!CHANGE BELOW!!: Here you use your function to generate the counterfactual
cf_generation_output = my_cf_generator(factual_oh)

Теперь вы должны включить код для создания CF с использованием вашего (или предложенного) алгоритма.

Если вы используете предложенный алгоритм, замените эту строку на:

cf_generation_output = simple_cf_generator(factual_oh, adapted_nn, tolerance=100)

6 — извлечение результата CF в виде списка

# After that, you can adapt the counterfactual generation result to be in the required format (a simple list)
# !!CHANGE BELOW!!: Here you make additional preprocessing on your result to return a simple list
# (one hot encoded if categorical features are present) with the proposed counterfactual
cf = cf_generation_output

В следующем коде вы должны извлечь результат CF. В этом извлечении CF есть два важных правила:

  • Результирующий CF должен включать функции горячего кодирования, если присутствуют категориальные функции. Затем, если у фактического есть 2 категориальных столбца, которые генерируют в общей сложности 10 функций с горячим кодированием, ваш результат должен включать все эти 10 функций.
  • Результатом должен быть список Python (type(cf)==list).

Если вы используете предложенный алгоритм, замените эту строку на:

cf = list(cf_generation_output[0])

Шаг 6: Запустите тестер CF

Теперь запустите в своем терминале или предпочитаемой IDE скрипт simple_test.py. Он проверит (если включены все типы наборов данных) все 22 набора данных, по 20 фактических точек в каждом, создав в общей сложности 440 решений CF.

python3 simple_test.py

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

Шаг 7: Оцените результаты

Результаты хранятся в папке benchmark_results/results, где они организованы следующим образом:

  • OriginalClass_FactualIndex_DatasetName_FrameworkName.csv => CF, сгенерированный алгоритмом
  • TIME_OriginalClass_FactualIndex_DatasetName_FrameworkName.csv => Время, затраченное алгоритмом на создание CF

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