导读:随着深度学习算法应用越来越广泛,大家不再满足于只得到模型的预测结果,而是希望更好的了解结果产生的原因。构建能让用户理解并信任的模型越来越重要。本文将介绍一种作为复杂模型事后解释器的算法——LIME,并以乳腺癌诊断为例,对XGboost模型结果进行解释。
一
算法介绍
Local Interpretable Model-agnostic Explanations (LIME) 算法于2016年,由Marco Tulio Ribeiro、Sameer Singh、Carlos Guestrin三人在《“Why Should I Trust You?” Explaining the Predictions of Any Classifier》中提出,是一种复杂模型的事后解释方法,可用于单个预测结果的解释和模型可靠性判断。
1、使用背景
复杂模型往往具有黑盒属性,虽然能给出较高准确率的结果,但难以解释内在原理,为实际应用带来不便,比如:营销中有了产品销量的预测,还需告诉业务人员应该进行怎样的操作;风控中给出了风险概率,还需要给出具体风险点相关人员才能处理;银行信贷业务需要明确告知客户被拒原因等。因此,在使用复杂模型时,需要给出相关手段,增加模型的透明度和可解释性,LIME就是其中的方法之一。
2、解决问题
结合论文中的例子来说明LIME可以解决的两类问题:
复杂模型预测病人得了流感,LIME给出得到这个结果的主要特征,其中鼻塞、头痛对结果的预测起到促进作用,不疲劳起到反向作用。医生结合这些及自己的先验知识,可以做出是否相信这个结果的判断。
应用时,往往会训练多个模型,此时就需要从多个模型中选择最信任的那个。如下有两个判断文章与“基督教“有关还是与”无神论教“有关的模型,两个模型的预测结果都是准确的,但通过LIME发现,第二个模型得到结果的重要特征是邮件主题的“Posting“这个词,而这个词与无神论本身并没有太多的联系,因此通过对结果的解释,可以知道模型1更为可信。
3、算法特点
模型的全称已经很好的解释了LIME模型的特点:
Local:在想要解释的预测值附近构建可解释的模型,并且该模型在这个点周围的局部效果与复杂模型的效果很接近。
Interpretable:解释器的模型与特征都必须是可解释的,可用局部样本特征解释复杂模型预测结果。
Model-Agnostic:与复杂模型无关,任何模型都可以用LIME进行解释。
Explanation:是一种事后解释方法。
4、算法原理
step1:得到预测样本附近的随机样本
假设预测样本为
在他周围生成N个随机样本
当某一个特征x是类别变量,则根据训练集分布采样,当x为连续变量,新生成的第k个样本的第i个特征为:
其中,a为通过标准正态分布生成的随机数,delta为xi中训练集中的标准差。
step2:为生成的随机样本打上标签
将生成的随机样本放入复杂模型f中训练,得到预测结果。
step3:计算新生成样本与预测样本的距离
随机生成的新样本与预测样本越近,越能更好的解释预测点,因此赋予更高权重。
其中,D为距离函数,D越小权重越高。
step4:构建可解释模型
从p个特征中选部分特征作为解释特征,拟合模型。
二
案例展示
网上很多LIME的介绍都说LIME主要应用于图像或文本识别,但因为LIME的model-agnostic特征,它也可用于表格数据。
下面就以乳腺癌诊断为例,进行代码演示。首先导入数据,并拆分训练集和测试集。
import lime
import sklearn
import numpy as np
import sklearn.ensemble
import sklearn.metrics
from sklearn.datasets import load_breast_cancer
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
cancer_data_bunch = load_breast_cancer()
cancer_data = pd.DataFrame(cancer_data_bunch.data,columns=cancer_data_bunch.feature_names)
cancer_target = pd.DataFrame(cancer_data_bunch.target,columns=['target'])
#拆分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(cancer_data, cancer_target, test_size=0.25)
训练xgboost模型,得到的R2在0.78左右。
import xgboost as xgb
xgb_model = xgb.XGBRegressor(n_estimators=500)
xgb_model.fit(x_train,y_train)
from sklearn.metrics import r2_score
r2_score(y_test,xgb_model.predict(x_test))#计算R2
建立一个LIME解释器,对第81个样本进行解释,发现判断该样本为患病的主要支撑特征。
from lime.lime_tabular import LimeTabularExplainer
feature_names = list(x_train.columns)
#建立解释器
explainer = LimeTabularExplainer(x_train.values,feature_names=feature_names,mode='regression')
#解释第81个样本的规则,选择10个特征
exp = explainer.explain_instance(x_test.iloc[81], xgb_model.predict,num_features=10)
#画图
fig = exp.as_pyplot_figure()
分析图中,左边是用默认的5000个抽样得到的样本,通过拟合线性回归模型,计算出来相对应的预测值。预测值中最小是-0.26,最大是1.07,0.99则是复杂模型的预测值。中间的图是线性模型中10个特征变量对应的系数大小,positive代表系数为正。右边是样本中对应10个变量的取值。
#画分析图
exp.show_in_notebook(show_table=True, show_all=False)
三
优缺点
1. 具有很强的通用性,效果好
LIME能够兼容任何一种机器学习算法,具有广泛的适用性。
2. 针对性强,可塑性好
LIME可以选取代表性样本进行训练,降低了工作量和难度,也能够依照客户灵活的需求进行特殊场景的分析,如调节某一特征的权重,分析其变化对最终结果的影响程度。
3. 局部性不可代表全局性
LIME从局部出发训练可解释性模型,当全局决策范围具有极其复杂的非线性时,局部线性区域范围小,仅能对极少的样本进行可解释分析。
4. 时间成本高
对每一个待测样本进行可解释分析时,需重新训练对应的可解释模型,训练时间长。
后台回复“LIME”获得论文原文及本文代码
参考内容:
1、https://cloud.tencent.com/developer/news/617057
2、https://mp.weixin.qq.com/s/qkWGKrAuDQqmNl-vxTekXg
3、https://blog.csdn.net/weixin_42347070/article/details/106076360
4、Ribeiro M T , Singh S , Guestrin C . "Why Should I Trust You?": Explaining the Predictions of Any Classifier[J]. ACM, 2016.