大家好,我是宝器!
SHAP(Shapley Additive exPlanations) 使用来自博弈论及其相关扩展的经典 Shapley value将最佳信用分配与局部解释联系起来,是一种基于游戏理论上最优的 Shapley value来解释个体预测的方法。 从博弈论的角度,把数据集中的每一个特征变量当成一个玩家,用该数据集去训练模型得到预测的结果,可以看成众多玩家合作完成一个项目的收益。Shapley value通过考虑各个玩家做出的贡献,来公平的分配合作的收益。 数据集标准的 UCI 成人收入数据集。 import shap 创建Explainer并计算SHAP值在SHAP中进行模型解释需要先创建一个explainer,SHAP支持很多类型的explainer(例如deep, gradient, kernel, linear, tree, sampling),本文使用支持常用的XGB、LGB、CatBoost等树集成算法的tree为例。
然后计算 输出numpy.array数组shap_values = explainer.shap_values(X) 输出shap.Explanation对象
模型自带特征重要性关于模型解释性,除了线性模型和决策树这种天生就有很好解释性的模型以外,sklean/ xgboost 中有很多模型都有importance这一接口,可以查看特征的重要性。 model = xgboost.XGBClassifier(eval_metric='mlogloss').fit(X, y) SHAP 特征重要性Summary Plot将 SHAP 值矩阵传递给条形图函数会创建一个全局特征重要性图,其中每个特征的全局重要性被视为该特征在所有给定样本中的平均绝对值。
在上面两图中,可以看到由 SHAP value 计算的特征重要性与使用 scikit-learn / xgboost计算的特征重要性之间的比较,它们看起来非常相似,但它们并不相同。 Bar plot全局条形图特征重要性的条形图还有另一种绘制方法。 shap.plots.bar(shap_values2)
当然 局部条形图将一行 SHAP 值传递给条形图函数会创建一个局部特征重要性图,其中条形是每个特征的 SHAP 值。其中特征值是否显示,是通过参数
队列条形图传递解释对象的字典将为解释对象表示的每个群组创建一个多条形图,其中包含一个条形类型。下面我们使用它来分别绘制男性和女性特征重要性的全局摘要。 sex = ['Women' if shap_values2[i,'Sex'].data == 0 队列条形图还有另一个比较有意思的绘图,他使用 Explanation 对象的自动群组功能来使用决策树创建一个群组。调用 例如将其用于成人人口普查数据,则看到低资本收益与高资本收益之间的明显区别。括号中的数字是每个队列中的实例数。
使用特征聚类很多时候数据集中的特征存在冗余。这意味着模型可以使用任一特征并仍然获得相同的准确性。可以通过计算特征之间的相关矩阵,或使用聚类方法来找到这些特征。 在 SHAP 中通过模型损失比较来测量特征冗余。即使用 计算聚类并传递给条形图,就可以同时可视化特征冗余结构和特征重要性。默认只会显示距离 < 0.5 的聚类部分。假设聚类中的距离大致在 0 和 1 之间缩放,其中 0 距离表示特征完全冗余,1 表示它们完全独立。 在下图中,我们看到只有关系和婚姻状况有超过 50% 的冗余,因此它们是条形图中分组的唯一特征: clustering = shap.utils.hclust(X, y) Summary Plot上面使用Summary Plot方法并设置参数 Summary_plot 为每一个样本绘制其每个特征的Shapley value,它说明哪些特征最重要,以及它们对数据集的影响范围。 y 轴上的位置由特征确定,x 轴上的位置由每 Shapley value 确定。颜色表示特征值(红色高,蓝色低),颜色使我们能够匹配特征值的变化如何影响风险的变化。重叠点在 y 轴方向抖动,因此我们可以了解每个特征的 Shapley value分布,并且这些特征是根据它们的重要性排序的。
Beeswarm plot同条形图一样shap也提供了另一个接口 蜂群图旨在显示数据集中的TOP特征如何影响模型输出的信息密集摘要。给定解释的每个实例由每个特征流上的一个点表示。点的 x 位置由该特征的 SHAP 值 ( 在下图中,我们可以看到平均而言年龄是最重要的特征,与年轻(蓝色)人相比,收入超过 5 万美元的可能性较小。 同样可以使用 默认使用每个特征的 SHAP 值的平均绝对值 shap.plots.beeswarm(shap_values2, 另外,在绘图之前,就对shap_values取绝对值,得到与条形图类似的图形,但比条形图具有更丰富的平行线,因为条形图只是绘制蜂群图中点的平均值。
还可以自定义颜色,默认使用 import matplotlib.pyplot as plt 在Summary_plot图中,首先看到了特征值与对预测的影响之间关系的迹象,但是要查看这种关系的确切形式,还必须查看 SHAP Dependence Plot图。 Dependence PlotSHAP Partial dependence plot (PDP or PD plot) 依赖图显示了一个或两个特征对机器学习模型的预测结果的边际效应,它可以显示目标和特征之间的关系是线性的、单调的还是更复杂的。他们在许多样本中绘制了一个特征的值与该特征的 SHAP 值。 PDP 是一种全局方法:该方法考虑所有实例并给出关于特征与预测结果的全局关系。PDP 的一个假设是第一个特征与第二个特征不相关。如果违反此假设,则 PDP 计算的平均值将包括极不可能甚至不可能的数据点。 为了显示哪个特征可能会驱动这些交互效应,可以通过第二个特征为我们的年龄依赖性散点图着色(默认第二个特征是自动选择的,尝试挑选出与 Age 交互作用最强的特征列)。也可以通过参数
Dependence plot 是一个散点图,显示单个特征对整个数据集的影响。
Scatter plot同样,散点图绘图依赖图,这与上面 dependence_plot 绘制基本一样。 在显示方面有些许不同,plots scatter 图底部的浅灰色区域是显示数据值分布的直方图。 在交互颜色方面。dependence_plot 默认而散点图则需要将整个 Explanation 对象传递给 另外,有时候在输入模型之前是字符串,为输入到模型,需要将其设置为分类编码,此时绘图,并不能很直观地显示内容。此时可以将 shap_values2.display_data = X_display.values 使用全局特征重要性排序在只想绘制最重要的特征,却不知道其特征名或索引,此时可以使用 Explanation 对象的点链功能来计算全局特征重要性的度量,按该度量(降序)排序,然后挑选出顶部特征。
另外还可以自定义图形属性,详情可参加官方文档。敬请期待下篇。 参考文章 |
|