前些天在同行交流群里,有个话题一直在群里热烈地讨论,那就是 如何解释机器学习模型 ,由于在风控领域,一个模型若是不能获得很好的解释通常都不会被经过的,在银行里会特别的常见,因此大多数同行都是会用 LR 来建模。可是,机器学习的模型算法这么多,不用岂不是很浪费?并且有些算法还十分好用的,至少在效果上,如XGBoost、GBDT、Adaboost。python
那么,有同窗就会问了,为何这些算法会没有解释性呢?实际上是这样子的,刚刚所说的那些模型都是一些集成模型,都是由复杂的树结构去组成的模型,对于人类来讲咱们很难直观地去解释为何这个客户就是烂,究竟是什么特征致使他烂?git
其实像XGBoost之类的模型还算是有解释性的了,咱们经常都会看到有人用信息增益、节点分裂数来衡量特征的重要度,可是这真的是合理的吗?github
在解释是否合理前,有2个概念须要先给你们普及一下:算法
1)一致性segmentfault
指的是一个模型的特征重要度,不会由于咱们更改了某个特征,而改变其重要度。好比A模型的特征X1的重要度是10,那么若是咱们在模型里给特征X2加些权重以增大其重要度,从新计算重要度后,特征X1的重要度还是10。不一致性可能会致使具备重要度较大的特征比具备重要度较小的特征更不重要。app
2)个体化机器学习
指的是重要度的计算是能够针对个体,而不须要整个数据集一块儿计算。学习
好了,有了上面的认识,下面就来盘点一下目前常见的特征重要度计算的方法:spa
1)Tree SHAP:即 shapley加法解释,基于博弈论和局部解释的统一思想,经过树集成和加法方法激活shap值用于特征归因。code
2)Saabas:一种个性化启发式特征归因方法。
3)mean(| Tree SHAP |):基于个性化的启发式SHAP平均的全局属性方法。
4)Gain:即增益,由Breiman等人提出的一种全局的特征重要度计算方法,在XGBoost、scikit learn等包中均可以调用,它是给定特征在分裂中所带来的不纯度的减小值,常常会被用来作特征选择。
5)Split Count:即分裂次数统计,指的是给定特征被用于分裂的次数(由于越重要的越容易被引用,和论文引用差很少一个道理吧)。
6)Permutation:即排序置换,指的是随机排列某个特征,看下模型效果偏差的变化,若是特征重要的话,模型偏差会变化得特别大。
其中,属于个体化的仅有1-2,3-6均属于全局性统计,也就是说须要整个数据集进去计算的。
而对于一致性状况,咱们有一个例子来证实:
有2个模型,Model A 和 Model B,其中A和B彻底一致,可是咱们在计算预测值的时候,强行给 Model B 的 特征 Cough 加上 10分。以下图所示(点击看大图):
从实验结果能够看出以上6种方法的差异:
1)Saabas、Gain、Split Count均不知足 一致性 的要求,在改变了某个特征的权重以后,原先的特征重要度发生了改变,也直接致使重要度排序的改变。
2)而知足一致性要求的方法只有 Tree SHAP 和 Permutation了,而Permutation又是全局的方法,所以就只剩下了 Tree SHAP了。
SHAP(Shapley Additive exPlanation)是解释任何机器学习模型输出的统一方法。SHAP将博弈论与局部解释联系起来,根据指望表示惟一可能的一致和局部精确的加性特征归属方法。
以上是官方的定义,乍一看不知所云,可能仍是要结合论文(Consistent Individualized Feature Attribution for Tree Ensembles)来看了。
Definition 2.1. Additive feature attribution methods have an explanation model g that is a linear function of binary variables
M是输入特征的个数, ϕi’ 就是特征的贡献度。ϕ0 是一个常数(指的是全部样本的预测均值)。SHAP 值有惟一的解,也具备3个特性:Local Accuracy、Missingness、Consistency。
1)Local Accuracy:即局部准确性,表示每一个特征的重要度之和等于整个Function的重要度
2)Missingness:即缺失性,表示缺失值对于特征的重要度没有贡献。
3)Consistency:即一致性,表示改变模型不会对特征的重要度形成改变。
简单来讲,SHAP值多是惟一可以知足咱们要求的方法,而咱们上面讲到的XGBoost、GBDT等都是树模型,因此这里会用到 TREE SHAP。
安装仍是蛮简单的,能够经过终端的pip安装或者conda安装
pip install shap or conda install -c conda-forge shap
目前TREE SHAP能够支持的树集成模型有XGBoost, LightGBM, CatBoost, and scikit-learn tree models,能够看看下面的demo:
import xgboost import shap # load JS visualization code to notebook shap.initjs() """训练 XGBoost 模型,SHAP里提供了相关数据集""" X,y = shap.datasets.boston() model = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100) """ 经过SHAP值来解释预测值 (一样的方法也适用于 LightGBM, CatBoost, and scikit-learn models) """ explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X) # 可视化解释性 (use matplotlib=True to avoid Javascript) shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])
上面的图展现了每一个特征的重要度,会预先计算好一个均值,将预测值变得更高的偏向于红色这边,反之蓝色。
这个数据集有这些特征:'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT'
# visualize the training set predictions shap.force_plot(explainer.expected_value, shap_values, X)
上图能够看出每一个特征之间的相互做用(输出图是能够交互的)。
可是为了理解单个特性如何影响模型的输出,咱们能够将该特性的SHAP值与数据集中全部示例的特性值进行比较。因为SHAP值表明了模型输出中的一个特性的变化,下面的图表明了预测的房价随着RM(一个区域中每栋房子的平均房间数)的变化而变化的状况。
单一RM值的垂直色散表示与其余特征的相互做用。要帮助揭示这些交互依赖关系,dependence_plot 自动选择 另外一个特征来着色。好比使用RAD着色,突显了RM(每户平均房数)对RAD的值较高地区的房价影响较小。
"""建立一个SHAP图用于展现 单一特征在整个数据集的表现状况,每一个点表明一个样本""" shap.dependence_plot("RM", shap_values, X)
为了获得总体水平上每一个特征的重要度状况,咱们能够画出全部特征对于全部sample的SHAP值,而后根据SHAP值之和来降序排序,颜色表明特征重要度(红色表明高,蓝色表明低),每一个点表明一个样本。
"""画出全部特征的重要度排序图""" shap.summary_plot(shap_values, X)
咱们也能够只是显示SHAP值的全部样本的均值,画出bar图。
shap.summary_plot(shap_values, X, plot_type="bar")
[1] A Unified Approach to Interpreting Model Predictions
http://papers.nips.cc/paper/7...
[2] Consistent Individualized Feature Attribution for Tree Ensembles
https://arxiv.org/pdf/1802.03...
[3] Interpretable Machine Learning
https://christophm.github.io/...
[4] shap 官方文档
https://github.com/slundberg/...
本文由博客一文多发平台 OpenWrite 发布!