Могу ли я использовать пакет Python SHAP, чтобы получить минимальный вклад в RSquared для каждой функции? - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь воспроизвести пример , и мне было интересно, есть ли способ сделать это с помощью пакета Python Shap. Я не уверен, как использовать LinearExplainer() для получения минимального вклада в RSquared.

Что я пробовал до сих пор:

import sklearn
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import shap
shap.initjs()

X = pd.DataFrame(columns=['x1','x2','x3'], data=[[7,3,6],[9,4,8],[12,5,9],[10,8,12],[20,9,23]])
Y = pd.Series(data=[23,45,68,59,89],name='y')

model = sklearn.linear_model.LinearRegression()
model.fit(X, Y)

explainer = shap.LinearExplainer(model, X)
shap_values = explainer.shap_values(X)

Вывод для shap_values: 1010 *

array([[-40.0032057 , -23.7588602 ,  33.24345503],
   [-22.61050757, -15.27355298,  21.37079252],
   [  3.47853963,  -6.78824577,  15.43446126],
   [-13.9141585 ,  18.66767587,  -2.3745325 ],
   [ 73.04933215,  27.15298308, -67.67417631]])

Может ли кто-нибудь также помочь мне понять / интерпретировать этот вывод?

Заранее спасибо!

1 Ответ

2 голосов
/ 29 января 2020

Я предполагаю, что вы уже знакомы с теоретическими аспектами работы ценностей SHAPely. Я нашел эту и эту ссылку полезной для этой цели.

Приходя к выводу:

array([[-40.0032057 , -23.7588602 ,  33.24345503],
   [-22.61050757, -15.27355298,  21.37079252],
   [  3.47853963,  -6.78824577,  15.43446126],
   [-13.9141585 ,  18.66767587,  -2.3745325 ],
   [ 73.04933215,  27.15298308, -67.67417631]])

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

predictions = model.predict(X)
print (predictions)

>>>
[26.28138914 40.28673197 68.92475512 59.17898486 89.32813891]

У нас есть 3 особенности в данных x1,x2,x3. Для каждой точки данных мы получаем набор из 3 фигурных значений. Эти значения показывают, как каждая из 3 функций влияет на прогноз линейно. Теперь рассмотрим первое значение прогнозирования, т.е. 26,28. Соответствующие значения SHApely: [-40.0032057 , -23.7588602 , 33.24345503]

Эти значения показывают, какое влияние x1 оказывает на прогноз (-40,003), какое влияние оказывает x2 (-23,758) и x3 (33,243). Таким образом, мы можем сделать вывод, что x1 и x2 отрицательно влияют на прогноз, x3 оказывает положительное влияние.

Для дальнейшей проверки этого получим ожидаемое значение как:

print (explainer.expected_value)
>>> 56.8

Это ожидаемое значение - не что иное, как среднее из предсказаний

print (np.mean(predictions))
>>> 56.8

Это указывает на то, что без знания значений x1, x2, x3 мы бы угадали 56.8. Значения SHAPely [-40.0032057 , -23.7588602 , 33.24345503] pu sh это предположение как: 56.8 + (-40.0032057) + (-23.7588602) + 33.24345503 = 26.28138914, что наш окончательный прогноз. Таким образом, для повторения итераций значения SHAPely представляют , насколько каждая из функций линейно влияет на прогноз вдали от среднего значения (предположение)

. Далее вы можете проверить:

print (shap_values.sum(1) + explainer.expected_value)
>>> [26.28138914 40.28673197 68.92475512 59.17898486 89.32813891]

Здесь я беру значения формы для каждой строки и добавляю их к среднему значению, что приводит к прогнозу для этой строки. Это так же, как наши прогнозы. Я надеюсь, что это помогло вам получить интуитивное понимание того, как интерпретировать значения SHAPely

...