Использование SHAP для создания анализа вознаграждений (PRA) - PullRequest
0 голосов
/ 05 октября 2019

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

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

Данные выглядят следующим образом:

import numpy as np
import pandas as pd  
from sklearn.linear_model import LinearRegression
import shap

df_total.columns
Index(['NPS_RAW', 'Q22_1', 'Q22_2', 'Q22_3', 'Q22_4', 'Q22_5', 'Q22_6',
       'Q22_7', 'Q22_8', 'Q22_9', 'Q22_10', 'Q22_11', 'Q22_12', 'Q22_13',
       'Q22_14', 'Q22_15', 'Q22_16', 'Q22_17', 'Q22_18', 'Q22_19', 'Q22_20',
       'Q22_21', 'Q22_22', 'Q22_23', 'Q22_24', 'Q22_25', 'Q22_26', 'Q22_27',
       'Q22_28', 'Q22_29', 'Q22_30'],
      dtype='object')

Результат (NPS_RAW) масштабируется от 10 до 0 (10 = макс. Положительный, 0 = макс. Отрицательный). Все остальные функции масштабируются от 5 до 1 (1 = макс. Положительное, 5 макс. Отрицательное).

Сначала я вычислил линейную регрессию.

X = df_total.drop('NPS_RAW', axis = 1)
Y = df_total['NPS_RAW']

lm = LinearRegression()

fit = lm.fit(X, Y)

Затем я вычислил значения формы:

explainer = shap.LinearExplainer(fit, X, feature_dependence = 'independent')

shap_values = explainer.shap_values(X)

Вот график всех значений формы:

shap.summary_plot(shap_values, X)

enter image description here

Как видите, если значение функции низкое, выходная мощность модели увеличивается (т.е. низкие значения функции увеличивают целевое значение относительносреднее значение цели). Однако я до сих пор не знаю, сильнее ли положительный / отрицательный эффект, чем отрицательный / положительный.

Идея состояла в том, чтобы создать две группы из целевых значений (группа с высокими значениями> 5 и группа с низкими значениями> 5). Я сделал это следующим образом:

# Adding the shap values to the original data frame
df_nps = df_total
df_nps.reset_index(drop=True, inplace=True)

shap_values_df = pd.DataFrame(shap_values, columns = X.columns)
shap_values_df.reset_index(drop=True, inplace = True)
shap_values_df['NPS'] = df_nps['NPS_RAW']

# Creating the groups
shap_values_df.loc[df.NPS_RAW < 5, 'NPS_New'] = 'P'
shap_values_df.loc[df.NPS_RAW > 5, 'NPS_New'] = 'R'

Среднее значение a для каждой функции по группам:

pr = shap_values_df.groupby('NPS_New').mean()
pr = shap_values_df.groupby('NPS_New').mean()

pr.loc[:, ['Q22_2','Q22_19', 'Q22_5', 'Q22_16']]


           Q22_2    Q22_19     Q22_5    Q22_16
NPS_New             
P   -0.484180   -0.462038   -0.289868   -0.162992
R   0.117228    0.111867    0.070182    0.039463

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...