解释树模型的损失

解释模型的损失对于调试和模型监控非常有用。这个笔记本提供了一个非常简单的示例,展示了它是如何工作的。请注意,解释模型的损失需要传递标签,并且仅支持 TreeExplainer 的 feature_perturbation="independent" 选项。

一旦我们发布这种方法的完整描述,这个笔记本将会被充实。

[1]:
import numpy as np
import xgboost

import shap

训练一个 XGBoost 分类器

[2]:
X, y = shap.datasets.adult()

model = xgboost.XGBClassifier()
model.fit(X, y)

# compute the logistic log-loss
model_loss = -np.log(model.predict_proba(X)[:, 1]) * y + -np.log(
    model.predict_proba(X)[:, 0]
) * (1 - y)

model_loss[:10]
[2]:
array([8.43880873e-04, 2.47898608e-01, 1.17997164e-02, 7.11527169e-02,
       6.41849875e-01, 1.76084566e+00, 5.70287136e-03, 8.60033274e-01,
       4.78262809e-04, 6.43801317e-03])

使用 TreeExplainer 解释模型的对数损失

注意,模型的损失 expected_value 取决于标签,因此它现在是一个函数而不是一个单一的数值。

[3]:
explainer = shap.TreeExplainer(
    model, X, feature_perturbation="interventional", model_output="log_loss"
)
explainer.shap_values(X.iloc[:10, :], y[:10]).sum(1) + np.array(
    [explainer.expected_value(v) for v in y[:10]]
)
[3]:
array([8.43887488e-04, 2.47898585e-01, 1.17997435e-02, 7.11527711e-02,
       6.41849874e-01, 1.76084475e+00, 5.70285151e-03, 8.60033255e-01,
       4.78233521e-04, 6.43796897e-03])