2. SQL 基础回顾:核心语法
在将 SQL 应用于模型可解释性之前,必须牢固掌握其核心语法。本章将系统回顾 SELECT、WHERE、JOIN、GROUP BY、ORDER BY 等基础子句,并结合可解释性场景说明其用途。这些语法是后续构建特征贡献表、SHAP 值聚合、部分依赖图数据提取等操作的基石。
2.1 SELECT 与 FROM:数据检索的起点
SELECT 用于指定要查询的列,FROM 指定数据来源表。在可解释性工作中,常通过 SELECT 提取模型输入特征、预测结果和真实标签。
可解释性场景:从模型评分表中提取特征列与预测概率,用于后续计算特征重要性。
-- 提取特征与预测结果
SELECT
customer_id,
age,
income,
loan_amount,
credit_score,
predicted_default_prob,
actual_default
FROM model_scoring_table
WHERE batch_date = '2025-01-15';
2.2 WHERE:条件过滤与数据切片
WHERE 子句用于按条件筛选行。在模型解释中,常用于聚焦特定数据子集(如高置信度预测、错误分类样本、特定分群),以进行局部解释分析。
| 过滤场景 | SQL 条件示例 | 可解释性用途 |
|---|---|---|
| 高置信度预测 | WHERE predicted_prob > 0.9 |
分析模型最确定的决策模式 |
| 错误分类样本 | WHERE predicted_label != actual_label |
诊断模型失败原因与边界案例 |
| 特定分群 | WHERE income_bracket = 'LOW' |
评估模型在不同群体间的公平性 |
-- 筛选模型预测错误的样本,用于错误分析
SELECT
customer_id,
age,
income,
predicted_default_prob,
actual_default
FROM model_scoring_table
WHERE predicted_default_prob > 0.5
AND actual_default = 0;
2.3 JOIN:关联特征与解释数据
JOIN 用于将多张表按关联键合并。在可解释性流水线中,特征数据、模型输出、SHAP 值、特征描述等通常存储在不同表中,需要通过 JOIN 整合。
实践建议:使用
LEFT JOIN 保留主表所有记录,避免因解释数据缺失导致样本丢失。始终在 ON 条件中使用索引列以提升性能。
-- 将特征数据与 SHAP 解释值关联
SELECT
f.customer_id,
f.age,
f.income,
f.loan_amount,
s.feature_name,
s.shap_value,
s.base_value
FROM feature_table f
LEFT JOIN shap_explanations s
ON f.customer_id = s.customer_id
AND f.batch_date = s.batch_date
WHERE f.batch_date = '2025-01-15';
2.4 GROUP BY:聚合与特征重要性汇总
GROUP BY 将数据按分组列聚合,常配合聚合函数(AVG、SUM、COUNT)使用。在模型解释中,用于计算全局特征重要性、分群平均 SHAP 值、部分依赖图数据等。
-- 计算每个特征的平均绝对 SHAP 值(全局特征重要性)
SELECT
feature_name,
ROUND(AVG(ABS(shap_value)), 4) AS mean_abs_shap,
COUNT(*) AS num_records
FROM shap_explanations
WHERE batch_date = '2025-01-15'
GROUP BY feature_name
ORDER BY mean_abs_shap DESC;
常见陷阱:
GROUP BY 后 SELECT 中的非聚合列必须出现在 GROUP BY 子句中(或为聚合函数包裹),否则在严格 SQL 模式下会报错。在可解释性查询中,务必检查分组粒度是否与解释目标一致。
2.5 ORDER BY:排序与重要性排名
ORDER BY 用于对结果集排序。在可解释性输出中,常按特征重要性降序排列,使最重要的特征优先展示。
-- 按 SHAP 值绝对值降序排列,查看每个样本的特征贡献排名
SELECT
customer_id,
feature_name,
ROUND(shap_value, 4) AS shap_value
FROM shap_explanations
WHERE customer_id = 'CUST1001'
ORDER BY ABS(shap_value) DESC;
2.6 核心语法执行顺序
理解 SQL 子句的逻辑执行顺序,有助于编写高效且正确的可解释性查询。实际数据库优化器可能重排,但逻辑顺序如下:
- FROM — 确定数据源表
- JOIN — 关联多张表
- WHERE — 过滤行级条件
- GROUP BY — 分组
- HAVING — 过滤分组后条件(可选)
- SELECT — 选择列与计算表达式
- ORDER BY — 排序
- LIMIT — 限制返回行数(可选)
2.7 常用聚合函数与可解释性映射
| 聚合函数 | 可解释性用途 | 示例场景 |
|---|---|---|
AVG() |
计算平均特征贡献 / 平均预测值 | 全局平均 SHAP 值 |
SUM() |
累加特征贡献至总预测 | 验证 SHAP 值加和等于预测偏差 |
COUNT() |
统计样本量 / 特征出现频次 | 分群样本计数 |
ABS() |
取绝对值计算贡献幅度 | 平均绝对 SHAP 重要性 |
MAX() / MIN() |
识别最大/最小贡献特征 | 单个样本的主导特征 |
2.8 综合示例:构建特征重要性报表
以下综合查询整合了 JOIN、GROUP BY、ORDER BY 和聚合函数,生成一份可直接用于模型解释报告的特征重要性表。
-- 生成全局特征重要性报表
SELECT
s.feature_name,
COUNT(DISTINCT s.customer_id) AS num_samples,
ROUND(AVG(s.shap_value), 4) AS mean_shap,
ROUND(AVG(ABS(s.shap_value)), 4) AS mean_abs_shap,
ROUND(STDDEV(s.shap_value), 4) AS std_shap
FROM shap_explanations s
JOIN feature_metadata m
ON s.feature_name = m.feature_name
WHERE s.batch_date = '2025-01-15'
AND m.is_active = 1
GROUP BY s.feature_name
HAVING COUNT(DISTINCT s.customer_id) > 100
ORDER BY mean_abs_shap DESC
LIMIT 20;
可解释性要点:
mean_abs_shap 反映特征的平均贡献幅度,是全局特征重要性的常用指标。std_shap 反映贡献的稳定性——标准差大说明该特征在不同样本间影响差异显著,值得进一步做局部解释分析。