模型解释器——LIME算法介绍

作者: 三猫后端 | 来源:发表于2023-03-31 10:02 被阅读0次

    原文链接:模型解释器——LIME算法介绍


    导读:随着深度学习算法应用越来越广泛,大家不再满足于只得到模型的预测结果,而是希望更好的了解结果产生的原因。构建能让用户理解并信任的模型越来越重要。本文将介绍一种作为复杂模型事后解释器的算法——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算法介绍,后台回复“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.

    往期推荐:

    XGBoost(二):R语言实现

    疫情下,你还好吗

    R语言爬虫与文本分析

    图片相似度识别:pHash算法


    原文链接:模型解释器——LIME算法介绍

    相关文章

      网友评论

        本文标题:模型解释器——LIME算法介绍

        本文链接:https://www.haomeiwen.com/subject/yekhddtx.html