gpt4 book ai didi

machine-learning - 为什么在 TreeExplainer 中包含训练数据时会得到不同的 expected_value?

转载 作者:行者123 更新时间:2023-12-04 12:09:49 26 4
gpt4 key购买 nike

在 SHAP TreeExplainer 中包含训练数据会给出不同的 expected_value在 scikit-learn GBT 回归器中。
可重现的示例 (在 Google Colab 中运行):

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
import numpy as np
import shap

shap.__version__
# 0.37.0

X, y = make_regression(n_samples=1000, n_features=10, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

gbt = GradientBoostingRegressor(random_state=0)
gbt.fit(X_train, y_train)

# mean prediction:
mean_pred_gbt = np.mean(gbt.predict(X_train))
mean_pred_gbt
# -11.534353657511172

# explainer without data
gbt_explainer = shap.TreeExplainer(gbt)
gbt_explainer.expected_value
# array([-11.53435366])

np.isclose(mean_pred_gbt, gbt_explainer.expected_value)
# array([ True])

# explainer with training data
gbt_data_explainer = shap.TreeExplainer(model=gbt, data=X_train) # specifying feature_perturbation does not change the result
gbt_data_explainer.expected_value
# -23.564797322079635
因此,包括训练数据时的期望值 gbt_data_explainer.expected_value与不提供数据( gbt_explainer.expected_value )的计算完全不同。
当与(明显不同的)各自的 shap_values 一起使用时,这两种方法都是相加的和一致的。 :
np.abs(gbt_explainer.expected_value + gbt_explainer.shap_values(X_train).sum(1) - gbt.predict(X_train)).max() < 1e-4
# True

np.abs(gbt_data_explainer.expected_value + gbt_data_explainer.shap_values(X_train).sum(1) - gbt.predict(X_train)).max() < 1e-4
# True
但我想知道为什么他们不提供相同的 expected_value ,以及为什么 gbt_data_explainer.expected_value与预测的平均值相差很大。
我在这里缺少什么?

最佳答案

显然 shapdata 时,子集为 100 行被传递,然后通过树运行这些行以重置每个节点的样本计数。所以-23.5...报告的是这 100 行的平均模型输出。data传递给 Independent掩蔽器,它进行子采样:
https://github.com/slundberg/shap/blob/v0.37.0/shap/explainers/_tree.py#L94
https://github.com/slundberg/shap/blob/v0.37.0/shap/explainers/_explainer.py#L68
https://github.com/slundberg/shap/blob/v0.37.0/shap/maskers/_tabular.py#L216
运行

from shap import maskers

another_gbt_explainer = shap.TreeExplainer(
gbt,
data=maskers.Independent(X_train, max_samples=800),
feature_perturbation="tree_path_dependent"
)
another_gbt_explainer.expected_value
回到
-11.534353657511172

关于machine-learning - 为什么在 TreeExplainer 中包含训练数据时会得到不同的 expected_value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64821829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com