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

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

Результат случайного леса / модели XGBoost

Некоторые начинающие специалисты по данным, включая меня, испытывают трудности с интерпретацией результатов сложных моделей, таких как случайный лес или XGBoost. У этих моделей есть так называемая важность функции, которая измеряет влияние функции на прогноз модели. Затем важность этой функции можно представить в виде графика, похожего на график ниже.

В приведенном выше примере можно увидеть, что «Обновления» являются наиболее важной функцией, за ними следуют «Поделиться в Facebook», а затем «Цель». Неизвестно, как эти функции на самом деле влияют на модель, например, приносит ли большее количество репостов в Facebook результат или наоборот? Это невозможно определить, просто взглянув на график важности функции, это причина, по которой был создан SHAP.

ФОРМА

«SHAP (Аддитивные объяснения Шэпли) - это теоретико-игровой подход для объяснения результатов любой модели машинного обучения. Он связывает оптимальное распределение кредитов с местными объяснениями с использованием классических значений Шепли из теории игр и связанных с ними расширений »(документация SHAP).

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

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

Предсказание успеха стартапа с помощью древовидных классификаторов

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

Набор данных, анализируемый в этом примере, называется Набор данных Kickstarter и был взят из www.kaggle.com/tayoaki/kickstarter-dataset.

Это сбалансированный набор данных, который состоит из 18 142 наблюдений и 35 уникальных особенностей.

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

#IMPORTS
import pandas as pd
import datetime as dt
import xgboost as xgb
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV
import warnings
from sklearn import metrics
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier
import shap
warnings.filterwarnings('ignore')
%matplotlib inline

и вот как выглядит набор данных:

Он включает в себя следующие функции: «Идентификатор», «Имя», «URL», «Состояние», «Валюта», «Высшая категория», «Категория», «Создатель», «Местоположение», «Обновления», «Комментарии», «Награды», «Цель», «Заявленные», «Поддерживающие», «Начало», «Конец», «Продолжительность в днях», «Связь с Facebook», «Друзья в Facebook», «Поделиться в Facebook», « Имеет видео »,« Широта »,« Долгота »,« Отметка времени начала (UTC) »,« Отметка времени окончания (UTC) »,« Биография создателя »,« Веб-сайт создателя »,« Создатель - # Создано проектов »,« Создатель - # Поддерживаемые проекты ',' # видео ',' # изображения ',' # слова (описание) ',' # слова (риски и проблемы) ',' # часто задаваемые вопросы '

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

Прекращенные функции: 'Id', 'Name', 'Url', 'Creator', 'Latitude', 'Longitude',
'Start Timestamp (UTC)', ' Отметка времени окончания (UTC) »,« Биография создателя »,
« Местоположение »,« Валюта »,« Веб-сайт создателя »,« Обязательство »,« Поддерживающие »,« Начало »,« Конец ».

Специальные функции: «Has_Creator_Website», «Average_Pledge_per_Backer», «Start_Month», «End_Month», «Was_missing _ # _ Projects_Backed»

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

Как указывалось ранее, можно увидеть, что «Обновления» являются наиболее важной функцией, за ними следуют «Поделиться в Facebook», а затем «Цель». Неизвестно, как эти особенности на самом деле влияют на модель. Теперь посмотрим, что может сказать нам SHAP.

ФОРМА

Настроить SHAP очень просто, пользователю нужно только инициализировать его, загрузив соответствующий классификатор и получив значения SHAP.

#CALLING SHAP TREE EXPLAINER
explainer = shap.TreeExplainer(final_clf)
#GETTING SHAP VALUES
shap_values = explainer.shap_values(X_train)
#INITIATING SHAP
shap.initjs()

Теперь, когда у нас есть значения SHAP, мы можем приступить к построению графиков! Начнем со сравнения графиков важности функций.

Видно, чем отличаются два сюжета. SHAP определила, что наиболее важной особенностью модели является «Цель», за которой следуют «Average_Pledge_per_Backer» и «Facebook Shares. '. Теперь давайте посмотрим, как эти функции на самом деле влияют на модель. Сводный график SHAP может дополнительно показать положительные и отрицательные отношения предикторов с целевой переменной. Этот график состоит из всех точек данных поезда. Он демонстрирует следующую информацию:

  • Важность функции: переменные ранжируются в порядке убывания.
  • Влияние: горизонтальное расположение показывает, связано ли влияние этого значения с более высоким или более низким прогнозом.
  • Исходное значение: цвет показывает, является ли эта переменная высокой (красным) или низкой (синим) для данного наблюдения.
shap.summary_plot(shap_values,X_train,show=False)
plt.title('FEATURE IMPORTANCE USING SHAP',fontsize = 15)
plt.show()

Из приведенного выше графика можно сделать следующие выводы.

Вещи, которые увеличивают успешность стартапа:

  • Чем больше денег дает индивидуальный спонсор, тем выше шанс на успех. Количество индивидуальных спонсоров не так важно.
  • Чем больше маркетинг и участие в социальных сетях (количество репостов и комментариев в Facebook), тем лучше.
  • Создано большое количество проектов. У опытного предпринимателя шансы больше, чем у любителя.
  • Чем больше наград, тем лучше.

Вещи, которые снижают успешность стартапа:

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

SHAP также предлагает еще один сюжет под названием «График зависимости». Давайте посмотрим на пример ниже.

shap.dependence_plot('Goal',shap_values,features=X_train,xmax="percentile(95)",
                    alpha=0.4,dot_size=3,interaction_index=None,
                    show=False,)
plt.xlabel('Goal ($)')
plt.title('GOAL DEPENDENCE PLOT',fontsize = 15)
plt.show()

При внимательном рассмотрении «графика зависимости целей» можно ясно увидеть, как высокие цели негативно влияют на результативность модели. Хороший предел цели для кампании составляет около 10 000,00 долларов США.

Есть еще много других сюжетов, таких как водопад, частичная зависимость и точечная диаграмма, на которые я рекомендую вам взглянуть. Для получения дополнительной информации о SHAP посетите его веб-сайт документации по адресу https://shap.readthedocs.io/en/latest/index.html.

Если вы хотите глубже изучить приведенный выше пример, не стесняйтесь заглянуть в мою записную книжку по адресу https://github.com/gabrieljarosi/dsc-mod-3-project-v2-1-onl01-dtsc -pt-041320