Как улучшить свои модели машинного обучения, объясняя предсказания с помощью LIME

1656539297 kak uluchshit svoi modeli mashinnogo obucheniya obyasnyaya predskazaniya s pomoshhyu

Дебора Мескита

Повышайте доверие пользователей и быстрее находите ошибки

1*LJj4hmOES-c0DYj4Kwg89A
С LIME мы можем вести подобные дискуссии о наших моделях со всеми (спасибо Штефану за фото!)

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

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

Сначала давайте разберемся, как работает LIME. Затем я покажу вам, как построить модель глубокого обучения для классификации предложений (с помощью AllenNLP) и объяснения предсказаний с помощью LIME.

Локальные интерпретированные модели-агностические пояснения (LIME)

Независимые от модели предсказания используются, когда алгоритм не пытается работать с функцией решения моделей. LIME использует местная верность критерий:

[…] Чтобы объяснение было значимым, оно должно быть по крайней мере локально верным, т.е. он должен соответствовать тому, как модель ведет себя вблизи прогнозируемого экземпляра.. — Рибейро, Марк Тулио, Самир Сингх и Карлос Гестрин

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

[…] Функции, имеющие глобальное значение, могут не быть важными в локальном контексте, и наоборот. Хотя глобальная верность предполагает локальную верность, определение глобально верных пояснений, которые можно интерпретировать, остается проблемой для сложных моделей. — Рибейро, Марк Тулио, Самир Сингх и Карлос Гестрин

На рисунке ниже представлен пример игрушки, как работает LIME. Это взято из статьи, в которой представлен алгоритм.

1*dZsU2fe84gMYb3pierxI-Q
Красные и синие области представляют функцию комплексного решения модели, неизвестной LIME. Жирный красный крест – это экземпляр данных, который мы хотим объяснить.

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

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

0*y6DD7Z9K6tDdFqZy
Объяснение к категориальным данным

Модель предполагает, есть гриб ядовит или нет. Мы видим это odor=foul указывает на ядовитый гриб.

Поскольку мы возбуждаем каждую категориальную характеристику, рисуя образцы в соответствии с исходным учебным распределением, это можно интерпретировать: если бы запах не был неприятным, в среднем этот прогноз был бы на 0,26 менее «ядовитым» — Учебник по табличным данным

Теперь давайте посмотрим, как использовать инструмент.

Объяснение предсказаний с помощью LIME

Существует три типа объяснителей:

  • LimeTabularExplainer: объясняет прогнозы на табличных или матричных данных
  • LimeImageExplainer: объясняет прогнозы по данным изображений
  • LimeTextExplainer: объясняет текстовые классификаторы

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

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

Чтобы создать LimeTextExplainer, нам нужно только предоставить имена классов или метки. Объяснение экземпляра означает, что нам нужно передать данные экземпляра и функция, которая будет предсказывать. Для этого нам нужна обученная модель. Давайте создадим его с помощью AllenNLP.

AllenNLP

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

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

Если вам нужно узнать больше о клетках LSTM и RNN, посмотрите эту другую статью, которую я написал. Я также объясню, как AllenNLP работает более подробно.

Используя фреймворк, мы определяем архитектуру модели в файле JSON. Вот архитектура нашей модели:

{
  "dataset_reader": {
    "type": "az_papers"
  },
  "train_data_path": "../../data/AZ_distribution/train/",
  "model": {
    "type": "sentence_classifier",
    "text_field_embedder": {
      "tokens": {
        "type": "embedding",
        "pretrained_file": "
        "embedding_dim": 100,
        "trainable": false
      }
    },
    "title_encoder": {
      "type": "lstm",
      "bidirectional": true,
      "input_size": 100,
      "hidden_size": 100,
      "num_layers": 1,
      "dropout": 0.2
    },
    "sentence_encoder": {
      "type": "lstm",
      "bidirectional": true,
      "input_size": 100,
      "hidden_size": 100,
      "num_layers": 1,
      "dropout": 0.2
    },
    "classifier_feedforward": {
      "input_dim": 400,
      "num_layers": 2,
      "hidden_dims": [200, 7],
      "activations": ["relu", "linear"],
      "dropout": [0.2, 0.0]
    }
  },
  "iterator": {
    "type": "bucket",
    "sorting_keys": [["sentence", "num_tokens"], ["title", "num_tokens"]],
    "batch_size": 64
  },
  "trainer": {
    "num_epochs": 40,
    "patience": 10,
    "cuda_device": -1,
    "grad_clipping": 5.0,
    "validation_metric": "+accuracy",
    "optimizer": {
      "type": "adagrad"
    }
  }
}

Это, вероятно, не имеет смысла, если вы новичок в AllenNLP. Цель этой статьи – показать, как использовать LIME, поэтому мы не будем углубляться в это. Я пытаюсь объяснить больше о AllenNLP в этой другой статье. И, конечно, весь код для обучения модели здесь.

Набор данных является оригинальным корпусом Argumentative Zoning [AZ corpus]. Он состоит из 80 статей конференции по компьютерной лингвистике, аннотированных AZ, первоначально взятых из arXiv. Каждое предложение имеет одну из следующих меток:

  • BKG: Общая научная подготовка
  • OTH: Нейтральные описания работы других людей
  • СВОИ: нейтральные описания собственной, новой работы
  • ЦЕЛЬ: формулирование конкретной цели текущей статьи
  • TXT: Уведомление об организации текста текущей статьи (в главе 1 мы представляем…)
  • CTR: контрастные или сравнительные утверждения о другой работе; явное упоминание о слабых сторонах другой работы
  • BAS: Утверждение о том, что собственная работа основана на другой работе

Для обучения модели мы используем эту команду:

python3 run.py train experiments/the_file_presented_before.json  
--include-package newsgroups.dataset_readers 
--include-package newsgroups.models 
-s /tmp/our_model 

Объяснение модельных предсказаний

Чтобы предсказать класс для каждого предложения, мы используем title бумагу и sentence себя. С AllenNLP мы это делаем так:

1*fqjwt8S8qoci-dfrxjX-DA
Создание прогнозов с помощью AllenNLP

Как я уже говорил ранее, два ключевых параметра LimeTextExplainer.explain_instance() — это экземпляр и функция, которая возвращает вероятность предсказания для каждого класса — как функция predict_proba scikit-learn. Здесь эта функция принимает список d строки и выводит a (d, n_классов) Массив NumPy с вероятностями предсказания.

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

#For each perturbed sentence we get the predict_proba from AllenNLP

predict_function = lambda x: np.array([predictor.predict_json(json.loads('{"title": "Incremental Interpretation of Categorial Grammar","sentence":"'+s+'"}'))['class_probabilities'] for s in x])

Затем мы импортируем LIME, устанавливаем class_namesи позвоните explain_instance метод:

from lime.lime_text import LimeTextExplainer

explainer = LimeTextExplainer(class_names=['OWN', 'OTH', 'BKG', 'CTR', 'AIM', 'TXT', 'BAS'])

row = json.loads('{"title": "Incremental Interpretation of Categorial Grammar", "sentence": "In processing a sentence using a lexicalised formalism we do not have to look at the grammar as a whole , but only at the grammatical information indexed by each of the words ."}')

exp = explainer.explain_instance(row["sentence"], predict_fn, num_features=10,top_labels=2)

#Show the results in notebook
exp.show_in_notebook(text=False)

И вот результат:

1*v4oEQzJa-Ci53JtXPYM__w

Предложение отнесено к своим — описание произведения автора. Мы видим почему: слова «индексированный», «грамматический» и «мы».

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

Давайте рассмотрим другие примеры:

1*H7FZk2soeSuGy6jnq3p7ZQ
Это было легко классифицировать
1*O7iuovxvu-HOUDIWSrJGVA
Объяснение общенаучного фонового предложения

Еда на вынос

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

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

Я работаю над проектом, использующим категориальные данные. Поскольку я использовал LIME для объяснения прогнозов, мне удалось обнаружить ошибку в начале процесса. Причины для предсказаний были глупы, что заставило меня углубиться в код и найти ошибку. Если бы я полагался только на точность модели, мне потребовалось бы много времени, чтобы найти ошибку, поскольку у модели были достаточно хорошие показатели точности.

Поэтому если вы создаете модели машинного обучения, попробуйте LIME! Для получения дополнительной информации вы можете прочесть статью и проверить репо на GitHub.

Если вы работаете с НЛП и глубокой учебой, также проверьте AllenNLP.

Весь код из этой статьи можно найти здесь. И спасибо за прочтение! ?

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

Следите за мной, чтобы получить дополнительные статьи о науке о данных и машинном обучении.

Добавить комментарий

Ваш адрес email не будет опубликован.