如何用XGBoost入门可解释机器学习?( 三 )


如何用XGBoost入门可解释机器学习?
本文插图
图:模型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模型的任务:
如何用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)来绘制以下解释:
如何用XGBoost入门可解释机器学习?
本文插图
图:每个客户在每一行上都有一个点 。 点的x坐标是该特征对客户模型预测的影响 , 而点的颜色表示该特征的值 。 不在行上的点堆积起来显示密度(此示例中有32,561个客户) 。 由于XGBoost模型具有logistic loss , 因此x轴具有log-odds单位(Tree SHAP解释了模型的边距输出变化) 。
这些特征按mean(| Tree SHAP |)排序 , 因此我们再次看到关系这个特征被视为年收入超过5万美元的最强预测因子 。 通过绘制特征对每个样本的影响 , 我们还可以看到重要的异常值影响 。 例如 , 虽然资本收益并不是全局范围内最重要的特征 , 但对于部分客户而言 , 它却是最重要的特征 。 按特征值着色为我们显示了一些模式 , 例如 , 年纪较浅会降低赚取超过 5万美元的机会 , 而受高等教育程度越高 , 赚取超过5万美元的机会越大 。