SHAP:如何解释 force_plot 的预期值?
SHAP: How do I interpret expected values for force_plot?
我正在尝试为我的随机森林模型创建一个 force_plot,它有两个 类(1 和 2),但我对 [=41] 的参数有点困惑=].
我有两个不同的 force_plot 参数 我可以提供以下内容:
shap.force_plot(explainer.expected_value[0], shap_values[0], choosen_instance, show=True, matplotlib=True)
expected and shap values: 0
shap.force_plot(explainer.expected_value[1], shap_values[1], choosen_instance, show=True, matplotlib=True)
expected and shap values: 1
所以我的问题是:
创建force_plot时,我必须提供expected_value。对于我的模型,我有两个预期值:[0.20826239 0.79173761],我怎么知道要使用哪个?我对期望值的理解是它是我的模型对火车数据的平均预测。是否有两个值,因为我同时拥有 class_1 和 class_2?所以对于 class_1,平均预测是 0.20826239 而 class_2,是 0.79173761?
下一个参数是 shap_values,对于我选择的实例:
index B G R Prediction
113833 107 119 237 2
我得到以下 SHAP_values:
[array([[ 0.01705462, -0.01812987, 0.23416978]]),
array([[-0.01705462, 0.01812987, -0.23416978]])]
不太明白为什么会得到两组SHAP值?一份给class_1,一份给class_2?给定两组 SHAP 值和预期值,我一直在尝试比较我附加的图像,但我无法真正解释预测方面发生了什么。
让我们尝试重现:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from shap import TreeExplainer
from shap.maskers import Independent
from scipy.special import expit, logit
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
model = RandomForestClassifier(max_depth=5, n_estimators=100).fit(X_train, y_train)
那么,您的 SHAP 预期值为:
masker = Independent(data = X_train)
explainer = TreeExplainer(model, data=masker)
ev = explainer.expected_value
ev
array([0.35468973, 0.64531027])
这是您的模型在给定背景数据集(提供给上面的解释器)的情况下平均预测的结果:
model.predict_proba(masker.data).mean(0)
array([0.35468973, 0.64531027])
然后,如果您有感兴趣的数据点:
data_to_explain = X_train[[0]]
model.predict_proba(data_to_explain)
array([[0.00470234, 0.99529766]])
您可以使用 SHAP 值实现完全相同的效果:
sv = explainer.shap_values(data_to_explain)
np.array(sv).sum(2).ravel()
array([-0.34998739, 0.34998739])
请注意,它们是对称的,因为增加 class 1
的几率会减少 0
的几率。
使用基值和 SHAP 值,概率(或数据点最终出现在叶子 0
或 1
中的机会)为:
ev + np.array(sv).sum(2).ravel()
array([0.00470234, 0.99529766])
注意,这与模型预测相同。
我正在尝试为我的随机森林模型创建一个 force_plot,它有两个 类(1 和 2),但我对 [=41] 的参数有点困惑=].
我有两个不同的 force_plot 参数 我可以提供以下内容:
shap.force_plot(explainer.expected_value[0], shap_values[0], choosen_instance, show=True, matplotlib=True)
expected and shap values: 0
shap.force_plot(explainer.expected_value[1], shap_values[1], choosen_instance, show=True, matplotlib=True)
expected and shap values: 1
所以我的问题是:
创建force_plot时,我必须提供expected_value。对于我的模型,我有两个预期值:[0.20826239 0.79173761],我怎么知道要使用哪个?我对期望值的理解是它是我的模型对火车数据的平均预测。是否有两个值,因为我同时拥有 class_1 和 class_2?所以对于 class_1,平均预测是 0.20826239 而 class_2,是 0.79173761?
下一个参数是 shap_values,对于我选择的实例:
index B G R Prediction 113833 107 119 237 2
我得到以下 SHAP_values:
[array([[ 0.01705462, -0.01812987, 0.23416978]]),
array([[-0.01705462, 0.01812987, -0.23416978]])]
不太明白为什么会得到两组SHAP值?一份给class_1,一份给class_2?给定两组 SHAP 值和预期值,我一直在尝试比较我附加的图像,但我无法真正解释预测方面发生了什么。
让我们尝试重现:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from shap import TreeExplainer
from shap.maskers import Independent
from scipy.special import expit, logit
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
model = RandomForestClassifier(max_depth=5, n_estimators=100).fit(X_train, y_train)
那么,您的 SHAP 预期值为:
masker = Independent(data = X_train)
explainer = TreeExplainer(model, data=masker)
ev = explainer.expected_value
ev
array([0.35468973, 0.64531027])
这是您的模型在给定背景数据集(提供给上面的解释器)的情况下平均预测的结果:
model.predict_proba(masker.data).mean(0)
array([0.35468973, 0.64531027])
然后,如果您有感兴趣的数据点:
data_to_explain = X_train[[0]]
model.predict_proba(data_to_explain)
array([[0.00470234, 0.99529766]])
您可以使用 SHAP 值实现完全相同的效果:
sv = explainer.shap_values(data_to_explain)
np.array(sv).sum(2).ravel()
array([-0.34998739, 0.34998739])
请注意,它们是对称的,因为增加 class 1
的几率会减少 0
的几率。
使用基值和 SHAP 值,概率(或数据点最终出现在叶子 0
或 1
中的机会)为:
ev + np.array(sv).sum(2).ravel()
array([0.00470234, 0.99529766])
注意,这与模型预测相同。