机器学习可解释性方法Lime小结

机器学习相对简单线性模型有更优异的效果,但是其复杂的原理让模型并不容易理解和解释。可解释的方法有很多众,大概可以分为全局解释和局部解释,以及与模型适配和与模型无关的方法,本文对一种局部的、与模型无关的方法Lime进行介绍,尝试从原理并结合python的Lime工具包进行梳理。

原理介绍

Lime(Local Interpretable Model-Agnostic Explanations)是使用训练的局部代理模型来对单个样本进行解释。假设对于需要解释的黑盒模型,取关注的实例样本,在其附近进行扰动生成新的样本点,并得到黑盒模型的预测值,使用新的数据集训练可解释的模型(如线性回归、决策树),得到对黑盒模型良好的局部近似。

机器学习可解释性方法Lime小结_第1张图片

实现步骤

  1. 如上图是一个非线性的复杂模型,蓝/粉背景的交界为决策函数;
  2. 选取关注的样本点,如图粗线的红色十字叉为关注的样本点X;
  3. 定义一个相似度计算方式,以及要选取的K个特征来解释;
  4. 在该样本点周围进行扰动采样(细线的红色十字叉),按照它们到X的距离赋予样本权重;
  5. 用原模型对这些样本进行预测,并训练一个线性模型(虚线)在X的附近对原模型近似。

这样就可以使用可解释性的模型对复杂模型进行局部解释。

目标函数

LIME会产生一个新的数据集(选定样本x周围进行扰动得到), 接着在这个新的数据集上,训练一个简单模型(可解释的模型), 通过以下目标函数衡量衡量两个模型之间的差异:
\xi \left ( x \right )=arg\underset{g\in G}{min}L\left ( f,g,\pi _{x} \right ) +\Omega \left ( g \right )

  • f表示原始的模型, 即需要解释的模型;
  • g表示简单模型, G是简单模型的一个集合, 如所有可能的线性模型;
  • πx表示新数据集中的数据x'与原始数据 x的距离;
  • Ω(g)表示模型g的复杂程度;

假设原始模型f为需要被解释的复杂模型,对实例x 的解释模型是模型g (例如线性回归模型),G 是可能的可解释模型的集,接近度πx 定义了实例x 附近进行采样的邻域大小(即对x附近进行扰动,扰动前后的样本距离)。我们希望可解释模型的复杂度Ω(g) 保持较低水平时,最小化损失L (例如均⽅误差) ,即解释模型g 与原始模型f 预测的接近程度。

样本相似度

在样本X附近进行扰动,对扰动前后的样本相似度进行定义,样本类型不同会有不同的定义(文本的话就是余弦相似性,图像的话就是L2范数距离)。相似度计算公式如下:

\pi _{x}\left ( z \right )=exp\left ( -\frac{D\left ( x,z \right )^{2}}{\sigma ^{2}} \right )

有了相似度的定义,便可以将原先的目标函数改写成如下的形式。其中f(z)就是扰动样本,在d维空间(原始特征)上的预测值,并把该预测值作为目标,g(z’)则是在d’维空间(可解释特征)上的预测值,然后以相似度作为权重,因此上述的目标函数便可以通过线性回归的方式进行优化。

\xi \left ( x \right )=\underset{​{z}',z\in Z}{\sum }\pi _{x}\left ( z \right )\left ( f\left ( z \right )-g\left ( {z}' \right ) \right )^{2}

代码实践

使用python的lime库进行实践,样本为信贷放款样本预测观察点后三期是否逾期。对单个样本进行lime的局部解释,类似于评分卡模型中输出原因码,比如预测这个样本为bad的概率大,那是哪些方面的原因导致的,是信贷历史记录较差,还是还款能力不足?用这种方法对机器学习的效果和解释性进行一个平衡。

import sklearn
import sklearn.datasets
import sklearn.ensemble
import numpy as np
import lime
import lime.lime_tabular

x = np.array(data[feats].fillna(-99999))
y = np.array(data['target'])
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state = 400)
# 训练XGBoost模型
model_xgb = xgb.XGBClassifier(
                        learning_rate =0.05,
                         n_estimators=50,
                         max_depth=3,
                         min_child_weight=1,
                         gamma=0.3,
                         subsample=0.8,
                         colsample_bytree=0.8,
                         objective= 'multi:softprob',
                         nthread=4,
                         scale_pos_weight=1,
                         num_class=2,
                         seed=27
                    ).fit(X_train, y_train)
# 生成解释器
explainer = lime.lime_tabular.LimeTabularExplainer(X_train, feature_names=feats,
                                                   class_names=[0,1], discretize_continuous=True)
# 对局部点的解释
i = np.random.randint(0, X_test.shape[0])
exp = explainer.explain_instance(X_test[i], model_xgb.predict_proba, num_features=6)
# 显示详细信息图
exp.show_in_notebook(show_table=True, show_all=True)
# 显示权重图
exp.as_pyplot_figure()

机器学习可解释性方法Lime小结_第2张图片

机器学习可解释性方法Lime小结_第3张图片

首先训练xgboost模型,并选择需要解释的样本点进行解释,Prediction probabilities画图展示出对于样本的预测值,样本中每个变量的重要性权重,以及每个变量的取值,可以看到pre_max_overdue历史最大逾期期数的变量的特征重要性最大。

 

参考资料

  • Interpretable Machine Learning:A Guide for Making Black Box Models Explainablehttps://christophm.github.io/interpretable-ml-book/
  • Ribeiro, Marco Tulio, Sameer Singh, and Carlos Guestrin. “Why should I trust you?: Explaining the predictions of any classifier.” Proceedings of the 22nd ACM SIGKDD international conference on knowledge discovery and data mining. ACM (2016).
  • Lime: Explaining the predictions of any machine learning classifier

你可能感兴趣的:(机器学习,python,机器学习,大数据)