Я знаю, что это гибрид теоретического вопроса и проблемы кодирования. Тем не менее, я опубликую это здесь.
Прежде всего, 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)
Как видите, если значение функции низкое, выходная мощность модели увеличивается (т.е. низкие значения функции увеличивают целевое значение относительносреднее значение цели). Однако я до сих пор не знаю, сильнее ли положительный / отрицательный эффект, чем отрицательный / положительный.
Идея состояла в том, чтобы создать две группы из целевых значений (группа с высокими значениями> 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
Как видите, влияние на отрицательные значения сильнее, чем наположительные. Это согласуется с сюжетом выше. Однако, поскольку я рассчитал среднее значение, «выбросы» сильно влияют на результат. Любая идея, если есть реализация для расчета эффекта?