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


如何用XGBoost入门可解释机器学习?
本文插图
作者:Scott Lundberg翻译:和中华
校对:张一然
本文长度为4300字 , 建议阅读8分钟本文为大家介绍用XGBoost解释机器学习 。
这是一个故事 , 关于错误地解释机器学习模型的危险以及正确解释所带来的价值 。 如果你发现梯度提升或随机森林之类的集成树模型具有很稳定的准确率 , 但还是需要对其进行解释 , 那我希望你能从这篇文章有所收获 。
假定我们的任务是预测某人的银行财务状况 。 模型越准确 , 银行就越赚钱 , 但由于该预测要用于贷款申请 , 所以我们必须要提供预测背后的原因解释 。 在尝试了几种类型的模型之后 , 我们发现XGBoost实现的梯度提升树能提供最佳的准确率 。 不幸的是 , 很难解释为何XGBoost做出某个决策 , 所以我们只有两种选择:要么退回到线性模型 , 要么搞清楚如何解释XGBoost模型 。 没有数据科学家愿意在准确率上让步 , 于是我们决定挑战自己 , 去解释复杂的XGBoost模型(本例中 , 是6棵深达1247层的树) 。
经典的全局特征重要性度量
首先一个显而易见的选择是使用XGBoost中Python接口提供的plot_importance()方法 。 它给出一个简单明了的柱状图 , 表示数据集中每个特征的重要性(复现结果的代码在Jupyter notebook中) 。
如何用XGBoost入门可解释机器学习?
本文插图
图:该模型在经典的成人普查数据集上被训练用于预测人们是否会报告超过5万美元的收入(使用logistic loss) , 上图是执行xgboost.plot_importance(model)的结果
仔细看一下XGBoost返回的特征重要性 , 我们发现年龄在所有特征中占统治地位 , 成为收入最重要的预测指标 。 我们可以止步于此 , 向领导报告年龄这个直观且让人满意的指标是最重要的特征 , 紧随其后的是每周工作时长和受教育程度这些特征 。 但是 , 作为一名好的数据科学家 , 我们查询了一下文档 , 发现在XGBoost中衡量特征重要性有3个选项:
1.Weight 。 某个特征被用于在所有树中拆分数据的次数
2.Cover 。 同上 , 首先得到某个特征被用于在所有树中拆分数据的次数 , 然后要利用经过这些拆分点的训练数据数量赋予权重
3.Gain 。 使用某个特征进行拆分时 , 获得的平均训练损失减少量
这些是在任何基于树的建模包中都能找到的重要性度量 。 Weight是默认选项 , 因此我们也试试另外两种方法 , 看看有何不同:
如何用XGBoost入门可解释机器学习?
本文插图
图:运行xgboost.plot_importance,并使用参数 importance_type=’cover’和’gain’的结果
结果令人诧异 , 对于XGBoost提供的3个选项 , 特征重要性的排序都大不相同 。 对于cover方法 , 资本收益似乎是收入最重要的预测指标 , 而对于gain方法 , 关系状态特征独占鳌头 。 不知道哪种方法最好的情况下 , 依靠这些度量来报告特征重要性 , 这很让人不爽 。
什么因素决定了特征重要性度量的好坏?
如何比较两种特征归因(feature attribution)方法并不明显 。 我们可以在诸如数据清洗 , 偏差检测等任务上测量每种方法的最终用户性能 。 但这些任务仅仅是特征归因方法质量的间接度量 。 这里 , 定义两个我们认为任何好的特征归因方法都应遵循的属性:
1. 一致性(Consistency) 。 当我们更改模型以使其更多依赖于某个特征时 , 该特征的重要性不应该降低 。
2.准确性(Accuracy) 。 所有特征重要性的和应该等于模型的总体重要性 。 例如 , 如果重要性由R^2值来衡量 , 则每个特征的归因值加起来应该等于整个模型的R^2 。