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

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

Что такое объяснимость машинного обучения?

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

Начнем с того, что такое машинное обучение. Согласно Оксфордскому словарю, машинное обучение заключается в следующем:

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

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

Мне нравится думать о моделях машинного обучения как о загадочных функциях.

Рассмотрим следующую функцию, которая возводит в квадрат свои входные данные:

f(x) = x^2

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

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

g(x) = ?

Поскольку внутренние механизмы модели машинного обучения также неизвестны, некоторые исследователи называют ее «черным ящиком». Мы знаем только результат для данного входа, но не знаем, как генерируется результат.

Представьте, что мы знаем:

g(1) = 1

g(2) = 2

g(3) = 5

g(4) = 18

Мы понятия не имеем, что такое g(x) с точки зрения x.

Цель объяснительности — снять покров с моделей машинного обучения и пролить свет на то, почему модели машинного обучения ведут себя именно так, то есть демистифицировать загадочную функцию.

Следует отметить, что большинство моделей машинного обучения имеют дело с более чем одной переменной. Таким образом, вместо g(x) мы можем иметь g(x1, x2, … xn), где g — функция n различных переменных, называемых «функциями», а выходные данные g называются «целевыми».

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

Полезность объяснимости машинного обучения огромна. Рассмотрим следующий сценарий.

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

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

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

Объяснение моделей машинного обучения

Это все, что касается теории. Теперь, для тех из вас, кто хочет начать программировать, давайте начнем.

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

Для работы с этим руководством вам потребуется загрузить пакет Python XAISuite. Вы можете сделать это, набрав

pip install XAISuite

в командной строке.

Откройте файл .py и импортируйте библиотеку XAISuite.

from xaisuite import*

Обратите внимание, что использование _ import* обычно является плохой практикой из-за проблем с памятью. Здесь мы импортируем все, потому что оно нам понадобится :)

Мне нравится делить процесс машинного обучения на четыре этапа:

  1. Загрузка данных
  2. Обработка данных
  3. Модельное обучение
  4. Пояснение Генерация

Давайте пройдемся по ним один за другим.

  1. Загрузка данных

Во-первых, нам нужно найти наши данные и указать функцию и целевые переменные. В следующем примере я прошу XAISuite создать набор данных случайной регрессии с 5 переменными (не волнуйтесь, если вы не знаете, что такое классификация). Но вы также можете импортировать данные из локальной файловой системы, массива numpy или DataFrame pandas.

load_data = DataLoader(make_regression)

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

load_data.content.head()

Выше мы видим первые несколько экземпляров набора данных. Имена переменных — это заголовки столбцов: 0, 1, 2, 3, 4 и «цель». Мы будем использовать значения 0, 1, 2, 3 и 4, чтобы предсказать значение «цели». Поскольку имена переменных могут немного сбивать с толку, мы собираемся их переименовать.

load_data = DataLoader(make_regression, variable_names = ["x1", "x2", "x3", "x4", "x5", "x6"], n_features = 5)
load_data.content.head()

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

Для простоты я не собираюсь вводить здесь какие-либо категориальные переменные.

Теперь вы могли заметить, что столбец «Цель» исчез, потому что мы переименовали переменные. От нас зависит, какую переменную мы хотим выбрать в качестве целевой. Я произвольно выбираю x5 в качестве целевой переменной. Нам нужно указать этот выбор в DataLoader. Таким образом, наш окончательный код:

load_data = DataLoader(make_regression, variable_names = ["x1", "x2", "x3", "x4", "x5", "x6"], target_names = "x5", n_features = 5)

Теперь вы можете визуализировать наши данные с помощью библиотеки seaborn:

import seaborn as sns
import matplotlib.pyplot as plt
sns.kdeplot(load_data.content)
plt.xlim(-5, 5)
plt.show()

2. Обработка данных

Чтобы модели машинного обучения работали оптимально, ученые, работающие с данными, часто используют «преобразования», чтобы сделать данные более удобными для машинного обучения. Примеры включают Standard Scaler sklearn.preprocessing, который нормализует данные, или OneHotEncoder, который преобразует категориальные метки в непрерывные значения с использованием 0 и 1.

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

Однако нам нужно иметь в виду одну вещь: разделение поезда-теста. Ученые, работающие с данными, обычно делят наборы данных машинного обучения на две части: обучающую часть, которую модель использует для обучения, и часть тестирования, которая помогает оценить производительность модели, проверяя, соответствуют ли прогнозы модели правильным значениям. По умолчанию train_test_split в XAISuite равен 0,2, то есть 80% данных будет использоваться для обучения, а 20% — для тестирования.

Давайте заставим XAISuite обработать наши данные!

process_data = DataProcessor(load_data)

3. Обучение моделей

Теперь самое интересное! Мы приступаем к обучению нашей модели. Есть так много моделей на выбор. Я собираюсь использовать DecisionTreeRegressor (вам не нужно знать, как он работает в этом примере).

from sklearn.tree import DecisionTreeRegressor
train_model = ModelTrainer(DecisionTreeRegressor, process_data, explainers = [])

Результат:

Model score is 0.7790724402568139

Неплохо, но и не хорошо. Обычно мы хотим, чтобы оценка нашей модели находилась в диапазоне от 0,9 до 1. Мы можем сделать это, добавив параметры оптимизации:

from sklearn.tree import DecisionTreeRegressor
train_model = ModelTrainer(DecisionTreeRegressor, process_data, explainers = [], ccp_alpha = 0.5)

Теперь вывод:

Model score is 0.815467624921841

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

Обратите внимание, что вам не нужно импортировать sklearn.tree.DecisionTreeRegressor. В XAISuite версии 2.0+ достаточно просто передать строку «DecisionTreeRegressor».

4. Создание пояснений:

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

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

Посмотрим, что нам дадут LIME и SHAP!

from sklearn.tree import DecisionTreeRegressor
train_model = ModelTrainer(DecisionTreeRegressor, process_data, explainers = {"lime": {"feature_selection": "none”}, “shap”: {}}, ccp_alpha = 0.5)

Здесь мы передаем Feature_selection = «none» ядру Lime, чтобы получить важность всех функций в наборе данных.

Теперь, чтобы получить объяснения, мы можем сделать что-то вроде:

explanations = train_model.getExplanationsFor([])

чтобы получить все объяснения или

explanations = train_model.getExplanationsFor([0])

получить разъяснения только для первой инстанции.

Чтобы просмотреть объяснения, мы просто делаем

explanations[“lime”].ipython_plot(index)

и

explanations[“shap”].ipython_plot(index)

где индекс — номер экземпляра, для которого требуются пояснения. Так, например,

explanations[“lime”].ipython_plot(10)

создает следующий визуальный элемент:

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

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

insights = InsightGenerator(explanations)
similarity = insights.calculateExplainerSimilarity("lime", "shap")
print(similarity)

Выход — 0,715. Сходство объяснителя, равное 1, указывает на то, что два объяснителя идентичны, а 0 указывает на отсутствие сходства, так что на самом деле это довольно хорошо.

Заключение

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