LIME:为什么我应该相信你?解释任何模型的预测结果

2023-11-26 23:40

本文主要是介绍LIME:为什么我应该相信你?解释任何模型的预测结果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LIME:为什么我应该相信你?解释任何模型的预测结果

  • 概述
    • 简介
    • 案例解释
    • LIME原理解释
      • Step 1 围绕待解释样本随机生成样本
      • Step 2 对随机样本标准化,以及利用模型对标准化数据进行预测
      • Step 3 特征选择
    • Step 4 特征贡献值确定
    • 总结

Github 项目链接:https://github.com/marcotcr/lime
参考链接:
LIME - Local Interpretable Model-Agnostic Explanations
LIME:一种解释机器学习模型的方法
LIME:模型预测结果是否值得信任?
论文参考链接:https://arxiv.org/pdf/1602.04938v1.pdf
责编:Adam(投稿请联系pei_adam@qq.com)

概述

机器学习在互联网大公司中已经被广泛应用。在不久的未来,也必将被大部分互联网公司应用。所以,当部署一个最新模型的时候,利用它在实际业务中进行预测的同时,理解它预测的底层缘由,从而评估它预测的可信度是至关重要的。

简介

机器学习在近几年计算机科学进步中起到了决定性的作用,不幸的的是,人,这个重要的角色经常在这个领域被忽视掉了。不管人是否是直接用机器学习分类器作为一个工具,又或者是部署到其它的产品中。一个重要的问题是:如果用户不相信这个模型或预测,用户肯定不会用它。值得注意的是,虽然相信模型和相信预测有一定的关联性,但是它们是两个不同的相信的定义。(1)相信预测,比如:用户会基于相信的预测,而采取一些行动。(2)相信模型,比如:用户是否相信这个模型表现合理。相较于模型对于用户是黑盒的状态而言,两种相信都直接受用户对模型行为了解的程度影响。首先针对于第一种相信预测,LIME为每个单独的预测结果提供了解释。其次,LIME选择了多个预测结果和预测解释来解决相信模型的问题。
LIME, 是一种可以为任何分类器和回归器提供合理解释的算法。其主要实现逻辑是:通过一个可解释性的模型来进行局部拟合这个模型。

案例解释

为了让用户能够有效相信和利用机器学习,LIME提供了一个可视化的HTML格式展示界面给用户,让用户能够对模型预测结果和各大特征之间有一个量化的理解。何谓量化理解?通俗的讲,既然你模型认定它属于某类,那么模型是通过这个案例的哪些特征来认定它属于这个类别的呢?并且,这些特征给模型提供了多大的确信度让模型更加确信的认定它属于这类的呢?举个例子:模型对猫和狗图片的分类问题,模型判定这张图片是猫,模型是如何判定的呢?模型可能是通过观察图片中动物的毛色,动物的眼睛,动物的头型等等这些特征,从而最后判定这张图片是猫不是狗。那么,这些特征分别对模型判定图片为猫的确信度是增加了还是减少了呢。这就是特征贡献值的作用【量化】,当特征贡献值>0的时候,我们就认为它对模型认为这张图片为猫的确信度增加了,至于增加的程度,就是通过特征贡献值来衡量。反之,如果贡献值<0,这个特征就是让模型认定这张图片为猫的确信度减少了,至于减少多少,这个当然也就是特征贡献值的绝对值来衡量了。接下来我通过一个demo案例来解释模型的预测结果和各大特征之间的量化理解:案例图1
上图为测试集合中,随机生成的一个测试案例的预测结果和LIME对该预测结果的解释。这个测试案例被预测为山鸢尾。LIME提供的解释是:模型判定它为山鸢尾时,观察了这个案例【这儿是花】四个方面的特征:花瓣宽度,花瓣长度,花萼宽度以及花萼长度。并且这些特征都对这个模型判定这个案例为山鸢尾起到了正向贡献【即:增加了模型判定它为山鸢尾的确信度】。其中,花瓣宽度,花瓣长度起到的贡献最大,分别为0.46和0.42。

LIME原理解释

LIME是如何判定这个某个案例属于某一类的呢?接下来,我们通过代码来一步步深入了解它实现的逻辑:

Step 1 围绕待解释样本随机生成样本

下图中,黄框1中的代码,LIME随机生成一个以标准差为1,均值为0,shape为[num_samples, num_features]的ndarray格式数据。其中,num_samples默认为5000,也可以外部函数调用指定。num_features是要解释样本的特征数目。然后,接下来,黄框2将这些数据做了一个反标准化操作。什么意思呢?通俗的解释一下,LIME在原始数据【如果sample_around_instance=True, 就是待解释的样本数据;否则,为训练样本的(均值,标准差)数据】周围随机生成了num_samples个符合标准高斯分布的数据。黄框3中,将待解释样本数据替代随机生成的样本数据中的第一个样本数据。
代码案例图1

Step 2 对随机样本标准化,以及利用模型对标准化数据进行预测

对基于Step1随机生成的num_samples-1个样本和1个待解释样本进行基于训练样本数据的均值和标准差对数据进行标准化操作【注意:step1中的黄框2不仅仅基于所有训练样本的均值和标准差做的反标准化的操作,还有基于待解释样本的反标准化操作。所以,这儿好像是有点问题,这也是本人提pr的缘由。如您有更好的见解,望收到您的邮件,或底下留言,谢谢.】。然后,挨个计算新产生样本和带解释样本的欧式距离,得到结果向量D。最后,利用模型对标准化样本数据进行预测, 得到预测结果yss【shape为[num_samples, num_labels]】。通俗的理解,每个样本对应每个类别都有一个预测值。由于本人研究期间只想获取待解释样本的所属类的特征贡献解释,所以,接下来,本人默认都用待解释样本所属类对应预测值进行展开。

scaled_data = (data - self.scaler.mean_) / self.scaler.scale_distances = sklearn.metrics.pairwise_distances(scaled_data,scaled_data[0].reshape(1, -1),metric=distance_metric
).ravel()yss = predict_fn(inverse)

Step 3 特征选择

利用Step 2生成的距离向量D,通过核函数f(x)【这儿我贴出来的核函数是lime_tabular.py对应的核函数】, 挨个计算每个样本相对于待解释样本的权重值Wi【原始样本相对于原始样本距离为0,权重为1】,其中Wi∈(0, 1],得到权重矩阵W。然后,利用Step 2产生的对应类别预测值和权重W进行指定个数【记作n】的特征选择。

if kernel_width is None:kernel_width = np.sqrt(training_data.shape[1]) * .75kernel_width = float(kernel_width)def kernel_fn(d):return np.sqrt(np.exp(-(d ** 2) / kernel_width ** 2))
weights = self.kernel_fn(distances)
labels_column = neighborhood_labels[:, label]
used_features = self.feature_selection(neighborhood_data,labels_column,weights,num_features,feature_selection)
  • 特征选择

特征选择方法默认为auto,根据以下代码我们可以知道auto的选择思想是根据特征的个数来决定是用贪心算法的forward_selection或者用highest_weights来进行,如果用none的话,那就直接选择所有的特征

forward_selection

  1. 假设特征集合为list=[]
  2. 遍历所有特征,利用num_samples个新生成样本和list中的特征+一个特征进行训练,得到一个岭回归模型记作M
  3. 计算M的拟合系数R2 Score,比较获取所有特征所对应的R2 Score,保留其中R2 Score最大所对应的特征f1至list中。
  4. 重复2.3步骤,直至获取到想要特征数目

highest_weights 类似PCA算法,利用num_samples个新生成样本集中所有特征进行训练,得到一个岭回归模型记作M1,然后获取M1中系数最大的前n个特征。

lasso_path 通过构建lasso回归对特征进行稀疏化处理,获取特征值为非0的特征。

注意:无论是forward_selection, 还是highest_weights,在进行训练岭回归模型时,由于会对数据进行标准化处理,所以会利用权重矩阵W来计算加权平均值,进而利用标准化后的数据进行训练岭回归模型。

def feature_selection(self, data, labels, weights, num_features, method):"""Selects features for the model. see explain_instance_with_data tounderstand the parameters."""if method == 'none':return np.array(range(data.shape[1]))elif method == 'forward_selection':return self.forward_selection(data, labels, weights, num_features)elif method == 'highest_weights':clf = Ridge(alpha=0, fit_intercept=True,random_state=self.random_state)clf.fit(data, labels, sample_weight=weights)feature_weights = sorted(zip(range(data.shape[0]),clf.coef_ * data[0]),key=lambda x: np.abs(x[1]),reverse=True)return np.array([x[0] for x in feature_weights[:num_features]])elif method == 'lasso_path':weighted_data = ((data - np.average(data, axis=0, weights=weights))* np.sqrt(weights[:, np.newaxis]))weighted_labels = ((labels - np.average(labels, weights=weights))* np.sqrt(weights))nonzero = range(weighted_data.shape[1])_, coefs = self.generate_lars_path(weighted_data,weighted_labels)for i in range(len(coefs.T) - 1, 0, -1):nonzero = coefs.T[i].nonzero()[0]if len(nonzero) <= num_features:breakused_features = nonzeroreturn used_featureselif method == 'auto':if num_features <= 6:n_method = 'forward_selection'else:n_method = 'highest_weights'return self.feature_selection(data, labels, weights,num_features, n_method)

Step 4 特征贡献值确定

利用Step 3得到的特征,再次进行训练新生成数据得到一个岭回归模型记作M_final。最后,M_final中的系数即为每个特征所对应的特征贡献值。

if model_regressor is None:model_regressor = Ridge(alpha=1, fit_intercept=True,random_state=self.random_state)
easy_model = model_regressor
easy_model.fit(neighborhood_data[:, used_features],labels_column, sample_weight=weights)
prediction_score = easy_model.score(
neighborhood_data[:, used_features],
labels_column, sample_weight=weights)local_pred = easy_model.predict(neighborhood_data[0, used_features].reshape(1, -1))if self.verbose:print('Intercept', easy_model.intercept_)print('Prediction_local', local_pred,)print('Right:', neighborhood_labels[0, label])
return (easy_model.intercept_,sorted(zip(used_features, easy_model.coef_),key=lambda x: np.abs(x[1]), reverse=True),prediction_score, local_pred)

总结

相较于晦涩难懂的论文,代码更加易懂。虽然LIME在我个人实践中特征和特征值整体表现效果还是稳定的,但LIME通过随机生成的样本来对单个样本进行解释导致每回所获的得可解释性特征和特征值都会有些许差异。这点个人还是保留疑惑。

注:如有不正之处,欢迎留言评论或发邮件指正,谢谢

这篇关于LIME:为什么我应该相信你?解释任何模型的预测结果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/426482

相关文章

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言