Значения SHAP для линейной модели отличаются от рассчитанных вручнуюPython

Программы на Python
Anonymous
Значения SHAP для линейной модели отличаются от рассчитанных вручную

Сообщение Anonymous »

Я обучаю линейную модель прогнозированию цены на дом, а затем вручную сравниваю расчет значений Шепли со значениями, возвращаемыми библиотекой SHAP, и они немного отличаются.
Насколько я понимаю, это так. что для линейных моделей значение Шепли определяется по формуле:
coeff * features for obs - coeffs * mean(features in training set)

Или, как указано в документации SHAP: coef * (x - X.mean(0)), где i — один объект .
Вопрос в том, почему SHAP возвращает значения, отличные от результатов ручного расчета?
Вот код:
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import shap

X, y = fetch_california_housing(return_X_y=True, as_frame=True)
X = X.drop(columns = ["Latitude", "Longitude", "AveBedrms"])

X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0,
)

scaler = MinMaxScaler().set_output(transform="pandas").fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

linreg = LinearRegression().fit(X_train, y_train)
coeffs = pd.Series(linreg.coef_, index=linreg.feature_names_in_)

X_test.reset_index(inplace=True, drop=True)
obs = 6188

# manual shapley calculation
effect = coeffs * X_test.loc[obs]
effect - coeffs * X_train.mean()

Что возвращает:
MedInc 0.123210
HouseAge -0.459784
AveRooms -0.128162
Population 0.032673
AveOccup -0.001993
dtype: float64

А библиотека SHAP возвращает немного другое:
explainer = shap.LinearExplainer(linreg, X_train)
shap_values = explainer(X_test)
shap_values[obs]

Вот результат:
.values =
array([ 0.12039244, -0.47172515, -0.12767778, 0.03473923, -0.00251017])

.base_values =
2.0809714707337523

.data =
array([0.25094137, 0.01960784, 0.06056066, 0.07912217, 0.00437137])

Он настроен на игнорирование взаимодействий:
explainer.feature_perturbation

возвращаемся
'interventional'


Подробнее здесь: https://stackoverflow.com/questions/787 ... d-manually

Вернуться в «Python»