Чтобы начать эту статью, я хотел бы объяснить интерпретируемость модели машинного обучения (ML).

Согласно Мерриам-Вебстер, интерпретируемость описывает процесс создания чего-то простого или понятного. В контексте машинного обучения интерпретируемость дает нам понятное объяснение поведения модели. По сути, это помогает нам понять, что стоит за прогнозами моделей и как эти модели работают. В статье Миллера и Тима «Объяснение в искусственном интеллекте: идеи социальных наук» говорится, что «интерпретируемость - это степень, в которой человек может понять причину решения». Используя методы интерпретируемости машинного обучения, мы увеличиваем эту степень и позволяем людям последовательно предсказывать поведение модели.

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

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

[Статья по теме: Не всегда черный ящик: подходы к машинному обучению для объяснения модели]

Классы методов интерпретации

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

Относительно момента постановки задачи интерпретации

Во-первых, методы интерпретируемости можно классифицировать в зависимости от того момента, когда специалист по анализу данных решает интерпретировать модель:

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

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

Специфичные для модели и не зависящие от модели

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

применения:

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

Сфера

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

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

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

Методы

График частичной зависимости

Один из самых простых и понятных методов - это частичный граф зависимостей. Этот график зависимостей показывает нам зависимость целевой переменной от конкретной функции. Мы наносим значения характеристик на одну ось, от минимального до максимального, и мы наносим агрегированные значения целевой переменной на другую ось. Поскольку в нашем анализе мы учитываем только несколько функций, взаимодействия более высокого порядка будут упущены. Выбирать объекты для анализа по **feature_importance** значениям, полученным из классификатора, является хорошей эвристикой.

Вот один пример получения графика PD из библиотеки sklearn.

# Example on PD plot in sklearn library
from sklearn.ensemble.partial_dependence import partial_dependence, plot_partial_dependence
X_train, X_test, y_train, y_test = train_test_split(...)
clf = Regressor(...)
clf.fit(X_train, y_train)
features = [0, 1, (0, 1)]  # Features used for computing and plotting PDPlot
fig, axs = plot_partial_dependence(clf, X_train, features)
plt.show()

➕ Плюсы:

  • Легко и интуитивно понятно
  • Доступно в sklearn

➖ Минусы:

  • Предположение о независимости функций
  • Потеря взаимодействий высшего порядка

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

Важность перестановки

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

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

Вот пример этого алгоритма из библиотеки eli5 в наборе данных о раке шейки матки.

from eli5.sklearn import PermutationImportance
import sklearn
X_train, X_test, y_train, y_test = train_test_split(...)
model = sklearn.some_model().fit(X_train, y_train)
perm = PermutationImportance(model).fit(X_test, y_test)
eli5.show_weights(perm)

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

➕ Плюсы:

  • Просто и интуитивно понятно
  • Доступно через библиотеку eli5
  • Легко вычислить

➖ Минусы:

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

SHAP

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

Чтобы оценить такое значение для конкретной выборки, нам необходимо оценить все возможные коалиции значений характеристик с этой функцией и без нее. Как вы понимаете, количество возможных коалиций экспоненциально увеличивается с увеличением количества функций, поэтому вычисление точного решения не вариант. SHAP объединяет несколько методов интерпретации под своим капотом, чтобы преодолеть проблему вычисления точных значений Шепли. SHAP предлагает несколько алгоритмов для вычисления так называемых значений SHAP, которые имеют те же желаемые свойства, что и значения Shapley. Одним из таких алгоритмов является TreeExplainer, который вычисляет объяснения для древовидных моделей, будь то модели XGboost, LightGBM, CatBoost или scikit-learn. Это намного быстрее, чем наивный метод оценки всех возможных коалиций.

Методы, объединенные под концепцией SHAP

Вот пример TreeExplainer в наборе данных о ценах на дом в Бостоне:

import shap
# load JS visualization code to notebook
shap.initjs()
# train XGBoost model
X,y = shap.datasets.boston()
model = xgboost.train(...)
# explain the model's predictions using SHAP values
# (same syntax works for LightGBM, CatBoost, and scikit-learn models)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
# visualize the first prediction's explanation (use matplotlib=True to avoid Javascript)
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])

Для интерпретации черных ящиков SHAP предоставляет класс KernelExplainer. Для получения дополнительной информации о SHAP обратитесь к их репозиторию.

➕ Плюсы:

  • Мы видим, как обе функции толкают прогнозы вверх и вниз
  • Основано на твердой теории. Значения SHAP обладают полезными и проверенными математическими свойствами.
  • TreeExplainer работает быстро

➖ Минусы:

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

ЛАЙМ

LIME - одна из самых популярных библиотек, получившая более 5 тысяч звезд на Github. Он основан на одноименном методе, описанном в статье Почему я должен вам доверять?: Объяснение прогнозов любого классификатора », представленной в Ассоциации вычислительной техники в 2016 году. Этот метод не зависит от модели и предназначен для объяснения местных условий. поведение модели вокруг некоторой точки X.

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

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

В этом алгоритме есть одна неопределенность: что означает близость объясненного экземпляра? Эти веса окрестностей вычисляются как расстояние до X с использованием функции ядра, по умолчанию - ядра RBF; экземплярам, ​​близким к X, назначается более высокая важность. Однако выбор ширины ядра, гиперпараметра функции ядра, требует внимания, потому что мы не можем выбрать одинаковую ширину ядра для всех случаев. Вот ссылка на обсуждение о том, как выбрать правильную ширину ядра. Тем не менее, даже если мы знаем ширину ядра, мы не знаем точно, к чему это объяснение применимо. Приводимые объяснения носят локальный характер и применимы не везде. Диапазон применимости называется покрытием. Было бы хорошо оценить охват объяснений.

Вот пример, основанный на наборе данных adult из библиотеки lime, разработанной авторами метода.

import lime
import sklearn
data = # load adult dataset
categorical_features = [1,3,5,6,7,8,9,13]
categorical_names = {}
for feature in categorical_features:
    le = sklearn.preprocessing.LabelEncoder()
    le.fit(data[:, feature])
    data[:, feature] = le.transform(data[:, feature])
    categorical_names[feature] = le.classes_
X_train, X_test, y_train, y_test = train_test_split(data)
rf = sklearn.ensemble.RandomForestClassifier().fit(X_train, y_train)
explainer = lime.lime_tabular.LimeTabularExplainer(X_test,
																									 feature_names = feature_names,
																									 class_names=class_names,
                                                   categorical_features=categorical_features, 
                                                   categorical_names=categorical_names,
																									 kernel_width=3)
exp = explainer.explain_instance(test[0], rf.predict, num_features=5)
exp.show_in_notebook(show_all=False)

Более подробную информацию о LIME можно найти в их репозитории.

➕ Плюсы:

  • Полностью независимая от модели
  • Множество участников

➖ Минусы:

  • Включение нереалистичных экземпляров данных
  • Неясность выбора ширины ядра
  • Неясное покрытие

Якорь

Создатели LIME активны в области интерпретируемости моделей машинного обучения. В 2018 году, через два года после публикации оригинальной статьи о методе LIME, они представили исследование под названием «Якоря: высокоточные модели-независимые объяснения» на мероприятии AAAI в разделе «Взаимодействие человека с компьютером». Авторы представили новую систему, не зависящую от модели, которая объясняет поведение сложных моделей с помощью высокоточных правил, называемых якорями, которые представляют локальные, «достаточные» условия для прогнозов.

Важно помнить о причинах, по которым создатели этой очень популярной библиотеки опубликовали новую, последующую статью. В статье Anchor M.T. Ribeiro et al. предположил, что было неясно, как оценить охват локально точных интерпретаций, произведенных местными суррогатами. Они предоставили представление о поведении модели, но те же объяснения нельзя было использовать за пределами локальной окрестности объясненного образца, и объем локальной близости был не совсем ясен. Если эта область не ясна, объяснение может быть неправильно использовано за пределами этой области и, скорее всего, приведет к неверному выводу. Чтобы преодолеть вышеупомянутую проблему, Ribeiro et al. разработали новый метод, который они назвали Anchor. Они попросили группу из 26 студентов, изучающих машинное обучение, сделать прогнозы относительно новых образцов, учитывая объяснения, полученные LIME и Anchor для другой части того же набора данных. Якорь показал более высокую точность и понятность, чем метод LIME, что привело к меньшему времени на прогноз. Но что такое метод якоря? По сути, он генерирует объяснения, называемые «якорями». Эти якоря являются частью объясненного образца, прикрепляя его к определенной этикетке, созданной моделью для этого объясненного образца. По сути, каждая привязка - это набор предикатов, называемых A, присутствующих в объясненном примере. Эти предикаты могут быть в любой форме и обычно зависят от типа объясняемых данных. Набор предикатов называется якорем, если он привязывает образец к метке. Другими словами, если мы изменим выборку разными способами в соответствии с некоторым распределением возмущений, которое мы назовем D, не нарушая предикатов, метка не будет t change, значит, мы нашли свой якорь.

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

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

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

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

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

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

Алгоритм можно считать дорогостоящим с точки зрения вычислений, поскольку для оценки точности каждого возможного объяснения требуется вызов функции прогнозирования для данных, выбранных из *** D (z | A) ***.

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

Для решения этой проблемы многорукого бандита используется алгоритм KL-_LUCB. Этот алгоритм берет пул якорей и «вытягивает» каждый якорь особым образом, чтобы узнать p распределения Бернулли за наименьшее количество попыток. Каждое извлечение оценивает пакет искаженных данных и возвращает точность, вычисленную для этого пакета. После вызова алгоритма KL-LUCB он возвращает либо лучший набор якорей, либо только лучший якорь из текущего пула якорей, в зависимости от того, используется ли жадный поиск или поиск лучей. Если несколько возвращенных якорей удовлетворяют требованиям точности, лучший якорь определяется покрытием.

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

Вот пример объяснений, созданных этим методом для набора данных для взрослых.

Anchor = ['Capital Gain == None',
 'Sex ==  Male',
 'Occupation == Blue-Collar',
 'Capital Loss == None',
 'Hours per week < 84.0',
 'Age < 63.0']
Coverage = 0.081
Precision = 0.982

Более подробную информацию о Anchor можно найти в их репозитории.

➕ Плюсы:

  • Четкое покрытие
  • Гарантированная высокая точность
  • Сами якоря очень выразительны

➖ Минусы:

  • Включение нереалистичных экземпляров данных
  • Код, доступный в исходном репозитории, все еще в разработке

Выводы

[Статья по теме: Новый взгляд на робототехнику: склады нового поколения]

В этой статье я попытался объяснить ключевые методы, связанные с независимой от модели интерпретацией. Мы обсудили плюсы и минусы таких методов, как LIME, Anchor, SHAP, PDP и MDA. В настоящее время я внедряю эти методы в ряде проектов машинного обучения для технологических компаний Кремниевой долины в рамках консалтинговой компании Provectus AI. Отметьте некоторые из самых популярных проектов, которыми я действительно горжусь здесь.

Если у вас есть какие-либо вопросы или предложения, оставьте комментарий или свяжитесь со мной в Twitter или по электронной почте [email protected]

Оригинальный пост здесь.

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