You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多分类NLP任务的CNN模型正确接入LIME解释工具

问题根因

你遇到的TypeError核心原因是:sklearn.pipeline.make_pipeline要求传入的所有中间步骤必须实现scikit-learn标准的fit()、transform()接口,而Keras原生的Tokenizer、训练好的CNN文本模型都不满足该接口规范,直接套入pipeline必然报错。
LIME的文本解释器本身不要求接入组件符合sklearn接口规范,只需要你提供一个输入为原始文本列表、输出为各类别预测概率矩阵的可调用函数即可,不需要强行封装pipeline。

正确接入步骤
  • 对齐类别映射关系,避免解释时标签错位
  • 编写符合LIME调用要求的预测概率函数
  • 初始化LIME文本解释器
  • 传入待解释文本生成解释结果,输出可视化效果

可直接运行的代码

from lime.lime_text import LimeTextExplainer
import numpy as np
from tensorflow.keras.preprocessing.sequence import pad_sequences

# 1. 对齐类别顺序:必须使用LabelEncoder内置的类别顺序,不能直接用原始数据的unique值
class_names = le.classes_

# 2. 自定义预测函数:输入为原始文本列表,输出为形状为(样本数, 类别数)的预测概率矩阵
def cnn_predict_proba(texts):
    # 分词转序列,逻辑和训练时完全一致
    text_seqs = tokenizer.texts_to_sequences(texts)
    # 序列填充到固定长度,maxlen和训练时使用的参数完全一致
    padded_seqs = pad_sequences(text_seqs, maxlen=maxlen)
    # 返回模型预测的概率结果,关闭冗余日志
    return model.predict(padded_seqs, verbose=0)

# 3. 初始化文本解释器
explainer = LimeTextExplainer(
    class_names=class_names,
    split_expression=r'\W+', # 英文场景按非单词字符切分
    bow=False # CNN捕捉词序信息,关闭词袋模式,解释结果更贴合模型真实逻辑
)

# 4. 加载待解释文本,生成解释结果
test_text = "I have been on this birth control for one cycle. After reading some of the reviews on this type and..."
explanation = explainer.explain_instance(
    test_text,
    cnn_predict_proba,
    num_features=10, # 展示对结果影响最大的10个关键词
    top_labels=3 # 展示预测概率Top3类别的解释
)

# 5. 结果输出
# 打印指定类别下的词贡献度(以预测概率最高的类别为例)
top1_label = explanation.available_labels()[0]
print(f"预测概率最高类别:{class_names[top1_label]}")
print("关键词贡献度(词,权重):")
for word, weight in explanation.as_list(label=top1_label):
    print(f"{word}: {weight:.4f}")

# 保存可视化html文件,浏览器打开即可看到和参考示例一致的高亮效果
# 正向贡献词标橙色,负向贡献词标蓝色,同时展示各类别预测概率
explanation.save_to_file("cnn_text_lime_result.html")

# 如果是Jupyter Notebook环境,可直接内嵌展示
# explanation.show_in_notebook(text=True)
常见踩坑说明
  • 类别顺序不能错:禁止直接传入df_complete['forwarder_name'].unique()作为class_names,因为LabelEncoder会对类别做排序,直接传入原始unique值会导致类别和预测概率索引错位,解释结果完全失效,必须使用le.classes_获取编码后的类别顺序。
  • 预测函数的输入必须是文本列表:LIME生成扰动样本时会批量传入文本列表,不要把函数写成仅支持单条字符串输入的格式。
  • 预处理逻辑必须和训练时完全一致:分词、填充长度等参数不能随意修改,否则输入分布和训练时不匹配,预测结果本身错误,解释没有意义。
  • 英文文本场景建议将bow参数设为False:词袋模式会打乱文本词序,和CNN捕捉词序特征的推理逻辑不符,会导致解释结果偏差。

内容的提问来源于stack exchange,提问作者Test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:57:23