如何在SpaCy文本分类模型中使用SHAP?报AttributeError如何解决
问题原因
- 你没有给
shap.Explainer指定文本类型的掩膜器(masker),SHAP默认会将输入当成数值型张量处理,才会对输入的字符串索要shape属性,触发报错。 - 你自定义的预测函数返回嵌套字典列表的格式仅适用于SHAP内置的流水线适配场景,自定义预测函数需要直接返回形状为
(样本数, 类别数)的numpy数组,不需要封装成字典结构。
修正代码
首先调整预测函数输出格式:
import numpy as np import spacy import shap # 加载你训练好的spacy模型 nlp = spacy.load("my_model") def nlp_predict(texts): result = [] for text in texts: prediction = nlp_fn(text) # 原有调用模型获取概率的逻辑保持不变 # 按顺序返回两个类别的概率即可 result.append([prediction["label1"], prediction["label2"]]) # 转换为numpy数组返回 return np.array(result)
然后初始化解释器时指定文本掩膜器,复用你训练时用的spacy分词器保证逻辑一致:
# 定义文本掩膜器,传入spacy原生分词器 masker = shap.maskers.Text(tokenizer=nlp.tokenizer) # 初始化解释器,指定output_names后续可视化会自动显示类别名 explainer = shap.Explainer(nlp_predict, masker=masker, output_names=["label1", "label2"]) # 运行解释不会再报错 shap_values = explainer(["This is an example"])
内容的提问来源于stack exchange,提问作者GSwart
相关产品推荐
相关产品推荐

