首先,访问github上的LIME源码,https://github.com/marcotcr/lime
将代码克隆至本地。我用的是pycharm打开进行阅读。下载下来后使用
pip install . ,别用pip install lime,使用后面的就不会使用源码中的Lime,阅读源码使用printf大法就会失效了。
可以看一下readme文档中提到的一个最简单的tutorial,以它为切入点开始源码的阅读。
https://github.com/marcotcr/lime/blob/master/doc/notebooks/Lime%20-%20basic%20usage%2C%20two%20class%20case.ipynb
这篇tutorial notebook的前半部分是在调用sklearn中的random forest进行文本分类。是一个二分类。
接下来,就要用到LIME模型对随机森林进行解释了
首先,使用sklearn中的Pipeline,目的是为了能直接输入纯文本就能得到预测结果,相当于是对模型的封装
![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150209657-865556855.png)
上面这几行代码就完成了对随机森林的解释 接下来,就需要对源码进行阅读了
![](https://pica.zhimg.com/80/v2-38e5658c8583cf94c2ae568b82e86bce_720w.png?source=d16d100b)
![](https://picx.zhimg.com/80/v2-2f8bd6fac342d51541b08285c14e6ef0_720w.png?source=d16d100b)
![](https://picx.zhimg.com/80/v2-eaed3f35a02f6fc090df959e9ffb48e6_720w.png?source=d16d100b)
![](https://picx.zhimg.com/80/v2-8047ea33ea1c46ad01c8a93da56b8042_720w.png?source=d16d100b)
![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150352309-1491489072.png)
第一步构造了一个IndexedString类,这个类是用来处理纯文本的,可以类比nlp中常用的数据预处理。会生成word2idx,idx2word表。 第二步构造一个TextDomainMapper类,这个类用来后处理的,包括将id转换成word,或者可视化 接下来这个函数用来根据原样本生成随机扰动生成的数据,所有数据通过原模型生成的预测概率,以及距离向量。
![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150421433-475095723.png)
其中,invsered_data就是将输入的文本经过处理后所得到的词汇表的大小
接下来,看一下__data_labels_distances函数![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150548871-829488966.png)
这个函数就是通过随机数的方法来确定要把原始样本中的哪些词抹掉,在inverse_removing函数里面会进行对原始样本的处理操作。 接下来回到explain_instance函数,继续阅读剩下的代码
![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150647726-1541405708.png)
注意两行 第一个是生成了一个Explanation类,这个类是用来输出解释结果以及可视化用的 第二个是self.base.explain_instance_with_data这个函数,这个函数就开始进行解释操作了 接下来,看一下这个explain_instance_with_data函数
![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150737221-1217475133.png)
feature_selection函数就是之前说过的会对特征进行选择,比如说从1000个特征中选出6个,那怎么选呢?代码中提供了5种方法 第一种:forward_selection方法
![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150808336-994885181.png)
维护一个已经选出的特征列表,遍历所有特征,将未加入特征列表的特征加入,用岭回归进行训练,在所有未加入特征列表的特征中,选择一个加入了以后进行训练会使得模型正确值达到最大的特征。如此循环往复,直到收集到需要的特征数。 第二种方法:highest_weights 用岭回归训练模型,选择权重最大的K个特征
![](/i/l/?n=22&i=blog/2346222/202210/2346222-20221002150859098-237356356.png)
这里我将源码简化了一下,只保留简单的部分方便看到核心
第三种方法,不选择,拿全部特征训练 第四种方法,auto,指定的num_features<=6,用forward_selection,当num_features>6,用highest_weights 第五种方法:lasso_path法,没了解,直接略过 将特征选出来后,就是利用这些特征,使用岭回归,对数据进行训练,来近似原始模型,得到的系数权重就是最后的解释。 阅读源码是对读论文的补充,读论文读的云里雾里,不妨来看一下它的源码。 标签:函数,--,样本,解释性,特征,源码,文本,LIME From: https://www.cnblogs.com/lxah/p/16748811.html