为什么要做模型解释分析?

职场   2025-01-16 16:26   四川  

自学机器学习也有一段时间了,我发现很多资料中都提到模型解释分析,说它是是机器学习中的一个重要领域。一开始我并不在意,我们已经能够通过评估指标了解模型的性能了(在分类任务中,准确率高说明模型预测正确的情况多,回归任务中,R²高说明模型解释了大部分的变异),何必还要费劲地去解释模型?

可随着学习的深入,我想更深入的了解模型到底是怎么做出预测的?为什么模型在某些情况下表现得很好,却在其他情况下却表现很差?在航空维修领域,我们通过机器学习来预测故障,不光想知道这个故障发生的概率是多少,还想知道哪些参数对这个概率影响最大,这样我们才能有针对性地换件。假如模型是个黑箱,即使它预测得很准,我可能还是会心存疑虑。光靠评估指标,并不能解决我所有的疑问。于是我又回过头来再把这个概念学习一遍。以下是我整理的一些学习笔记:

模型解释分析旨在解释和理解模型的行为及其输出的原因,为我们提供了模型透明性,可以帮助我们理解以下问题:

模型的决策依据:模型是如何得出某个预测结果的?

特征重要性:哪些特征对模型的预测影响最大?
局部解释:在特定样本上,哪些因素导致了模型的具体预测?
全局解释:模型在总体上的表现规律是什么?

有些模型本身比较容易解释,比如线性回归,每个特征的系数就能说明这个特征对预测结果的影响。可是像决策树或者随机森林,虽然也能看一些特征的重要性,但感觉还是没那么直观。随着机器学习模型(尤其是深度学习模型)越来越复杂,模型变得越来越难以理解。如果不进行解释分析,就无法真正理解模型的工作原理,也无法确保模型在未知数据上的泛化能力。

模型解释的方法有很多,既有针对单个预测的局部解释,也有针对整个模型的全局解释。比如:用SHAP值可以衡量每个特征对预测结果的贡献;还有Permutation Importance通过打乱特征值来看模型性能下降多少,来判断这个特征的重要性;还有一些基于梯度的方法,用来解释神经网络等复杂模型的特征影响,等等。下面我们先通过一个简单的例子来学习一下SHAP作为入门:

SHAP(SHapley Additive exPlanations)是一种基于合作博弈论的解释方法,用于衡量每个特征对模型输出的贡献。它通过为每个特征分配一个“贡献值”(即SHAP值)来解释模型预测。

假设一个团队正在完成一个项目,团队由 3 名成员组成:A、B、C。完成项目可以获得 100 万的总收益,但每个人的贡献不一样:

A 独自完成项目只能赚 40 万。
B 独自完成项目只能赚 30 万。
C 独自完成项目只能赚 10 万。
A 和 B 合作可以赚 90 万。
A 和 C 合作可以赚 70 万。
B 和 C 合作可以赚 50 万。
A、B、C 三人一起合作可以赚 100 万。

那么问题来了:如何公平地分配这 100 万呢?

为了公平地分配100万元的收益,我们可以使用Shapley值来衡量每个成员的贡献。Shapley值的核心思想是通过考虑所有可能的合作顺序,计算每个玩家加入时所带来的边际贡献,然后取所有排列的平均值计算公式为:

其中:S为不包含玩家 i 的所有子集,N为总人数,V(S)为 的收益。

这里简单解释一下什么是边际贡献?即某些成员已经合作,那么新加入的成员带来的额外收益就是这个成员的边际贡献。例如:团队已经有 A 和 B,他们能赚 90 万。如果此时 C 加入,收益变为 100 万,则 C 的边际贡献为 10 万。

由于Shapley值认为所有的成员加入团队的顺序都是同等可能的,为了确保所有顺序的公平性,所以需要计算每个成员在所有可能顺序下的边际贡献,然后再取平均值。

综上,当N=3,成员只有A时S可以是空集、{B}、{C}、{B,C}。将数值代入公式计算成员A的Shapley值为:

ϕ_A = [ (0! 2! / 3!) (v({A}) - v(∅)) ) ] + [ (1! 1! / 3!) (v({A,B}) - v({B})) ) ] + [ (1! 1! / 3!) (v({A,C}) - v({C})) ) ] + [ (2! 0! / 3!) (v({A,B,C}) - v({B,C})) ) ]

= [ (1*2 / 6) (40 - 0) ] + [ (1*1 / 6) (90 - 30) ] + [ (1*1 / 6) (70 - 10) ] + [ (2*1 / 6) (100 - 50) ]

= [ (2/6)*40 ] + [ (1/6)*60 ] + [ (1/6)*60 ] + [ (2/6)*50 ]

= (80/6) + (60/6) + (60/6) + (100/6) = (80+60+60+100)/6 = 300/6 = 50

同理,计算ϕ_B=35,ϕ_C=15
所以,最终的分配应该是A得到50万,B得到35万,C得到15万。

下面我们以一个公开的数据集(波士顿房价)为例,用shap库来解释随机森林回归模型在波士顿房价上的预测结果。据说这个数据集因为存在伦理问题从scikit-learn中移除了,建议大家换加州住房数据集自己试试。
首先导入数据集:
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
import shap
import pandas as pd
import numpy as np

data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]

X = data
y = target
由于这里主要是想展示模型解释分析,所以模型训练部分就从简了啊。
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = RandomForestRegressor(random_state=42)
model.fit(X_train, y_train)
创建shap解释器并计算shap值(对于复杂模型和大数据集,shap值的计算耗时会很长):
# 创建 SHAP 解释器
explainer = shap.TreeExplainer(model)
# 计算 SHAP 值
shap_values = explainer.shap_values(X_test)
上面的shap.TreeExplainer是专门为树结构模型(如:RandomForest、XGBoost、LightGBM 等)设计的解释器,假如你想代码的通用性更好,可以换成shap.Explainer。它是一个通用的接口,可以根据传入的模型类型自动选择合适的解释器(比如:对于深度学习模型,会自动使用DeepExplainer 或 GradientExplainer;对于普通线性模型或类模型,则使用LinearExplainer)。
接着,根据数据集定义特征名:
# 定义特征名称
feature_names = ['CRIM''ZN''INDUS''CHAS''NOX''RM''AGE'
                'DIS''RAD''TAX''PTRATIO''B''LSTAT']
最后,使用 shap.summary_plot和 shap.dependence_plot 进行可视化:
# 全局特征重要性图
shap.summary_plot(shap_values, X_test, feature_names=feature_names)

# 依赖图
shap.dependence_plot("LSTAT", shap_values, X_test, feature_names=feature_names)
从全局特征总结图(summary plot)中,我们能看出所有特征对模型输出的平均影响,它们是按重要性排序的:
X轴每个特征对模型输出的平均影响(SHAP值)。正值表示增加预测值,负值表示减少预测值。颜色表示特征值的大小,红色表示特征值高,蓝色表示特征值低。可以看出,低收入人口比例(LSTAT)模型输出有最大的负面影响,即低收入人口比例越高,房价越低;平均房间数(RM)对模型输出的正面影响最大,即平均房间数越多,房价越高;其他特征,如犯罪率(CRIM)和距离就业中心的距离(DIS)也会房价有显著的影响。
从依赖图(dependence plot)中,我们能看出指定的特征与其对应的SHAP值之间的关系。
上图X轴是LSTAT的特征值,Y轴是对应的SHAP值。很显然,低收入人口比例越高,对房价的负面影响越大,同时犯罪率也越高。换句话说:低收入人口比例越高,犯罪率也越高,房价也就越低。所以,这算是一种歧视吗?

今天就学到这了,小结一下吧:为什么要做模型解释分析?因为模型解释分析可以帮助我们理解特征值的影响力、发现数据中的偏见和不公正。假如发现某个特征对模型的影响不符合我们的预期,可以在数据预处理阶段及时优化特征工程进而提升模型性能。



感谢大家对机务论坛的支持,关注机务论坛,倾听机务心声!航企优秀的方面必定宣传,不足的地方也必须指出,让领导们重视问题,解决问题,营造更好的机务维修环境。

征稿:
所见所闻,个人感悟,个人成长历程及感人故事。
特别征稿:我师傅的故事!
同时,征集劳动仲裁案例,分享案例,让更多的小伙伴能了解劳动纠纷的解决方式,通过劳动仲裁维护自己的合法权益。



评论区留言,同意的点赞
扫码添加小编微信
匿名爆料

微信号

minhangjiwuluntan


民航机务论坛微信公众平台
改名为:机务论坛
发布最新行业动向 深入解读政策法规
开辟维修工程专栏 交流飞机排故经验
分享前沿技术应用 预测职业发展前景
行业大咖讲经布道 业界专家授业解惑
致力打造一流的民航机务朋友圈----机务论坛
关注机务论坛,倾听机务心声!
投稿邮箱:duanwei0615@163.com


机务论坛
民航机务论坛改名为:机务论坛 发布最新行业动向 深入解读政策法规 开辟维修工程专栏 交流飞机排故经验 分享前沿技术应用 预测职业发展前景 行业大咖讲经布道 业界专家授业解惑 致力打造一流的民航机务朋友圈----机务论坛
 最新文章