Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

Scott Lundberg作者张一然校对和中华翻译

用XGBoost入门可解释机器学习

本文为大家介绍用XGBoost解释机器学习。

这是一个故事,关于错误地解释机器学习模型的危险以及正确解释所带来的价值。如果你发现梯度提升随机森林之类的集成树模型具有很稳定的准确率,但还是需要对其进行解释,那我希望你能从这篇文章有所收获。

 

假定我们的任务是预测某人的银行财务状况。模型越准确,银行就越赚钱,但由于该预测要用于贷款申请,所以我们必须要提供预测背后的原因解释。在尝试了几种类型的模型之后,我们发现XGBoost实现的梯度提升树能提供最佳的准确率。不幸的是,很难解释为何XGBoost做出某个决策,所以我们只有两种选择:要么退回到线性模型,要么搞清楚如何解释XGBoost模型。没有数据科学家愿意在准确率上让步,于是我们决定挑战自己,去解释复杂的XGBoost模型(本例中,是6棵深达1247层的树)。

经典的全局特征重要性度量

首先一个显而易见的选择是使用XGBoost中Python接口提供的plot_importance()方法。它给出一个简单明了的柱状图,表示数据集中每个特征的重要性(复现结果的代码在Jupyter notebook中)。

图:该模型在经典的成人普查数据集上被训练用于预测人们是否会报告超过5万美元的收入(使用logistic loss),上图是执行xgboost.plot_importance(model)的结果

仔细看一下XGBoost返回的特征重要性,我们发现年龄在所有特征中占统治地位,成为收入最重要的预测指标。我们可以止步于此,向领导报告年龄这个直观且让人满意的指标是最重要的特征,紧随其后的是每周工作时长和受教育程度这些特征。但是,作为一名好的数据科学家,我们查询了一下文档,发现在XGBoost中衡量特征重要性有3个选项:

1. Weight。某个特征被用于在所有树中拆分数据的次数

2. Cover。同上,首先得到某个特征被用于在所有树中拆分数据的次数,然后要利用经过这些拆分点的训练数据数量赋予权重

3. Gain。使用某个特征进行拆分时,获得的平均训练损失减少量 

这些是在任何基于树的建模包中都能找到的重要性度量。Weight是默认选项,因此我们也试试另外两种方法,看看有何不同:

图:运行xgboost.plot_importance,并使用参数 importance_type=’cover’和’gain’的结果

结果令人诧异,对于XGBoost提供的3个选项,特征重要性的排序都大不相同。对于cover方法,资本收益似乎是收入最重要的预测指标,而对于gain方法,关系状态特征独占鳌头。不知道哪种方法最好的情况下,依靠这些度量来报告特征重要性,这很让人不爽。

什么因素决定了特征重要性度量的好坏? 

如何比较两种特征归因(feature attribution)方法并不明显。我们可以在诸如数据清洗,偏差检测等任务上测量每种方法的最终用户性能。但这些任务仅仅是特征归因方法质量的间接度量。这里,定义两个我们认为任何好的特征归因方法都应遵循的属性: 

1. 一致性(Consistency)。当我们更改模型以使其更多依赖于某个特征时,该特征的重要性不应该降低。 

2. 准确性(Accuracy)。所有特征重要性的和应该等于模型的总体重要性。例如,如果重要性由R^2值来衡量,则每个特征的归因值加起来应该等于整个模型的R^2。 

如果一致性不满足,那我们就无法比较任意两个模型的特征重要性,因为此时分配到更高的归因并不意味着模型对此特征有更多依赖。 

如果准确性不满足,那我们就不知道每个特征的归因是如何合并起来以代表整个模型的输出。我们不能简单的对归因进行归一化,因为这可能会破坏该方法的一致性。

当前的归因方法是否一致且准确?

回到之前银行数据科学家的工作。我们意识到一致性和准确性很重要。实际上,如果一个方法不具备一致性,我们就无法保证拥有最高归因的特征是最重要的特征。因此,我们决定使用两个与银行任务无关的树模型来检查各个方法的一致性: 

图:在两个特征上的简单树模型。咳嗽显然在模型B中比模型A中更重要。 

模型的输出是根据某人的症状而给出的风险评分。模型A仅仅是一个用于发烧和咳嗽两个特征的简单“and”函数。模型B也一样,只不过只要有咳嗽症状,就加10分。为了检查一致性,我们需要定义“重要性”。此处,我们用两种方式定义重要性: 

1) 作为当我们移除一组特征时,模型预期准确率的变化。

2) 作为当我们移除一组特征时,模型预期输出的变化。 

第一个定义度量了特征对模型的全局影响。而第二个定义度量了特征对单次预测的个性化影响。在上面简单的树模型中,当发烧和咳嗽同时发生时对于两种定义,咳嗽特征在模型B中明显都更重要。 

银行例子中的Weight,cover和gain方法都是全局特征归因方法。当在银行部署模型时,我们还需要针对每个客户的个性化说明。为了检查一致性,我们在简单的树模型上运行6种不同的特征归因方法:

1. Tree SHAP。我们提出的一种新的个性化度量方法。

2. Saabas。一种个性化的启发式特征归因方法。

3. Mean( |Tree SHAP| )。基于个性化Tree SHAP平均幅度的一种全局归因方法。

4. Gain,上述XGBoost使用的相同方法,等同于scikit-learn树模型中使用的Gini重要性度量。

5. 拆分次数(Split Count)。代表XGBoost中紧密相关的’weight’和’cover’方法,但使用’weight’方法来计算。

6. 排列(Permutation)。当在测试集中随机排列某个特征时,导致模型准确率的下降。

图:使用6种不同方法对模型A和B做特征归因。截止发文时间,这些方法代表了文献中所有关于树模型的特征归因方法。

从图上可知,除了permutation方法外,其余方法都是不一致的。因为它们在模型B中比在模型A中给咳嗽分配的重要性更少。不一致的方法无法被信任,它无法正确地给最有影响力的特征分配更多的重要性。细心的读者会发现,之前我们在同一模型上使用经典的归因方法产生矛盾时,这种不一致已经显现。对于准确性属性呢?事实证明,Tree SHAP,Sabaas和 Gain 都如先前定义的那样准确,而permutation和split count却不然。

令人惊讶的是,诸如gain(Gini重要性)之类广泛使用的方法居然会导致如此明显的不一致。为了更好地理解为何会发生这种情况,我们来仔细看看模型A和B中的gain是如何计算的。简单起见,我们假设每个叶子节点中落有25%的数据集,并且每个模型的数据集都具有与模型输出完全匹配的标签。

如果我们用均方误差MSE作为损失函数,则在模型A中进行任何拆分之前,MSE是1200。这是来自恒定平均预测20的误差。在模型A中用发烧特征拆分后,MSE降到了800,因此gain方法将此400的下降归因于发烧特征。然后用咳嗽特征再次拆分,会得到MSE为0,gain方法会把这次800的下降归因于咳嗽特征。同理,在模型B中,800归因于发烧,625归因于咳嗽。

图:模型A和模型B的gain(又称基尼重要性)得分计算。

通常,我们期望靠近树根的特征比叶子节点附近的特征更重要(因为树就是贪婪地被构造的)。然而gain方法偏向于将更多的重要性归因于较低的拆分。这种偏见导致了不一致性,即咳嗽应该更重要时(在树根处拆分),给它归因的重要性实际却在下降。个性化的Saabas方法(被treeinterpreter包所使用)在我们从上到下遍历树时计算预测的差异,它也同样受偏见影响,即偏向较低的拆分。随着树加深,这种偏见只会加剧。相比之下,Tree SHAP方法在数学上等价于对特征所有可能的排序上的预测差异求均值,而不仅仅是按照它们在树中的位置顺序。

只有Tree SHAP既一致又准确这并不是巧合。假设我们想要一种既一致又准确的方法,事实证明只有一种分配特征重要性的方法。详细介绍在我们最近的NIPS论文中,简单来讲,从博弈论中关于利润公平分配的证明引出了机器学习中特征归因方法的唯一结果。在劳埃德·沙普利(Lloyd Shapley)于1950年代推导出它们之后,这些唯一的值被称为沙普利值(Shapley values)。我们在这里使用的SHAP值是把与Shapley值相关的几种个性化模型解释方法统一而来的。Tree SHAP是一种快速算法,可以精确地在多项式时间内为树计算SHAP值,而不是在传统的指数运行时间内(请参阅arXiv)。 

充满信心地解释我们的模型

扎实的理论依据和快速实用的算法相结合,使SHAP值成为可靠地解释树模型(例如XGBoost梯度提升机)的强大工具。有了这个新方法,让我们回到解释银行XGBoost模型的任务: 

图:全局Mean( |Tree SHAP| )方法应用到收入预测模型上。x轴是当某个特征从模型中’隐藏’时模型输出的平均幅度变化(对于此模型,输出具有log-odds单位)。详细信息,请参见论文。但是“隐藏”是指将变量集成到模型之外。由于隐藏特征的影响会根据其他隐藏特征而变化,因此使用Shapley值可迫使一致性和准确性。

图上可看出,关系特征实际上是最重要的,其次是年龄特征。由于SHAP值保证了一致性,因此我们无需担心之前在使用gain或split count方法时发现的种种矛盾。不过,由于我们现在有为每个人提供的个性化说明,我们还可以做的更多,而不只是制作条形图。我们可以在数据集中给每个客户绘制特征重要性。shap Python包使此操作变得容易。我们首先调用shap.TreeExplainer(model).shap_values(X)来解释每个预测,然后调用shap.summary_plot(shap_values,X)来绘制以下解释:

图:每个客户在每一行上都有一个点。点的x坐标是该特征对客户模型预测的影响,而点的颜色表示该特征的值。不在行上的点堆积起来显示密度(此示例中有32,561个客户)。由于XGBoost模型具有logistic loss,因此x轴具有log-odds单位(Tree SHAP解释了模型的边距输出变化)。

这些特征按mean(| Tree SHAP |)排序,因此我们再次看到关系这个特征被视为年收入超过5万美元的最强预测因子。通过绘制特征对每个样本的影响,我们还可以看到重要的异常值影响。例如,虽然资本收益并不是全局范围内最重要的特征,但对于部分客户而言,它却是最重要的特征。按特征值着色为我们显示了一些模式,例如,年纪较浅会降低赚取超过 5万美元的机会,而受高等教育程度越高,赚取超过5万美元的机会越大。

我们可以停下来将此图展示给老板,但这里咱们来更深入地研究其中一些特征。我们可以通过绘制年龄SHAP值(log odds的变化)与年龄特征值的关系来实现:

 图:y轴是年龄特征改变多少每年赚取5万美元以上的log odds。x轴是客户的年龄。每个点代表数据集中的一个客户。

在这里,我们看到了年龄对对收入潜力的明显影响。请注意,与传统的部分依赖图(其显示当更改特征值时的平均模型输出)不同,这些SHAP依赖图显示了相互影响。即使数据集中的许多人是20岁,但年龄对他们的预测的影响程度却有所不同,正如图中20岁时点的垂直分散所示。这意味着其他特征正在影响年龄的重要性。为了了解可能是什么特征在影响,我们用受教育的年限给点涂上颜色,并看到高水平的教育会降低20岁时的年龄影响,而在30岁时会提高影响:

图:y轴是年龄特征改变多少每年赚取5万美元以上的log odds。x轴是客户的年龄。Education-Num是客户已接受的教育年限。

如果我们对每周的工作小时数做另一个依赖图,我们会发现,多投入时间工作的好处在每周约50个小时时达到瓶颈,而如果你已婚,则额外工作不太可能代表更高收入:图:每周工作时间与工作时间数对收入潜力的影响。

解释你自己的模型

这篇文章整个分析过程旨在模拟你在设计和部署自己的模型时可能要经历的过程。shap包很容易通过pip进行安装,我们希望它可以帮助你放心地探索模型。它不仅包含本文涉及的内容,还包括SHAP交互值,模型不可知的SHAP值估算,以及其他可视化。还有很多notebooks来展示在各种有趣的数据集上的各种功能。例如,你可以在一个notebook中根据体检报告数据来分析你将来最可能的死亡原因,这个notebook解释了一个XGBoost死亡率模型。对于Python以外的其他语言,Tree SHAP也已直接合并到核心XGBoost和LightGBM软件包中。

原文标题:

Interpretable Machine Learning with XGBoost

原文链接:

https://towardsdatascience.com/interpretable-machine-learning-with-xgboost-9ec80d148d27

编辑:于腾凯

校对:汪雨晴

译者简介


和中华,留德软件工程硕士。由于对机器学习感兴趣,硕士论文选择了利用遗传算法思想改进传统kmeans。目前在杭州进行大数据相关实践。

THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

入门XGBoost机器学习
1
相关数据
权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

梯度提升技术

梯度提升是用于回归和分类问题的机器学习技术,其以弱预测模型(通常为决策树)的集合的形式产生预测模型。 它像其他增强方法一样以阶段式方式构建模型,并且通过允许优化任意可微损失函数来推广它们。

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

随机森林技术

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而"Random Forests"是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的"Bootstrap aggregating"想法和Ho的"random subspace method" 以建造决策树的集合。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

博弈论技术

博弈论,又译为对策论,或者赛局理论,应用数学的一个分支,1944年冯·诺伊曼与奥斯卡·摩根斯特恩合著《博弈论与经济行为》,标志着现代系统博弈理论的的初步形成,因此他被称为“博弈论之父”。博弈论被认为是20世纪经济学最伟大的成果之一

查询技术

一般来说,查询是询问的一种形式。它在不同的学科里涵义有所不同。在信息检索领域,查询指的是数据库和信息系统对信息检索的精确要求

遗传算法技术

遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。 遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解可抽象表示为染色体,使种群向更好的解进化。

XGBoost技术

XGBoost是一个开源软件库,为C ++,Java,Python,R,和Julia提供了渐变增强框架。 它适用于Linux,Windows,MacOS。从项目描述来看,它旨在提供一个“可扩展,便携式和分布式的梯度提升(GBM,GBRT,GBDT)库”。 除了在一台机器上运行,它还支持分布式处理框架Apache Hadoop,Apache Spark和Apache Flink。 由于它是许多机器学习大赛中获胜团队的首选算法,因此它已经赢得了很多人的关注。

推荐文章
暂无评论
暂无评论~