我是靠谱客的博主 幸福高跟鞋,最近开发中收集的这篇文章主要介绍wikisql 数据集解释_机器学习可解释性Lime方法小结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

c2558ad16b3421c36f6267133e8066c7.png

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

原理介绍

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

f4d01746f194636ac950a3d4edb0ebb6.png
Lime原理示例

实现步骤

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

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

目标函数

LIME会产生一个新的数据集(选定样本x周围进行扰动得到), 接着在这个新的数据集上,训练一个简单模型(可解释的模型), 通过以下目标函数衡量衡量两个模型之间的差异:

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

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

样本相似度

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

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

代码实践

使用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()

1ffe651db8908553851a6b50c6807821.png
预测值、特征权重、特征值

48b3ea5964a6b58b7b978f9b7ae39123.png
特征权重图

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

参考资料

https://christophm.github.io/interpretable-ml-book​christophm.github.io 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).​www.kdd.org 加载中​mathpretty.com

最后

以上就是幸福高跟鞋为你收集整理的wikisql 数据集解释_机器学习可解释性Lime方法小结的全部内容,希望文章能够帮你解决wikisql 数据集解释_机器学习可解释性Lime方法小结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部