本节摘要:SOURCE 6.2–6.3 讲解错误分析流程与 LIME、SHAP、注意力可视化。本节教你从 FP/FN 桶里找系统性错误,而非盲目调参。
常见 FN 根因:否定词、方言、新实体;常见 FP:模板化好评、水军。
| 方法 | 粒度 | 特点 |
|---|---|---|
| LIME | 单样本局部 | 模型无关 |
| SHAP | 特征贡献 | 博弈论 Shapley |
| Attention 热图 | 深度学习 | 看模型「关注」词 |
# 概念:LIME 文本解释 # from lime.lime_text import LimeTextExplainer # explainer.explain_instance(text, clf.predict_proba, num_features=10)
TF-IDF+线性模型 → 直接看高权重词;BERT → LIME/注意力;规则系统 → 天然可解释。
⚠️ 常见坑:解释只给领导看,不回流标注手册——同类错误重复出现。
💡 关键直觉:错误分析是连接离线指标与线上体验的桥。
错误分析的第一步是分桶:从混淆矩阵取出误报(FP)与漏报(FN)两个桶,各随机抽样 20 到 50 条人工复盘。复盘的产出不是「模型不行」,而是给每一条错误打标签:是标注错、歧义文本、领域新词、还是模型确实弱。几轮下来通常会发现系统性根因——例如「所有含否定词的样本都预测错」「所有含网络用语的样本都漏报」。找到根因后再决定改数据(修标注、加词典、补样本)还是改模型(加特征、换结构)。
LIME 是模型无关的局部解释:它对输入样本做扰动,观察预测变化,拟合一个可解释的局部模型,输出每个词的贡献。使用细节上,解释器要指定训练好的预测函数,num_features 控制展示多少词,随机种子会影响解释稳定性,所以重要结论要跑多次看一致性。SHAP 基于博弈论 Shapley 值,给出每个特征对预测的边际贡献,支持多种模型,但文本上的 SHAP 通常仍要回到 token 级,计算成本更高。
注意力热图是深度模型的解释手段,但注意「注意力不等于解释」:注意力权重高不代表因果重要,只能作为线索。真正可信的解释要把注意力、LIME/SHAP、人工复盘三者交叉验证。
错误分析的结论一定要回流:发现「标注错」就回到第 2 章修手册并重标;发现「领域新词」就更新词典与数据;发现「模型弱」再考虑换架构。如果只分析不改,分析就是一次性的自我安慰。建议把每轮错误分析的根因分布写成简报,与算法、数据、产品三方对齐——很多「模型效果差」的争议,最终都落在「数据质量问题」而不是「模型问题」,这个结论需要数据来支撑而不是感觉。
可解释性还有一个现实用途:合规与信任。金融、医疗场景需要向业务方说明「为什么这条被判定为高风险」,此时 LIME 输出词级证据比「深度学习模型」四个字有说服力。预先准备好解释接口,把每类样本的解释样例存档,也能在线上投诉时快速响应。解释性需求应在立项时明确写进需求,而不是上线被追问时再补。
# 概念:FP/FN 分桶与根因打标 from collections import Counter buckets = {"误报FP": [], "漏报FN": []} for text, pred, true in predictions: if pred != true: key = "误报FP" if pred == 1 else "漏报FN" buckets[key].append(text) # 抽样后人工给每条打根因标签 roots = Counter(root_labels) # 例如: "否定词", "网络用语", "标注错误"
| 手段 | 粒度 | 适用场景 | 注意 |
|---|---|---|---|
| FP/FN 分桶 | 样本集合 | 找系统性错误 | 抽样要随机 |
| LIME | 单样本 | 局部解释 | 多跑几次 |
| SHAP | 特征贡献 | 全局/局部 | 计算贵 |
| Attention | 词权重 | 深度模型线索 | 非因果 |
每次错误分析产出一页简报,沉淀可复用的经验。
| 区块 | 内容 |
|---|---|
| 根因分布 | 各根因标签的计数与占比 |
| 典型案例 | 每类根因附 2~3 条例句 |
| 结论 | 改数据 / 改模型 / 改规范 |
| 行动项 | 责任人、截止时间 |
简报要「可执行」:每一条结论都对应一个行动项,例如「把 30 条含否定词的漏报补进训练集」「更新标注手册的中立判据」。下次迭代后回看上次的行动项是否落实、根因是否减少,形成闭环。没有闭环的错误分析,价值会随时间迅速归零。