Isolation Forest使用SHAP时base value与预测值超出范围问题求解
Isolation Forest结合SHAP分析时base value与预测值异常偏大的问题解答
问题产生原因
- SHAP的
TreeExplainer默认读取Isolation Forest树模型的原始决策路径输出值,而非sklearn封装的predict/decision_function输出的归一化异常分数,这类原始决策值的数值范围远大于大家常规认知的[-1,1]分类标签、或是[0,1]归一化异常分数区间,所以看起来数值超出合理范围。 - 代码中存在特征矩阵不匹配问题:计算SHAP值时传入的输入是
df,但生成force_plot时传入的特征展示矩阵是S.iloc[[j]],如果df和S的特征维度、特征顺序不一致,会导致SHAP值计算对齐错误,进一步放大数值偏差。 - 代码中添加了
check_additivity=False参数,该参数的作用是跳过SHAP的加性校验,说明本身SHAP值计算就存在和模型输出不对齐的误差,强制跳过校验后得到的base value和SHAP值本身就不符合预期,自然会出现数值异常。
解决方法
- 初始化
TreeExplainer时指定输出对齐目标,让SHAP的输出和sklearn Isolation Forest的归一化异常分数对齐:
# 明确指定explainer输出对齐模型的decision_function归一化结果 explainerModel = shap.TreeExplainer(model, model_output='decision_function')
- 统一特征输入矩阵,保证计算SHAP值的输入矩阵和force_plot中用于展示的特征矩阵完全一致,要么都用
df,要么都用预处理后对齐维度和特征顺序的S,避免特征不匹配的问题。 - 先移除
check_additivity=False参数,优先排查参数和输入问题保证加性校验通过,不要直接跳过校验掩盖底层错误。 - 如果仅需要展示相对特征贡献,不需要对齐原始异常分数,可自行对base value和SHAP值做归一化处理后再传入force_plot,保证数值落在合理展示区间。
内容的提问来源于stack exchange,提问作者Kath
相关产品推荐
相关产品推荐

