当前位置: 首页 > news >正文

代理 SHAP:使用更简单的模型加速可解释性

原文:towardsdatascience.com/proxy-shap-speed-up-explainability-with-simpler-models-1aab91b79f9f

数据科学家喜欢做实验、训练模型,并让他们的手在数据上变得“脏”。在项目开始时,热情高涨,但当事情变得复杂或耗时过长时,寻找更简单的解决方案是真正的必需。

可能会有这样的情况,商业利益相关者要求修改底层解决方案逻辑或在进行性能改进和保持预测算法良好解释性水平的同时进行进一步的调整/试验。识别代码实现中可能导致的额外复杂性和交付最终产品延迟的瓶颈至关重要。

想象一下,你是一名数据科学家,你的任务是开发一个预测模型。我们很容易就得到了所有需要的东西,过了一段时间,我们就准备好向商业人士展示我们基于数千个特征和数百万条记录构建的令人惊叹的预测解决方案。

商业利益相关者对我们的演示感到着迷,并理解了这项技术的潜力,但他们提出了一个要求。他们想知道模型是如何做出决定的。我们可能会认为这很简单…

让我们在代码中导入shap。添加一些花哨的彩色图表,然后回到商业人士那里去炫耀。

当我们回到电脑前,我们首先尝试获取每个预测样本的特征贡献(SHAP 值),但我们注意到当涉及数千个特征和数百万条记录时,SHAP 的计算非常慢。这可能是我们预测解决方案在实时应用中预测和提供解释时可能遇到的一个严重问题。我们迫切需要找到一种解决方案来加速 SHAP 值的计算,同时避免降低模型性能和昂贵的工作重构。

在本文中,我们提出了一种方法,该方法根据我们模型学习到的知识生成可靠的 SHAP 值,并且足够快,不会让最终用户等待过久。

SHAP 时间作为模型复杂度的函数

每个人在他们的数据科学之旅中都可能需要使 SHAP 变得更快,但是什么让 SHAP 变得如此慢?这是一个有趣的问题,我们通过实证研究来探讨。

给定三种不同的梯度提升预测算法(Xgboost、LightGBM 和 CatBoost),我们追踪了在训练阶段获取 SHAP 所需的时间,这涉及到三个参数:数据大小、三个深度以及训练阶段涉及的估计量/迭代次数。

<…/Images/a478e3fd04dd9a173fd78a37138f7e42.png>

Shap 时间性能随数据大小和提升迭代次数的变化[图片由作者提供]

<…/Images/838b0e886b47400ed179b70d381ba57f.png>

Shap 时间性能随数据大小和深度的变化[图片由作者提供]

如我们所想,我们使用的数据越多,这个过程持续的时间就越长。计算时间也与估计量/迭代次数线性相关,同时与参与提升的决策树深度的规模呈指数相关。

根据上述观察,我们如何在不牺牲我们最佳模型获得的 SHAP 洞察力的情况下使这个过程更快?

构建代理 SHAP

我们训练的模型,我们假设是 CatBoost,现在可供我们使用,并且其性能让我们满意。我们花费时间和精力来优化它。使用较少的迭代和深度维度重复整个训练/优化过程可能会浪费时间,因为这很可能会降低预测性能。

importcatboostasctbfromsklearnimportmodel_selection CV=model_selection.KFold(5,shuffle=False)model=model_selection.RandomizedSearchCV(ctb.CatBoostRegressor(verbose=0,thread_count=-1,random_state=123),{'n_estimators':stats.randint(1,300),'depth':[4,6,8,10]},random_state=123,n_iter=20,refit=True,cv=CV,scoring='neg_mean_absolute_error').fit(X_train,y_train)

关于训练一个新轻量级模型,该模型优化以模拟我们原始模型的 SHAP 贡献,这个想法听起来很有趣。让我们试试看。

用于获得以下结果的数据集是 scikit-learn 中直接可用的"加利福尼亚住房",原始数据可在这里找到,由 Pace, R. Kelley 和 Ronald Barry 在 1997 年的《Statistics and Probability Letters》第 33 期上发表,标题为《Sparse Spatial Autoregressions》。

作为第一步,我们需要检索一些训练样本的 SHAP 值。它们将作为我们较轻模型的“真实”集。

classShapCatBoostRegressor(ctb.CatBoostRegressor):defpredict_shap(self,X):returnself.get_feature_importance(ctb.Pool(X),type='ShapValues')ref_shap_val=model_selection.cross_val_predict(ShapCatBoostRegressor(**model.best_params_,verbose=0,thread_count=-1,random_state=123),X_train,y_train,method='predict_shap',cv=CV)shap_feat_importance=np.abs(ref_shap_val[:,:-1]).mean(0)shap_feat_importance/=shap_feat_importance.sum()

其次,我们通过改变深度和迭代次数来训练较小的模型。我们正在寻找一个新的模型,它能更快、更可靠地重现 SHAP 值。对于深度和迭代的每一种组合,都会检索 SHAP 值并与我们更深的模型产生的原始 SHAP 值进行比较。SHAP 值的良好程度使用标准误差指标如 R2 来衡量。这样,我们最终为每个特征得到一个错误分数,该分数是原始 SHAP 值和近似 SHAP 值之间的差异。最终和独特的分数是特征 R2 的平均值(同样也可以按样本进行)。我们给对我们原始模型更重要的特征的错误指标分配更多的权重。

importdatetimeimportitertools param_combi={'iters':range(5,125,5),'depth':range(1,8)}fori,dinitertools.product(*param_combi.values()):start_time=datetime.datetime.now()shap_val=model_selection.cross_val_predict(ShapCatBoostRegressor(n_estimators=i,depth=d,verbose=0,thread_count=-1,random_state=123),X_train,y_train,method='predict_shap',cv=CV)end_time=datetime.datetime.now()delta=(end_time-start_time).total_seconds()result.append({"time":delta,"iters":i,"depth":d,"r2_feat_shap":np.average(metrics.r2_score(ref_shap_val[:,:-1],shap_val[:,:-1],multioutput='raw_values').round(3)weights=shap_feat_importance),"r2_sample_shap":metrics.r2_score(ref_shap_val[:,:-1].sum(1),shap_val[:,:-1].sum(1)),})result=pd.DataFrame(result)

检查搜索过程的结果,我们可以观察到以下情况:

<…/Images/9318d618521df1ffe1b09206686be997.png>

<…/Images/9318d618521df1ffe1b09206686be997.png>

<…/Images/a898dfc04746acd72422a303fc24b121.png>

左侧,R2 Shap 特征得分与提升深度的关系。右侧,Shap 计算时间与提升深度的关系[图片由作者提供]

随着迭代次数或深度的增加,计算 SHAP 值所需的时间增加,SHAP 近似(R2)的准确性更高。这个结果并不令人惊讶,但证实了我们的初步假设。

<…/Images/e8f13cd0869e07c1924966fb63691ed6.png>

R2 Shap 特征得分和所有参数组合的 Shap 计算时间[图片由作者提供]

最佳逼近 SHAP 计算的模型是在准确性和时间之间取得最佳平衡的模型。根据我们想要优先考虑的内容,可以更多地赋予准确性或时间权重。

defdistance(time,r2,w_time=0.1,w_r2=0.9):return((time-result.time.min())**2)*w_time+((result.r2_feat_shap.max()-r2)**2)*w_r2 result['distance']=result.apply(lambdax:distance(x.time,x.r2_feat_shap),axis=1)result=result.sort_values('distance')proxy_model=ctb.CatBoostRegressor(n_estimators=result.head(1).iters.squeeze(),depth=result.head(1).depth.squeeze(),verbose=0,thread_count=-1,random_state=123,).fit(X_train,y_train)

<…/Images/87057cca8c86dfeb4c5b6f63717ad3ec.png>

最佳参数组合[图片由作者提供]

从大约 3 秒到大约 3 微秒,我们在 10k 样本测试集上计算 SHAP 值所需的时间上明显受益。

<…/Images/e750d815025499f19c81b3f826c4b3c2.png>

计算 shap 所需时间[图片由作者提供]

最后的比较,在原始模型和代理模型之间,也显示了代理 SHAP 值如何很好地近似未见数据中的真实值,尤其是在最重要的特征上。

<…/Images/4ae483c2b3d0cef5026a740825cf628d.png>

原始数据与代理 Shap 值比较[图片由作者提供]

<…/Images/ef1ce21725569c9bf26b510d63dd003a.png>

原始数据与代理 Shap 值比较[图片由作者提供]

摘要

在本文中,我们提出了一种使用更简单、更轻量级的模型来计算可靠 SHAP 值的方法。该方法包括训练一个轻量级模型来模拟原始和重型模型的 SHAP 贡献。通过优化深度和迭代等参数,我们实现了速度和准确性的平衡。这显著减少了计算时间,同时保持了可靠的 SHAP 值近似,为实时预测应用提供了一种实用的解决方案。


检查我的 GitHub 仓库

保持联系:领英

http://www.jsqmd.com/news/395580/

相关文章:

  • 5个极简方法掌握M3U8视频下载:零基础用户必备指南
  • 掌握精准选择:3D编辑效率提升300%的实战技巧
  • Switch RCM模式深度应用指南:从设备检测到系统定制
  • 2026年2月温州自动封口机优质厂家深度解析与推荐 - 2026年企业推荐榜
  • Revelation光影包:突破Minecraft视觉极限的渲染革命
  • 2026年成都石膏板采购指南:深度评测与厂家选择策略 - 2026年企业推荐榜
  • 3个步骤解决加密音频格式转换难题:qmc-decoder开源工具全解析
  • 2026年小动物超声维修服务商综合实力盘点与选型指南 - 2026年企业推荐榜
  • 解锁tModLoader自定义命令全指南:从入门到精通的泰拉瑞亚模组开发
  • Wallpaper Engine资源提取与格式转换完全指南:突破PKG文件限制的开源解决方案
  • 开源工具QMCDecode:三步解锁加密音频的跨平台自由
  • ComfyUI-Florence2模型加载故障深度修复与系统优化指南
  • 3个技术方案:解决NCM格式限制的高效解密方法
  • 告别游戏肝帝:ok-wuthering-waves智能工具解放你的游戏时间
  • 生产环境别再双击HTML了!用http-server避开MIME陷阱的开发真相最佳实践与性能优化
  • 老游戏卡顿?WarcraftHelper让魔兽争霸3重获新生
  • 老款Mac升级完全指南:让经典设备重获新生
  • 2026河南中老年五红牛奶选购指南与实力厂商评测 - 2026年企业推荐榜
  • 徐州轴连轴承可靠厂家盘点:五家实力公司解析 - 2026年企业推荐榜
  • NCM格式解密与音乐格式转换完全指南:从基础操作到专家级应用
  • 北京地区矿物质净水设备优质供应商盘点 - 2026年企业推荐榜
  • 3步打造专属游戏优化方案:DLSS Swapper开源工具的创新应用
  • 从复杂到简单:AHP 层次分析法在生活与管理决策中的应用
  • FastbootEnhance革新性全流程解决方案:攻克Android设备管理技术壁垒
  • AVIF图像编码优化技术:下一代图像格式在专业设计工作流中的应用解析
  • 3步解锁ObjToSchematic的3D模型转方块世界能力
  • 三步解锁原神抽卡数据掌控:用genshin-wish-export实现抽卡自由
  • 2026年深圳办公室净水器选购指南与优质厂家深度解析 - 2026年企业推荐榜
  • promptrefiner:使用 GPT-4 为您的本地 LLM 创建完美的系统提示
  • 2026年深圳净水器优质厂家深度解析与选购指南 - 2026年企业推荐榜