如何解释这种高效算法的方法

电子说

1.2w人已加入

描述

XGBoost是一种高效的集成学习模型框架,利用树型分类器可以得到强大的分类结果和十分高效的运算效率。这篇文章主要探讨如何解释这种高效算法的方法,以及正确解释模型的价值。如果你也被集成树模型(如梯度提升树)的可靠性和准确率所吸引,并且需要对他们作出解释,那么这篇文章会为你带来很多有益的思考。

假设我们的任务是为银行预测个人的金融状况。模型准确率越高,银行收入就越多。但是因为模型的预测会用于借贷业务,因此我们也要能对模型为什么做出这样的预测给出合理解释。在尝试了各种各样的模型后,我们发现XGBoost所实现的梯度提升树模型能给出最好的准确率。然而要解释为什么XGBoost做出某个预测是困难的,所以我们面前有两个选择:1. 转而使用更容易解释的线性模型。2. 找出如何解释XGBoost模型的方法。数据科学家们往往都不想牺牲准确率,所以我们也决定尝试后者,即对复杂XGBoost模型(1247个深度为6的决策树)作出解释。

经典全局特征重要性度量

最直接的选择就是使用XGBoost Python接口中的plot_importance()方法。它能给出一个简单的柱状图来表示我们数据集中每一个特征的重要性。

算法

在一个用来预测人们是否会上报$50k以上收入的模型上运行xgboost.plot_importance方法的结果

通过观察XGBoost所返回的特征重要性结果,我们可以看到年龄毫无疑问比其他特征都要重要。我们可以就此打住,并得出年龄就是我们模型最重要特征的结论,其次是每周的工作时长和受教育水平。但是身为优秀的数据科学家,我们从文档中得知在XGBoost中对特征重要性的度量共有三个选项:

Weight:一个特征在所有决策树中被用来划分数据的次数。

Cover:一个特征在所有决策树中被用来划分数据的次数和每次划分涉及的样本个数得到的加权结果。

Gain:一个特征被用于划分数据时所带来的训练损失减益的平均值。

这些都是几乎在任何树模型的包里都能见到的典型重要性度量。Weight是默认选项,所以我们决定试一下另外两个选项,看结果是否有所差别。

算法

用cover和gain作为选项来运行xgboost.plot_importatnce的结果

我们很惊讶地看到特征重要性的顺序较之前有很大不同。以cover为度量时,capital gain这一特征最能用于预测,而当用gain作为度量时,relationship status比其他特征都重要。在搞清哪一种度量最好之前,我们很难直接用这些度量来解释模型的重要性。

如何判断特征重要性的度量是好是坏?

比较不同特征归因方法(feature attribution method)的优劣并不容易。为了方便比较,我们定义如下两个指标:

一致性:如果我们对一个模型作出修改,使得它更依赖于某一个特征的话,那么由特征归因方法所得到的该特征的重要性(attributed importance)不应当降低。

准确性:所有特征重要性的和应等于模型的总重要性。例如,如果重要性是由R²值计算得到的,那么各个特征的R²值相加应等于模型的R²值。

如果某种特征归因方法不满足一致性,我们就很难用这种方法来比较两个模型。因为即便我们算得一个特征在一个模型的重要性更高,也不意味着这个模型更依赖于该特征。

而当一个方法不满足准确性时,我们不知道每个特征的重要性跟模型重要性间的关系是怎么样的。所以我们就不能对归因方法的结果直接归一化,因为归一化可能会打破一致性。

目前的归因方法是一致和准确的吗?

如上所述,一个归因方法应当满足一致性和准确性,当一个方法不满足一致性,我们不能保证具有最高归因的特征是实际上最重要的。下面我们来使用两个非常简单的树模型来检查归因方法的一致性:

算法

基于两个特征的简单树模型,模型B中的咳嗽这一个特征显然比模型A中的更重要。

模型的输出是基于不同症状对生病的风险所做出的评分。当发烧和咳嗽两个症状同时出现时,模型A会给出一个非零的风险分数。模型B跟模型A类似,但在咳嗽症状出现时,模型B会在模型A的基础上加10分。为了检查一个归因方法是否满足一致性,我们要先定义“重要性”。在这里我们将用两种方法来定义重要性:1)当我们移除一组特征时,模型预期准确率(accuracy)的变化。 2)当我们移除一组特征时,模型预期输出(output)的变化。

第一个定义可以衡量特征对模型的全局影响,而第二个定义则是衡量特征对单一预测的局部影响。在A和B两个简单树模型中,无论从哪个定义出发,咳嗽特征在模型B中都更重要。

上文中提到的weight,cover和gain三种方法都是全局特征归因方法。但是对银行部署的模型来说,模型需要对每个客户的预测提供解释。为了验证不同方法是否满足一致性,我们在简单树模型上运行五种不同的特征归因方法:

1.     Tree SHAP. 我们提出的一种新颖的局部方法。

2.     Saabas. 一种启发式的局部方法。

3.     mean(|Tree SHAP|). 一种基于Tree SHAP的局部结果取均值的全局方法。

4.     Gain. 与上文中的XGBoost中的Gain方法相同。

5.     Split count.与上文中XGBoost中的weight方法相同。

6.     Permutation.  当随机扰动某个特征时,模型在测试集上的准确率的下降。

算法

使用六种不同的方法对模型A和模型B进行特征归因。这六种方法是已知文献中所有针对树模型的特征归因方法。

但前述的方法都是不一致的,这是由于他们认为在模型B中咳嗽的重要性小于模型A。不一致的模型不能将影响最大的特征视为最重要的特征。细心的读者可能已经发现我们已经在前文中的经典特征归因方法中提出过不一致特征了。同时对于精确性来说,Tree SHAP、Sabaas和Gain三种方法是精确的而分裂计数和特征置换是不准确的。

令人惊讶的是,被广泛使用的基于gain的方法会引起如此多的不一致的结果。为了更好的理解其中的原因,让我们来看看gain是如何计算模型A和B的。让我们简单的假设25%的数据落到了每一个的叶子节点并被精确的标记(每个叶子1/4)。

如果将均方根误差作为损失函数,首先从模型A的1200开始计量。在第一次分裂的过程中,损失从1200降到了800,那么意味着gain利用fever特征贡献了400提升;进一步利用cough特征分裂得到了0的损失,意味着cough贡献了800的提升;在模型B中,Cough和Fever分别贡献了625和800的提升。如下图所示:

算法

模型A和模型B的分数计算

通常情况下距离根比较近的节点拥有比靠近叶子节点更重要的特征。那么对于gain方法来说,它对于gain方法来说低层级靠近叶子节点的特征却贡献了更多的重要性。正是这种偏差导致了不一致性。随着树的加深,这样的偏差也在不断增长。但对于Tree SHAP方法来说,在数学上对不同层次的特征进行了平均。

模型解释

结合了坚实的理论和快速的算法实现让SHAP值成为了解释树形模型的有力工具。利用这种新方法,我们重新解释了上文中个性化银行模型中的特征。

算法

基于SHAP的全局均值方法用于收入预测模型

我们可以看到关系是最重要的特征,其次是年龄特征。SHAP度量保证了一致使得我们的分析更加容易。接下来我们需要对每一个客户绘制响应的特征:

算法

图中每个点代表一个客户,x坐标是特征的重要性,颜色代表特征的取值

上图中特征根据均值排列,从中我们可以看到关系特征在收入达到50k$上的预测十分强烈。同时我们可以从上图中看到局外点的影响。图中的的颜色同时还显示了年轻人一般收入较低、受教育程度会提高收入。

做了这么多,结果已经很棒了。但是我们还可以从中发现更多的信息。我们可以绘制出度量随特征的变化如下图所示:

算法

y轴表示了年龄对于年收入超过50k$的影响程度。

从中可以清晰的看到XGBoost模型抽取的特征,及其相互影响。对于20多岁的年轻人来说,年龄对于他们的影响十分小甚至有副作用,这意味着其他特征影响着年龄的重要性。为了了解这种相互影响,我们将受教育年限作为带颜色的点绘制到了同一副图中。高等教育在20多岁的年纪里对于收入影响不大,但在30多岁时候却有着至关重要的影响。

算法

上图中可以清楚的看出受教育程度和年龄的关系。同样我们还可以做出每周工作时间及其重要性的关系。

如果我们对于数据中的另一个变量工作时间进性相同的分析的话,我们会发现没有工作50小时是比较好的选择,而如果对对于已婚人士来说的话超出的工作时间并不能为他们带来更多的收入。

算法

解读你的模型

我们大概浏览了一遍在构建和部署模型的时候如何思考和理解模型。我们可以通过SHAP值作为度量来分析并利用shape工具包来可视化分析结果。从而寻找出最重要的变量。如果你对XGBoost感兴趣,你还可以尝试下Apache的XGBoost和微软的LightGBM这两个工具包,相信会给你带来不错的结果。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分