尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

被导师质疑“黑箱模型“后,我用SHAP给PFAS源解析模型“开灯“了

被导师质疑“黑箱模型“后,我用SHAP给PFAS源解析模型“开灯“了 组会汇报的时候我导盯着我那张随机森林的特征重要性柱状图看了十秒钟问了一句“你这个模型凭什么这么判重要性排序换个随机种子就变你让我怎么信”我当场哑了。做PFAS溯源的人应该都懂这种尴尬PMF跑出来的因子好歹能掰扯出这是消防泡沫源“这是氟化工源”换成机器学习模型精度是上去了但审稿人一问可解释性就露怯。这篇文章就记录一下我后来怎么用SHAP把黑箱撬开一条缝的包括踩过的四个坑。为什么PFAS溯源要上ML全氟和多氟烷基物质PFAS的溯源难点在于单体之间高度共现、同源物质浓度强相关而且不同源的特征谱在环境介质里会被稀释、吸附、降解过程抹花。传统受体模型PMF、CMB假设源谱线性叠加碰上非线性过程就容易给出混合因子。机器学习不假设线性能直接从数据里学模式所以我当时的思路是先用聚类或分类模型判断样品属于哪类污染场景再用回归模型预测关键单体的浓度贡献。模型能跑通问题只在说不清为什么。SHAP到底在解释什么SHAPSHapley Additive exPlanations的核心思想来自博弈论里的Shapley值把每个特征当成玩家计算它对预测结果的边际贡献然后按贡献分摊。好处是三个一是加法可分解——所有特征的SHAP值加起来加上基线值正好等于模型预测值二是单位与预测目标一致比如预测的是PFOA的log浓度SHAP值就是这个单体让预测高了0.3个log单位三是对每个样本都能解释不像特征重要性只给全局一张图。我用的代码很简单importshapfromsklearn.ensembleimportRandomForestRegressor modelRandomForestRegressor(n_estimators500,max_depth8,random_state42)model.fit(X_train,y_train)# X: 各PFAS单体log10浓度, y: 目标单体浓度explainershap.TreeExplainer(model)shap_valuesexplainer.shap_values(X_test)坑一默认Explainer慢到怀疑人生第一次我老老实实写shap.Explainer(model, X_sample)结果在我那台实验室电脑上跑了二十分钟没出图。查了文档才反应过来Explainer对树模型默认会走TreeExplainer但对非树模型会退化成 permutation 式的暴力估算样本稍微多一点就爆炸。树模型直接指定TreeExplainer毫秒级出结果。这是最蠢也最常见的坑浪费了我一个下午。坑二PFAS单体共线性太强SHAP值会分摊这是最核心的坑。PFAS单体浓度矩阵的相关性高到离谱——同源的单体相关系数能到0.9以上。随机森林在高度相关的特征之间选分裂点时是随机的SHAP值也会在这组相关特征之间来回分摊这周跑出来是A单体重要下周可能就是B单体这就是我导看到排序不稳定的真正原因。我的处理办法建模前先对单体做层次聚类用相关性距离每簇只留一个代表特征进模型。这既是降维也是给解释性去噪——至少SHAP图上不会出现两个功能上等价的特征互相抢功劳。另外相关性强的特征在SHAP里还会出现依赖图扭曲解读时要小心别把共线特征的单体贡献当成独立贡献写进论文。坑三样品量小单个样本的SHAP图别当结论环境监测的样品量大家都懂我手上这批水样也就几十个点。SHAP值本身是稳定的数学量但模型在小样本上拟合不稳定解释也跟着抖。我的做法交叉验证的每一折里单独训练、单独算SHAP最后把各折的SHAP值合并统计重要的结论比如XX单体是主要驱动要求在不同折里方向一致才敢写进文章。单个样品的waterfall图只当案例展示不当统计证据。坑四未检出数据别硬塞PFAS单体检出率差异很大有的单体一半样品低于检出限。一开始我把未检出填0直接进模型结果SHAP图显示模型主要靠检出/未检出这个二值信号在预测浓度梯度信息全被淹了。后来改成两阶段先用分类模型判断是否检出再对检出样本做浓度回归两个模型分开解释。这样SHAP图干净很多物理意义也说得通。结果怎么读、怎么写进论文我论文里最终用的是 beeswarm 图每行一个特征点是一个样本颜色是特征值高低加关键样本的 waterfall 图。写结果时记住一个原则SHAP解释的是模型怎么判不是环境里实际怎么发生的。所以我会把SHAP的结论和PMF的因子结果对照着写——比如SHAP说某支链异构体是区分污染场景的关键PMF那边恰好也把含该异构体的因子分了出来两个独立方法互相印证审稿人这关就好过很多。shap.plots.beeswarm(shap_values,X_test)# 全局特征贡献分布shap.plots.waterfall(shap.Explanation(valuesshap_values[0],base_valuesexplainer.expected_value,dataX_test.iloc[0],feature_namesfeat_names))# 单个样本拆解最后说点实话SHAP不是万能钥匙。它解释的是模型不是机理模型学到的是数据里的相关模式不代表因果关系。我导后来又问了我一句“所以你的SHAP结论能用采样实验验证吗”——这才是真正的下一关。但至少现在组会上再被问模型凭什么这么判我能指着图说这个样本的预测值里有0.4个log单位来自A单体方向是正的且五折交叉验证里结论一致。工具是死的解释得站不站得住脚还得靠环境背景知识兜底。参考来源Lundberg S M, Lee S I. A unified approach to interpreting model predictions[C]//Advances in Neural Information Processing Systems 30 (NeurIPS 2017). arXiv:1705.07874.SHAP 官方文档与源码: https://github.com/shap/shapUS EPA. Positive Matrix Factorization model for environmental data analyses: https://www.epa.gov/air-research/positive-matrix-factorization-model-environmental-data-analyses
返回列表