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

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

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

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

Именно здесь мы будем изучать ключевую область машинного обучения под названием LIME (Local Interpretable Model-Agnostic Explanations). С помощью этой библиотеки мы должны понять, почему модель дала то или иное решение на новом тестовом образце. Благодаря мощности прогнозов самых сложных моделей вместе с LIME мы должны иметь возможность использовать эти модели при прогнозировании в реальном времени с интерпретируемостью. Давайте теперь начнем с кода о том, как мы могли бы использовать интерпретируемость из LIME. Обратите внимание, что существуют и другие подходы, такие как SHAP, которые также можно использовать для интерпретируемости, но мы просто придерживаемся LIME для облегчения понимания.

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

Реализация кода LIME

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

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

conda install -c conda-forge lime

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

pip install lime-python

Импорт библиотек

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

import lime       # Library that is used for LIME
from sklearn.model_selection import train_test_split # Divides data
from sklearn.preprocessing import StandardScaler  # Performs scaling
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR 

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

Помимо библиотеки LIME, мы также импортировали список дополнительных библиотек из scikit-learn. Давайте объясним функции каждого из упомянутых выше пакетов в ячейке кодирования.

Мы используем «train_test_split», чтобы в основном разделить наши данные на обучающую и тестовую части.

Мы используем "StandardScaler", чтобы преобразовать наши объекты таким образом, чтобы они имели нулевое среднее и единичное стандартное отклонение. Это может быть удобно, особенно если мы используем модели дистанционного машинного обучения, такие как KNN (K ближайших соседей) и некоторые другие.

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

Точно так же мы также используем дополнительную модель под названием Регрессор опорных векторов, которая в нашем случае называется «SVR» соответственно.

Чтение данных

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

from sklearn.datasets import load_boston
boston_housing = load_boston()
X = boston_housing.data
y = boston_housing.target

Разработка функций

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

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 101)
scaler = StandardScaler()
scaler.fit(X_train)
X_train_transformed = scaler.transform(X_train)
X_test_transformed = scaler.transform(X_test)

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

Прогнозы машинного обучения

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

model = LinearRegression()   # Using the Linear Regression Model
model.fit(X_train_transformed, y_train)  # Train the Model
y_predictions = model.predict(X_test_transformed) # Test the Model

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

model = SVR()
model.fit(X_train_transformed, y_train)
y_predictions = model.predict(X_test_transformed)

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

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

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

from lime import lime_tabular
explainer = lime_tabular.LimeTabularExplainer(X_train, mode = "regression", feature_names = boston_housing.feature_names)
explanation = explainer.explain_instance(X_test[0], model.predict, num_features = len(boston_housing.feature_names))
explanation.show_in_notebook()

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

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

Судя по рисунку, наша модель спрогнозировала цену дома на уровне 40,11 долл. США на основе значений характеристик, заданных тестовым экземпляром. Можно было видеть, что если параметр LSTAT был ниже 7,51, это привело к увеличению нашего прогноза цены дома примерно на 6,61 долл. США. Что касается аналогичного аргумента, то при значении CHAS, равном 0, наша модель прогнозировала на 3,77$ меньше, чем должно было быть предсказано. Таким образом, мы получаем хорошее представление об особенностях и их условиях, ведущих к предсказаниям модели.

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

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

https://suhas-maddali007.medium.com/membership

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

GitHub: suhasmaddali (Сухас Маддали) (github.com)

LinkedIn: (1) Сухас Маддали, Северо-восточный университет, наука о данных | LinkedIn

Среда:Сухас Маддали — среда