mcpField
S
sklearn-explainability

sklearn-explainability

github.com/tondevrel数据与数据库2470 次安装38 周前更新
代码仓库

关于 sklearn-explainability

sklearn-explainability 是解读 scikit-learn 模型预测和特征影响的指南,适合需要验证模型可靠性的研究者与实践者。它结合内置检查方法、SHAP,以及对数据泄漏、稳定性和特征相关性的检查。

主要功能

  1. 01在测试数据上计算置换重要性
  2. 02部分依赖与交互图
  3. 03局部和全局解释方法
  4. 04基于 SHAP 的解读模式
  5. 05检查数据泄漏与特征相关性

适用场景

  1. 01确认模型是否使用有意义的特征
  2. 02解释单个预测结果
  3. 03发现潜在数据泄漏或不稳定的重要性
  4. 04检查科学模型中的特征交互

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tondevrel/scientific-agent-skills --skill sklearn-explainability

安装后在 Claude Code 中输入/sklearn-explainability确认已加载。

详细介绍

scikit-learn - 可解释性与可理解性

在科学研究中,模型的“为什么”和“是什么”同样重要。本指南重点介绍揭示机器学习模型决策过程的工具,确保模型具有科学有效性,而不只是对数据伪影过拟合。

适用场景

  • 验证模型是否使用了具有物理意义的特征(例如,在药物发现中)。
  • 识别模型从训练数据中学到的偏见或“捷径”。
  • 向非专业人士解释单个预测结果(局部解释)。
  • 对复杂系统中的变量进行全局影响排序(全局解释)。
  • 科学审计和法规遵从。

核心原则

1. 模型专用与模型无关
  • 模型专用:如 Random Forest 中的 feature_importances_。速度快,但绑定于特定架构。
  • 模型无关:如 SHAP 或 Permutation Importance。适用于任何模型(SVM、MLP 等),但计算开销更大。
2. 全局解释与局部解释
  • 全局:特征“Temperature”整体上如何影响模型?
  • 局部:为什么模型对这个特定样本预测为“Reaction Failed”?
3. 特征重要性与特征贡献

重要性告诉你模型是否使用了某个特征;贡献则告诉你该特征如何改变输出(正向或负向)。

快速参考:内置检查工具

from sklearn.inspection import permutation_importance, PartialDependenceDisplay

# 1. Permutation Importance (Better than default tree importance)
result = permutation_importance(model, X_test, y_test, n_repeats=10)
print(result.importances_mean)

# 2. Partial Dependence Plots (How one feature affects prediction)
PartialDependenceDisplay.from_estimator(model, X, features=['temp', 'pressure'])

关键规则

✅ 应该做
  • 优先使用 Permutation Importance,而非默认的 RandomForest.feature_importances_ - 默认重要性会偏向基数较高的特征(如唯一 ID)。
  • 使用 PartialDependenceDisplay - 可视化特征与目标之间的关系(线性、指数或 Sigmoid)。
  • 在进行可解释性分析前缩放特征 - 许多模型(如 Logistic Regression)需要缩放特征,才能比较其系数(β)。
  • 检查特征相关性 - 如果两个特征高度相关,重要性会分摊到两者之间,使它们看起来都比实际“没那么重要”。
❌ 不应该做
  • 不要信任未经正则化模型的系数(β) - 系数的高方差可能导致对特征重要性得出错误结论。
  • 不要在训练数据上计算特征重要性 - 始终在测试集上计算,以了解哪些特征确实有助于泛化。
  • 不要混淆相关性与因果关系 - ML 模型显示哪些特征具有预测性,但不一定能说明哪些特征具有因果作用。

解释模式

1. SHAP 集成(黄金标准)
import shap

# Works for any scikit-learn model
explainer = shap.Explainer(model.predict, X_test)
shap_values = explainer(X_test)

# Visualize global importance
shap.plots.bar(shap_values)

# Visualize local explanation for the first sample
shap.plots.waterfall(shap_values[0])
2. 用于科学研究的部分依赖(PDP)
from sklearn.inspection import PartialDependenceDisplay

# Check if the model learned the correct physical law
# (e.g., does the reaction rate increase with temperature?)
fig, ax = plt.subplots(figsize=(8, 4))
PartialDependenceDisplay.from_estimator(model, X, [0, (0, 1)], ax=ax)
# [0] is a 1D plot, [(0, 1)] is a 2D interaction plot
高级:特征贡献(ELI5 风格)

对于单个预测,查看哪些特征将预测推向了哪个类别。

def explain_prediction(model, sample):
    # For linear models, this is: intercept + sum(coef * value)
    prediction = model.predict_proba(sample)
    # ... logic to map coefficients to feature names ...
    pass

实用工作流:验证科学模型

步骤 1:检测“泄漏”特征

如果某个特征的重要性达到 99%,而这并非预期情况,那么它很可能造成了数据泄漏(例如,样本时间戳或 ID)。

步骤 2:稳定性分析

使用不同的随机种子运行置换重要性分析。如果排名靠前的特征变化显著,说明模型不稳定、不可靠。

步骤 3:交互检查

使用 2D PDP 查看模型是否捕捉到了特征之间的交互(例如,只有当 Temperature > 100°C 时,Pressure 才会产生影响)。

常见陷阱

“默认重要性”偏差

在 RandomForest 中,类别较多的特征(如 Serial_Number)看起来非常重要,因为决策树可以围绕它们进行多次分割。

# ✅ Solution: Use Permutation Importance on the test set instead.
多重共线性导致的遮蔽

如果 Feature_A 和 Feature_B 完全相关,模型可能只会使用其中一个。

# ✅ Solution: Use hierarchical clustering on features or check VIF 
# before interpreting importance.

可解释性让机器学习成为真正的科学工具。它帮助研究人员超越“黑盒”,直接从训练好的模型中提取新假设。

评论

支持 Markdown