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

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

В сфере объяснимости мы часто сталкиваемся с двумя важными понятиями:

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

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

В нашем исследовании методов объяснимости мы углубимся в пять конкретных методов: важность признаков, важность перестановок, графики частичной зависимости, LIME (локальные интерпретируемые объяснения, не зависящие от модели) и SHAP (аддитивные объяснения Шепли).

Чтобы сделать наше путешествие практичным и понятным, мы будем работать с набором данных о жилье в Калифорнии. Этот набор данных, к которому мы можем легко получить доступ из библиотеки scikit-learn, содержит информацию о ценах на жилье в разных местах Калифорнии. Я предоставлю коды для каждого графика до отображения графика.

Со всем предоставленным контекстом и установленной важностью объяснимости пришло время засучить рукава и взяться за дело!

Важность функции

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

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import minmax_scale

X_train_scaled = minmax_scale(X_train)

lr_model = LinearRegression()
lr_model.fit(X_train_scaled, y_train)

fi_lr_df = pd.Series(np.abs(lr_model.coef_), index=X.columns).sort_values(ascending=True)
fi_df = pd.Series(model.feature_importances_, index=X.columns).sort_values(ascending=True)

fig, axes = plt.subplots(ncols=2, nrows=1, figsize=(15, 8))
axes = axes.flatten()

for idx, mt in enumerate([('Random Forest', fi_df), ('Linear Regression', fi_lr_df)]):
    _ = mt[1].plot.barh(ax=axes[idx])
    _ = axes[idx].set_title(mt[0])

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

Плюсы:

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

Минусы:

Ограничения алгоритма: важность функции зависит от используемого алгоритма. Разные алгоритмы могут присваивать функциям разную важность, что приводит к разным результатам.

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

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

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

from sklearn.inspection import permutation_importance

r = permutation_importance(model, X_test, y_test, random_state=42, scoring='r2')
pi_df = pd.DataFrame({'features': X.columns, 'pi_mean': r.importances_mean, 'pi_std': r.importances_std}).sort_values(by='pi_mean', ascending=False)

X_test_scaled = minmax_scale(X_test)

lr_r = permutation_importance(lr_model, X_test_scaled, y_test, random_state=42, scoring='r2')
pi_lr_df = pd.DataFrame({'features': X.columns, 'pi_mean': lr_r.importances_mean, 'pi_std': lr_r.importances_std}).sort_values(by='pi_mean', ascending=False)

fig, axes = plt.subplots(ncols=2, nrows=1, figsize=(15, 8))
axes = axes.flatten()

for idx, mt in enumerate([('Random Forest', pi_df), ('Linear Regression', pi_lr_df)]):
    axes[idx] = sns.barplot(x='pi_mean', y='features', orient='h', data=mt[1], ax=axes[idx])
    _ = axes[idx].errorbar(mt[1]['pi_mean'], mt[1]['features'], xerr=mt[1]['pi_std'], fmt='.', color='black')
    _ = axes[idx].set_title(mt[0])

На этом графике, сравнивающем модели случайного леса и линейной регрессии, мы видим, что метод важности перестановки согласуется с тем, что MedInc имеет высокое значение, а также широта и долгота.

Плюсы:

Не требует предположений о распределении данных: это непараметрический метод, который не делает предположений о распределении данных. Это делает его применимым к широкому спектру моделей и типов данных.

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

Учитывает взаимодействие функций: переставляя значения функции, Permutation Importance принимает во внимание взаимодействие с другими функциями в модели. Это помогает зафиксировать совместный вклад функций в производительность модели.

Устойчивость к переоснащению: он менее подвержен переоснащению по сравнению с другими показателями важности признаков, такими как важность, основанная на получении информации (как в случае деревьев решений). Это может обеспечить более надежную оценку важности функций, особенно когда модель сложная или многомерная.

Минусы:

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

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

Зависит от выбранной метрики производительности: она зависит от выбора метрики производительности для оценки модели. Выбор неадекватной или чувствительной к дисбалансу метрики может повлиять на оценку важности функции.

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

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

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

from sklearn.inspection import PartialDependenceDisplay

fig, axes = plt.subplots(ncols=4, nrows=2, figsize=(20, 8))

PartialDependenceDisplay.from_estimator(model, X_train, X_train.columns, ax=axes)

Нанося средний прогнозируемый результат в зависимости от различных значений выбранной функции, PDP предлагают понимание влияния функции на выходные данные модели. Это позволяет нам понять направление, форму и величину взаимосвязи между функцией и целевой переменной. Как мы можем видеть на графиках выше, функция MedInc имеет сильную линейную связь с целью, с другой стороны, AveBedrms и Population не имеют ее.

Плюсы:

Интуитивная визуализация: графики частичной зависимости (PDP) обеспечивают визуальный и интуитивно понятный способ интерпретации взаимосвязи между конкретной функцией и откликом модели. Они позволяют четко и доступно наблюдать за тенденциями, закономерностями и нелинейным поведением.

Минусы:

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

Чувствительность к мультиколлинеарности: если признаки сильно коррелированы (мультиколлинеарность), PDP может не дать надежной интерпретации. На влияние конкретной функции в PDP могут влиять изменения в других коррелированных функциях.

Локальные интерпретируемые объяснения, не зависящие от модели (LIME)

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

Прежде чем использовать LIME, необходимо развернуть наш объяснитель LIME.

from lime.lime_tabular import LimeTabularExplainer

explainer = LimeTabularExplainer(X_train.values, mode='regression', feature_names=X_train.columns)

Поскольку метод LIME поддается объяснению только локально, то объяснение представляет собой интерпретируемость эффекта, который каждая функция оказала на прогнозирование конкретного наблюдения из набора данных:

i = 25
exp = explainer.explain_instance(X_train.values[i], model.predict)

exp.show_in_notebook()

В этом объяснении прогнозируемое значение для этого экземпляра составляет 2,56, и функции MedInc и Latitude были ответственны за его увеличение, а AveOccup и Longitude — за его понижение.

Плюсы:

Локальная объяснимость: предоставляет локальное и подробное объяснение прогнозов модели, позволяя нам понять, как модель приняла конкретное решение для конкретного экземпляра данных.

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

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

Минусы:

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

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

Аддитивные объяснения Шепли (SHAP)

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

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

Как и в случае с LIME, нам также необходимо развернуть наш объяснитель SHAP:

import shap

X100 = shap.utils.sample(X_train, 100)

shap_explainer = shap.Explainer(model.predict, X100)
shap_values = shap_explainer(X_train)

SHAP способен отображать глобальную объяснимость:

shap.summary_plot(shap_values, X_train)

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

Что касается локальной объяснимости:

i = 25

shap.plots.waterfall(shap_values[i])

График выше называется «графиком водопада», и он показывает нам локальную объяснимость, это вклад каждой функции в значение прогноза конкретного наблюдения из набора данных. Как мы видим, MedInc отвечает за увеличение прогноза на 0,68, а AveOccup отвечает за снижение прогноза на 0,44, сумма всех вкладов с использованием ожидаемого прогноза в качестве базы является прогнозируемым значением для этого наблюдения.

Плюсы:

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

Сильная теоретическая основа: основана на прочной математической основе с использованием теории игр для определения важности функций. Это обеспечивает надежную концептуальную основу для интерпретации модели.

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

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

Минусы:

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

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

Заключение

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