又一款机器学习模型解释神器:LIME

news2025/7/14 5:40:07

在机器学习的许多应用中,要求用户信任模型来帮助他们做出决策。医生肯定不会仅仅因为“模型这么说”就给病人做手术。即使在风险较低的情况下,例如从 Netflix 选择要观看的电影时,在我们根据模型放弃几个小时的时间之前,也需要一定程度的信任。尽管许多机器学习模型都是黑匣子,但了解模型预测背后的基本原理肯定会帮助用户决定何时信任或不信任他们的预测。

下图是模型预测某个患者患有流感的一个示例。由“解释器”解释预测,该“解释器”突出显示对模型最重要的症状。有了这些关于模型背后基本原理的信息,

简单的模型例如线性回归,LR等模型非常易于解释,但在实际应用中的效果却远远低于复杂的梯度提升树模型以及神经网络等模型。

现在大部分互联网公司的建模都是基于梯度提升树或者神经网络模型等复杂模型,遗憾的是,这些模型虽然效果好,但是我们却较难对其进行很好地解释,这也是目前一直困扰着大家的一个重要问题,现在大家也越来越加关注模型的解释性。

本文讨论了一种被称为LIME的新的解释技术,它可以解释任何分类器的预测。可以他认为是 SHAP 的升级版,更多详情可以查看Github链接:https://github.com/marcotcr/lime

文章目录

    • 技术提升
    • 什么是LIME?
    • LIME训练及解释模型
    • LIME实战案例
      • LIME解释二分类模型
        • 用LIME解释预测
      • 可视化解释
      • LIME解释回归模型
    • VevestaX保存结果
      • 如何使用VevestaX?
    • 写在最后

技术提升

本文由技术群粉丝分享,项目源码、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、添加微信号:dkl88191,备注:来自CSDN +研究方向
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

什么是LIME?

LIME,即Local Interpretable Model-Agnostic Explanations,是一种解释分类器或回归器预测的算法,通过用可解释的模型对其进行局部近似。它通过调整特征值来修改单个数据样本,并观察其对输出的影响。它扮演着 “解释者” 的角色,解释每个数据样本的预测。LIME的输出是一组解释,代表每个特征对单个样本预测的贡献,这是一种局部可解释性。

LIME训练及解释模型

import lime  
from lime import lime_tabular  
from sklearn.ensemble import RandomForestClassifier  
classifier=RandomForestClassifier()  
classifier.fit(x_train,y_train)  
interpretor = lime_tabular.LimeTabularExplainer(  
    training_data=np.array(x_train),  
    feature_names=x_train.columns,  
    mode='classification')  
exp = interpretor.explain_instance(  
    data_row=x_test.iloc[5], ##new data  
    predict_fn=classifier.predict_proba)  
exp.show_in_notebook(show_table=True)  

这是索引为5的测试数据的的解释的样子。

LIME将单个记录作为输入,然后将解释作为输出。

该解释有三个部分。

  1. 最左边的部分显示预测概率,在我们的例子中,0的概率是0.33,而1的概率是0.67。

  2. 中间部分返回最重要的特征。对于二元分类任务,它有两种颜色:橙色/蓝色。橙色的属性支持class 1,蓝色的属性支持class 0,Age>44 的支持class 1,水平条上的浮点数字代表这些特征的相对重要性。

  3. 颜色编码在各部分是一致的。它包含了变量的实际值。

LIME实战案例

LIME(Local Interpretable Model-agnostic Explanations)支持的模型包括:

  • 结构化模型的解释

  • 文本分类器的解释

  • 图像分类器的解释

LIME被用作解释机器学习模型的解释,通过LIME我们可以知道为什么模型会这样进行预测。本文介绍两种常用的监督模型:二分类及回归模型。更多详情可以查看Github链接:https://github.com/marcotcr/lime

LIME解释二分类模型

这里使用fetch_20newgroups数据集。为了简单起见,将使用两类子集:无神论atheism和信仰基督教christianity。

from sklearn.datasets import fetch_20newsgroups  
categories = ['alt.atheism', 'soc.religion.christian']  
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)  
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)  
class_names = ['atheism', 'christian']  

使用文本数据常用处理的tfidf矢量化方法来处理数据。

vectorizer = sklearn.feature_extraction.text.TfidfVectorizer(lowercase=False)  
train_vectors = vectorizer.fit_transform(newsgroups_train.data)  
test_vectors = vectorizer.transform(newsgroups_test.data)  

使用随机森林模型进行分类。一般情况下,我们比较难以理解随机森林在做什么,尤其是有很多基树评估器的森林。

rf = sklearn.ensemble.RandomForestClassifier(n_estimators=500)  
rf.fit(train_vectors, newsgroups_train.target)  
pred = rf.predict(test_vectors)  
sklearn.metrics.f1_score(newsgroups_test.target,   
                         pred, average='binary')  
# 0.9166666666666666  

从结果看,该分类器F1_socre很高,接下来看看随机森林是否已经过拟合。

用LIME解释预测

Lime解释器假设分类器作用于原始文本,而sklearn分类器作用于文本的矢量表示。为此,使用sklearn的pipeline,并使用predict_proba来预测概率。

from lime import lime_text  
from sklearn.pipeline import make_pipeline  
c = make_pipeline(vectorizer, rf)  
print(c.predict_proba([newsgroups_test.data[0]]))  
# [[ 0.274  0.726]]  

现在创建一个解释程序对象,我们给class_names传递一个参数,以便更好地显示。

from lime.lime_text import LimeTextExplainer  
explainer = LimeTextExplainer(class_names=class_names)  

然后为测试集中任意文档生成最多6个特性的解释。

idx = 83  
exp = explainer.explain_instance(newsgroups_test.data[idx], c.predict_proba, num_features=6)  
print('Document id: %d' % idx)  
print('Probability(christian) =', c.predict_proba([newsgroups_test.data[idx]])[0,1])  
print('True class: %s' % class_names[newsgroups_test.target[idx]])  
Document id: 83  
Probability(christian) = 0.45  
True class: atheism

分类器对这个例子的预测是正确的(它预测了无神论)。

解释结果如下:加权特征列表。

exp.as_list()  
[('Host', -0.149264358677072),  
 ('Posting', -0.12720106435313583),  
 ('NNTP', -0.09852417087289796),  
 ('edu', -0.030833516990747947),  
 ('There', -0.012734449577693457),  
 ('University', 0.010456648119358973)]

这些加权特征是一个线性模型,它近似于测试示例附近的随机森林分类器的行为。粗略地说,如果我们从文档中删除“posting”和“Host”,那么预测应该向相反的类别(christian)移动约0.27(两个特征的权重之和)。我们看看情况是否如此。

print('Original prediction:', rf.predict_proba(test_vectors[idx])[0,1])  
tmp = test_vectors[idx].copy()  
tmp[0,vectorizer.vocabulary_['Posting']] = 0  
tmp[0,vectorizer.vocabulary_['Host']] = 0  
print('Prediction removing some features:', rf.predict_proba(tmp)[0,1])  
print('Difference:', rf.predict_proba(tmp)[0,1] - rf.predict_proba(test_vectors[idx])[0,1])  
Original prediction: 0.414  
Prediction removing some features: 0.684  
Difference: 0.27

这些解释该文献模式的词语似乎还不错,与基督教或无神论都没有太大关系。其实这些都是出现在电子邮件标题中的单词,这将更加容易区分类。

可视化解释

解释可以作为 matplotlib 的 barplot 返回:

%matplotlib inline  
fig = exp.as_pyplot_figure()  

解释也可以导出为html页面(我们可以在本笔记本中呈现),使用D3.js呈现图形。

exp.show_in_notebook(text=False)  

或者,我们可以将完整包含的 html 页面保存到一个文件:

exp.save_to_file('/tmp/oi.html')  

最后,我们还可以包含原始文档的可视化,并突出显示解释中的单词。注意,对分类器影响最大的单词都在电子邮件标题中。

exp.show_in_notebook(text=True)  

这里随机森林只是一个例子,这个解释程序适用于你可能想要使用的任何分类器,只要该分类器具有 predict_proba功能即可。

LIME解释回归模型

from sklearn.datasets import load_boston  
import sklearn.ensemble  
import numpy as np  
import lime  
import lime.lime_tabular  
  
boston = load_boston()  
rf = sklearn.ensemble.RandomForestRegressor(n_estimators=1000)  
train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(  
    boston.data,   
    boston.target,   
    train_size=0.80)  
  
rf.fit(train, labels_train)  
print('Random Forest MSError', np.mean((rf.predict(test) - labels_test) ** 2))  
print('MSError when predicting the mean', np.mean((labels_train.mean() - labels_test) ** 2))  
print('MSError when predicting the mean', np.mean((labels_train.mean() - labels_test) ** 2))  
  
categorical_features = np.argwhere(np.array([len(set(boston.data[:,x]))   
                                             for x in range(boston.data.shape[1])]) <= 10).flatten()  
  
explainer = lime.lime_tabular.LimeTabularExplainer(train,  
                   feature_names=boston.feature_names,  
                   class_names=['price'],   
                   categorical_features=categorical_features,   
                   verbose=True, mode='regression')  
  
i = 25  
exp = explainer.explain_instance(test[i], rf.predict, num_features=5)  
Random Forest MSError 10.988590741176479  
MSError when predicting the mean 79.26374406656593  
MSError when predicting the mean 79.26374406656593  
Intercept 23.529141771424232  
Prediction_local [24.50725476]  
Right: 22.748400000000025
exp.show_in_notebook(show_table=True)  

exp.as_list()  
[('6.99 < LSTAT <= 11.43', 1.7571320048618118),  
 ('6.21 < RM <= 6.62', -1.5638211582388033),  
 ('NOX > 0.62', -0.77384372989110417),  
 ('19.10 < PTRATIO <= 20.20', -0.60756112694664299),  
 ('2.08 < DIS <= 3.17', -0.39085870918058263)]

VevestaX保存结果

VevestaX是一个开源的Python包,它包含各种特性,使数据科学家的工作变得更加容易,尤其是在分析和从数据中获得见解的时候。

该包可以用于从数据集中提取特征,并可以跟踪代码中使用的所有变量。

这个包最好的部分是它的输出。VevestaX的输出文件为我们提供了大量EDA工具,如直方图、性能图、相关矩阵等,而无需分别为它们编写实际的代码。

如何使用VevestaX?

使用以下方式安装软件包:

pip install vevestaX  

下面是云朵君安装时,新增的几个依赖包,除此之外,还有不少已经安装过的。

Installing collected packages: deprecation,   
pynacl, py4j, pikepdf, statistics, pyspark,   
PyGithub, ipynbname, img2pdf, datetime, vevestaX

导入并使用:

from vevestaX import vevesta as v  
V=v.Experiment()  
# 跟踪使用和设计的特征  
V.ds = pd.DataFrame(boston.data, columns=boston.feature_names)  
# V.fe = dataframe  

最后,为了将所使用的特性和变量转储到一个excel文件中,并了解这些数据所携带的用途:

V.dump(techniqueUsed='LIME',  
       filename="LIME.xlsx",  
       message="AIF 360 was used",  
       version=1)  

下面是输出结果(部分):

写在最后

信任对于人类与机器学习系统的有效交互至关重要,我们认为解释个人预测是评估信任的有效方法。LIME 是一种有效的工具,可以促进机器学习从业者的这种信任,并且是添加到他们的工具带中的好选择。最后!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红黑树封装 map/set 及其迭代器(C++)

目录 一、map/set 的封装 1.1 封装思路 1.2 红黑树节点调整 1.3 map 和 set 的定义 1.4 仿函数 KeyOfValue 1.5 map/set 的插入 二、map/set 迭代器实现 2.1 迭代器的定义 2.2 解引用运算符重载 2.3 成员访问运算符重载 2.4 (不)等于运算符重载 2.5 begin() 与 end…

[附源码]java毕业设计智慧农业销售平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

认知电子战 | 电子战简介

1 电子战的基本概念 电子战(Electronic Warfare,EW)也叫做电子对抗(Electronic Counter Measures,ECM) 简洁定义: 电子战是为确保我方使用电磁频谱,同时阻止敌方使用电磁频谱所采取的战术与技术 完善定义: 利用电磁能、定向能、水声能等的技术手段,确定、扰乱、削弱…

Linux kprobe原理

文章目录前言一、Kprobes and Return Probes二、How Does a Kprobe Work三、Changing Execution Path四、Return Probes4.1 How Does a Return Probe Work4.2 Kretprobe entry-handler五、How Does Jump Optimization Work5.1 Init a Kprobe5.2 Safety Check5.3 Preparing Deto…

Ubuntu配置全局系统代理(常用工具配置)

Ubuntu配置全局系统代理&#xff08;常用工具&#xff09;问题描述解决方法配置系统代理终端部分配置配置apt代理配置curl,wget,pip代理git相关代理的设置配置docker代理问题描述 公司电脑网络规则做了限制&#xff0c;主机没办法通外网&#xff0c;只能通过代理连接外网。主机…

普惠联接,让人类诗意地栖居在大地上

弗里德里希荷尔德林为世间留下了一句精彩绝伦的诗句&#xff1a;“人生在世&#xff0c;成绩斐然&#xff0c;却还依然诗意地栖居在大地上。”“人&#xff0c;诗意地栖居”&#xff0c;这一命题启发了此后众多思想家、社会学家的缪斯。人之为人&#xff0c;应该如何成为存在的…

Web APIs——BOM

下面从以下7个方面介绍BOM&#xff1a; BOM概述window对象的常见事件定时器JS执行机制location对象navigator对象history对象 1. 什么是BOM&#xff1f; BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交…

谷歌FLAN-T5作者亲讲:5400亿参数,1800个任务,如何实现大语言模型“自我改进”...

2021年&#xff0c;谷歌的研究者们提出了FLAN大模型&#xff0c;其基于Instruction Tuning的方式&#xff0c;极大地提升了大语言模型的理解能力。同时&#xff0c;各种Prompting方法的涌现预示着针对大模型的下游微调将成为研究领域关注的重点。近日&#xff0c;谷歌研究者们再…

电影主题HTM5网页设计作业成品——爱影评在线电影(10页面)使用dreamweaver制作采用DIV+CSS进行布局

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

企业知识库有什么价值?

图为简道云企业知识库让雇员对知识管理深感激动的最差课堂教学 简道云知识库&#xff1a;http://s.fanruan.com/rgdrd 我们可以借助创建知识程序库应用领域知识管理方法论&#xff0c;来同时实现重新分配知识。 最终目标是让每一人都有参与 KM 的积极主动性&#xff0c; 以期…

DOAW咖啡品牌是如何生意增长的?

上海人爱喝咖啡&#xff0c;早已不是什么秘密&#xff0c;上海是中国咖啡市场的战略要地&#xff0c;以行业而论&#xff0c;咖啡赛道有星巴克、瑞幸等大品牌&#xff0c;同时也有不少新品牌不断冲击线下线上渠道&#xff0c;使这个行业内卷加速。 DOAW虽然成立时间短&#xff…

【深度学习】yolov5 tag7.0 实例分割 从0到1的体会,从模型训练,到量化完成

这里记录下yolov5 tag7.0的实例分割&#xff0c;因为也用过paddle家族的实例分割&#xff0c;能够训练出来&#xff0c;但是开放restiful api时遇到点小问题&#xff0c;还是yolov爽啊&#xff01;&#xff01;通过这篇博文&#xff0c;您可以一步步的搭建自己的分割网络。 文章…

python+SQL sever+thinter学生宿舍管理系统

pythonSQL severthinter学生宿舍管理系统一、系统介绍二、功能展示1.主页2.用户登陆3.学生信息三、数据库四、其它1.其他系统实现一、系统介绍 系统主要功能学生信息管理、管理员信息管理、核酸信息管理等。 二、功能展示 1.主页 2.用户登陆 3.学生信息 三、数据库 /*Navic…

汉罗塔汉洛塔c++,看不懂ni打我

汉罗塔汉洛塔c,看不懂ni打我 大哥大姐手下留情 别打我&#xff01;&#xff01;&#xff01; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GC9f81Hm-1669391569678)(C:\Users\ASUS\Desktop\汉罗塔 . Input第一行为一个正整数nOutput若干行&#…

vue3新一代状态管理器 — pinia的学习与使用

目录一、vuex与pinia特性二、使用pinia2.1 安装pinia2.2 项目引入2.3 创建store2.4 使用storegetteraction2.5 修改state1、直接修改2、使用$patch3、使用actions2.6 storeToRefs一、vuex与pinia Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子&#xff0c;结合了 Vuex 5…

4. 云计算中的存储基础知识

4.1 物理磁盘类型和存储设备类型 虚拟化中的存储架构 物理磁盘类型 - SATA盘 SATA的全称Serial Advanced Technology Attachment&#xff0c;SATA&#xff08;Serial ATA&#xff09;口的硬盘又叫串口硬盘。SATA采用串行连接方式&#xff0c;串行ATA总线使用嵌入式时钟信号&a…

kubernetes组件 Controller manager深刻认知

kubernetes组件 Controller manager深刻认知Controller manager常见的controllerController manager的工作流程informer的内部机制控制器的协同工作原理ReplicaSet controller 是如何被管理的&#xff1f;statefuleset 和deployment controller是如何控制滚动升级的statefulese…

学习基于html和JavaScript的滑动图片拼图验证源码

之前的文章《使用C#中的GDI功能实现图片填充验证方式》中介绍过使用GDI在Winform中实现图片拼图验证的思路&#xff0c;学了html中的canvas使用方式后&#xff0c;也可以照搬思路实现&#xff0c;只不过没有在Winform中方便。但是在网上看了不少基于html和JavaScript的滑动图片…

【数据结构】栈的模拟和使用理解

学习目录栈(Stack)栈的概念栈的使用栈相关的应用场景栈的模拟实现中缀表达式 转 后缀表达式栈(Stack) 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作. 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底&a…

关于vba代码运行时错误1004 应用程序定义或对象定义错误问题

一、错误描述 将Excel所有工作表&#xff0c;汇总到一个工作表中&#xff1a; 在thisworkbook中运行如下&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Su…