如何使用SHAP解释基于Transformer改造的文本回归模型?
使用SHAP解释基于Transformer的文本回归模型
核心思路
SHAP可以直接适配你的回归模型,核心是将模型包装为SHAP可调用的预测函数,再利用文本专用的解释器完成token级别的贡献分析。以下是具体实现步骤:
1. 安装依赖
首先确保安装SHAP库:
pip install shap
2. 包装模型预测函数
SHAP需要一个接受文本列表、输出预测结果的函数。针对你的HuggingFace回归模型,实现如下:
import torch import shap # 定义模型预测函数:输入文本列表,输出回归预测值(numpy格式) def model_predict(texts): # 对输入文本进行tokenize inputs = tokenizer( texts, return_tensors="pt", padding=True, truncation=True, max_length=MAX_LENGTH ) # 关闭梯度计算,提升速度 with torch.no_grad(): outputs = model(**inputs) # 回归模型的logits为(batch_size, 1),转为numpy数组返回 return outputs.logits.detach().numpy()
3. 初始化SHAP解释器
推荐使用shap.Explainer(针对文本场景会自动调用TextExplainer),传入预测函数和tokenizer即可:
# 初始化解释器 explainer = shap.Explainer(model_predict, tokenizer) # 对目标文本计算SHAP值 sample_text = "需要解释的测试文本" shap_values = explainer([sample_text])
4. 可视化解释结果
SHAP提供直观的文本可视化方式,展示每个token对预测分数的贡献:
# 生成token级贡献可视化图 shap.plots.text(shap_values)
- 红色token:提升预测分数的正向贡献
- 蓝色token:降低预测分数的负向贡献
- 图中会显示基准值(背景数据的平均预测分数),所有token的贡献总和加上基准值等于当前文本的预测分数。
优化提示
- 如果模型较大,可指定背景数据集加速计算(取训练集中的部分样本作为参考):
# 用100条训练样本作为背景数据 background_texts = [item["text"] for item in train_dataset[:100]] explainer = shap.Explainer(model_predict, tokenizer, masker=background_texts) - 确保模型已完成训练,未训练的随机模型无法得到有意义的解释结果。
内容的提问来源于stack exchange,提问作者Gevin Hasmitha
相关产品推荐
相关产品推荐

