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 子句的逻辑执行顺序,有助于编写高效且正确的可解释性查询。实际数据库优化器可能重排,但逻辑顺序如下:

  1. FROM — 确定数据源表
  2. JOIN — 关联多张表
  3. WHERE — 过滤行级条件
  4. GROUP BY — 分组
  5. HAVING — 过滤分组后条件(可选)
  6. SELECT — 选择列与计算表达式
  7. ORDER BY — 排序
  8. LIMIT — 限制返回行数(可选)
SQL 子句逻辑执行顺序 1. FROM 2. JOIN 3. WHERE 4. GROUP BY 5. HAVING 6. SELECT 7. ORDER BY 可解释性应用说明 • FROM: 指定特征/评分表 • JOIN: 关联SHAP/特征描述 • WHERE: 过滤特定分群/错误样本 • GROUP BY: 聚合特征重要性 • HAVING: 筛选高重要性特征 • SELECT: 提取特征/贡献值 • ORDER BY: 按重要性排序输出

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 反映贡献的稳定性——标准差大说明该特征在不同样本间影响差异显著,值得进一步做局部解释分析。