BigDataDigest 2018-07-30
点击上方关注,All in AI中国
机器学习(ML)和人工智能(AI)改变了商业领域的面貌。许多公司聘请数据科学家(作者是其中之一)来研发数据产品。
研发一个"高"精度的引擎是非常容易的(作者重复引用这句话的原因是:https://towardsdatascience.com/how-can-use-player-name-to-predict-world-cup-with-80-accuracy-262d076544c4)。如果有人问为什么,我们可以说这个模型是黑匣子或者是几年前的统计计算,但是现在我们不能再说了。我们还需要说服产品团队和管理层相信我们的模型,但不能简单地说引擎是从数据中"学习"得来的,或者它是一个无法解释的黑匣子。
当然,在某些特殊情况下,我们可能不需要解释模型。例如,你不希望向公众解释欺诈检测模型。否则,公众可能会找到一种"黑进"系统的方法。
在阅读本文之后,你将了解:
什么是模型解释
模型解释意味着提供模型背后的理由和逻辑,以使模型具有可靠性和透明性。有许多类型的模型解释,包括:
在解释模型之前,我们可以先了解模型解释的标准:
可解释性
我们不需要训练另一个模型来解释目标。例如,它使用决策树或线性模型时
该模型类似黑匣子模型,我们需要用另一个模型来解释它。我们将在下面的部分集中讨论这个领域
途径
特定模型:有些工具仅限于特定模型,如线性模型和神经网络模型
与模型无关(Model-agnostic):一些工具可以通过构建write-box模型来解释其他模型。
层次
全局:解释整体模型,如特性权重。
局部:解释具体的预测结果
为什么我们要解释模型?
如前所述,在大多数场景中我们必须做出解释,因为:
可追究性。模型有责任向消费者提供(相对)正确的答案。作为一名模型的开发人员,我们应该对模型特性进行验证,以确保它有助于做出正确的决策,而不是只专注于尽可能多地包含特性。
透明度。机器学习不是一个黑闸子,我们应该向客户和管理层提供该模型的透明性。让他们知道你为什么这么做。就像开源一样,人们更愿意使用开源的产品,因为他们知道你在做什么。
可信赖性。这是消费者使用分类或预测结果的基本要求。在大多数情况下,使用者拥有一些领域知识,例如交易员需要了解你为某一股票做出决策的理由在哪里。
解释NLP模型
如你所知,作者主要关注NLP。因此,只演示解释NLP模型的方法,尽管下面的库还可以解释其他问题,如回归分析和图像。
对于下面的演示,为了便于理解,作者没有做任何预处理。但在现实的商业问题中,我们应该做好预处理。否则,垃圾信息会越来越多。
有几个库可以帮助解释模型,包括"解释我5岁了(ELI5) https://github.com/TeamHG-Memex/eli5"、"对未知模型的局部解释(LIME) https://github.com/marcotcr/lime"和"溜冰者(Skater)https://github.com/datascienceinc/Skater"。
作者将演示如何使用ELI5和LIME[1] 以及Skater呢?请继续关注,这将解释为什么作者不在NLP中使用它。
算法:在接下来的演示中,将包括线性模型(scikit-learn中的逻辑回归)、集合模型(scikit- learn、XGBoost中的随机森林)和深度学习模型(在Keras中嵌入自构建字)。对于字嵌入的具体细节,你可以点击链接:https://towardsdatascience.com/3-silver-bullets-of-word-embedding-in-nlp-10fa8f50cc5a。
ELI5
ELI5提供了全局模型解释和局部模型解释。你可以简单地将全局模型解释视为特性的重要性,但它不仅支持诸如随机森林和XGBoost等决策树算法,而且还支持所有的scikit学习估计器。
作者将其介绍为全局解释中置换的重要性。为了计算成绩,特征(一个单词)将被其他单词(噪音)所代替并进行预测。这一概念之所以重要是在于它可以通过对特定单词的评分来表示特征的重要性。例如,"我喜欢苹果"。它可能会变成"我喜欢橙色",然后它会对新创建的记录进行分类,以了解"苹果"有多重要。当然,我们需要假设替换的词(如橙色)是噪音,它不应该提供重大的分数变化。
上图表示,如果输入包含"keith",则y=0的分数增加2.138。另一个例子是"the",它将分别在y=1和y=2中分别减少-0.731和-1.387。
对于局部模型解释,ELI5使用了LIME算法。显示格式不同于LIME,但使用相同的思想。
ELI 5解释了测试数据,并确定可能是y=0,概率为0.031。同时它还对高分与低分的词进行了突出。
LIME
正如前面提到的,LIME只关注局部模型解释和与模型无关的部分。
将训练好的模型和目标记录传递给LIME库。然后创建一个 bag-of-words模型(A liner bag-of-words model will be created ),并为模型提供大量生成的记录。作为二进制分类器的盒子模型表明了词存在的影响。(The while box model work as a binary classifier indicating the impact of word existence.)例如,"我喜欢苹果"。它可能会变成"我喜欢",然后它会对新创建的记录进行分类,以了解"苹果"有多重要。
因此,无论提供的模型是什么,它也可以通过生成记录来解释模型。无论它是scikit-learn库、XGBoost,甚至Keras字嵌入模型。在作者的示例代码中,成功的让sci-kit学习API界面实现了Keras,这样也可以使用LIME来解释Keras的字嵌入模型。
LIME创建了二进制分类器,因此我们可以看到它表示0、9、15类的权重,同时它还对高分与低分的词进行了突出。
Skater
对于全局解释,Skater提供特征重要性和部分依赖方法。
尝试了几次,没有找到sci-kit学习管道包(provide sci-kit learn pipeline package)的方法。必须将原始文本转换为numpy格式,并分别传递模型。然后,当有大约800个独特的单词时,大约需要2分钟来准备(区分)特性的重要性。
Skater提供每个单词的特征重要性。
部分依赖[3]是一组数字,用来表示目标和特征之间的关系(线性的、单调的或复杂的)。可以可视化,我们可以可视化一个特性和目标之间的影响。但是,如果存在NLP,则不能使用部分依赖。
相较于作者而言,Skater包括LIME模型以执行本地文本解释,因此作者更喜欢本地LIME。
相关
访问具体代码请点击:https://github.com/makcedward/nlp/blob/master/sample/nlp-model_interpretation.ipynb
作为一名数据科学家,我们必须解释模型的作用,以便获得团队和管理层的信任。同时你还需要测试模型。否则你可能不知道你建立了什么。
对于NLP问题。特征重要性或排列特征重要性要求实在太高了。作者不建议在NLP领域过多的使用。
在某些情况下,LIME无法正确解释模型。例如,当它随机生成样本时,每次的分数都可能不同。将有另一篇文章介绍如何解决它。
对于ELI5。在show_weight(全局解释)中支持 sci-kit learn pipeline,但是在ELI5的show_prediction(局部解释)中不支持。原因请点击:https://github.com/TeamHG-Memex/eli5/issues/15 。解决方法是使用LIME。
如果分类器是XGBoost分类器,那么使用ELI5(版本:0.8)时会出现错误。如果你使用XGBoost分类器,由于ELI5 bug (xgb_classifierer .get_booster()),你必须进行一些变通。链接:https://github.com/TeamHG-Memex/eli5/issues/259
对于Keras模型,实现了sci-kit学习API界面,但仍然不能使用ELI5。ELI5将检查对象类型以防止意外。
特别感谢Dipanjan(DJ)Sarkar对Skater的部分补充
参考内容
[1]Marco Tulio Ribeiro,Sameer Singh,Carlos Guestrin。"我为什么要相信你?"解释任何分类器的预测。 2016年9月。https:/arxiv.org/pdf/1602.04938.pdf
[2]Breiman Leo教授。"随机森林",2001年1月。https://www.stat.berkeley.edu/~breiman/randomforest2001.pdf
[3]Friedman,Jerome H.2001。"Greedy Function Approximation: A Gradient Boosting Machine."2001年4月。https://statweb.stanford.edu/~jhf/ftp/trebst.pdf
作者:Edward Ma