机器学习业务应用以输出决策判断为目标。可解释性是指人类能够理解决策原因的程度。机器学习模型的可解释性越高,人们就越容易理解为什么做出某些决定或预测。模型可解释性指对模型内部机制的理解以及对模型结果的理解。
其重要性体现在:建模阶段,辅助开发人员理解模型,进行模型的对比选择,必要时优化调整模型;在投入运行阶段,向业务方解释模型的内部机制,对模型结果进行解释。比如基金推荐模型,需要解释:为何为这个用户推荐某支基金。机器学习流程步骤:收集数据、清洗数据、训练模型、基于验证或测试错误或其他评价指标选择最好的模型。
第一步,选择比较小的错误率和比较高的准确率的高精度的模型。
事实上,每个分类问题的机器学习流程中都应该包括模型理解和模型解释,下面是几个原因:
动机
模型解释作为一个概念仍然主要是理论和主观的。任何机器学习模型的核心都有一个响应函数,它试图映射和解释独立(输入)自变量和(目标或响应)因变量之间的关系和模式。当模型预测或寻找见解时,需要做出某些决定和选择。模型解释试图理解和解释响应函数所做出的这些决定,即what,why以及how。模型解释的关键是透明度,质疑能力以及人类理解模型决策的难易程度。模型解释的三个最重要的方面解释如下。
在比较模型时,除了模型性能之外,如果模型的决策比其他模型的决策更容易理解,那么模型被认为比其他模型具有更好的可解释性。
可解释性的重要性
这是我们在本文中多次讨论的内容,也是决定数据科学项目在行业中取得成功的关键区别之一。这推动了模型解释的必要性和重要性的紧迫性。
可解释性的标准
有一些特定的标准可用于分类模型解释方法。ChristophMolnar,2018年“可解释的机器学习,制作黑箱模型可解释指南”中提到了一个很好的指南。
如何定义可解释性的范围和界限?一些有用的方面可以是模型的透明度,公平性和责任性。全局和局部模型解释是定义模型解释范围的明确方法。
可解释性的作用
对于想要了解模型如何工作的数据科学家来说,评估模型的准确性通常是不够的。数据科学家通常想知道模型输入变量如何工作以及模型的预测如何根据输入变量的值而变化。机器学习算法和模型的工程应用中用到最多的主要是树类模型(lgb,xgb)和神经网络(cnn,rnn),使用者往往习惯于很少去思考其中的含义和解释性。需要思考一个模型的哪些东西是可解释的?所以有几个问题值得讨论:
为什么这些解释信息是有价值的呢:
模型效果评估指标图
ConfusionMatrix一个完美的分类模型就是,如果一个客户实际上属于类别good,也预测成good,处于类别bad,也就预测成bad。实际上一些是good的客户,根据我们的模型,却预测他为bad,对一些原本是bad的客户,却预测他为good。我们需要知道,这个模型到底预测对了多少,预测错了多少,混淆矩阵就把所有这些信息,都归到一个表里:
工作原理:排列重要性,一定是在model训练完成后,才可以计算的。简单来说,就是改变数据表格中某一列的数据的排列,保持其余特征不动,看其对预测精度的影响有多大。大概三个步骤:
结果分析:
这个数据集是收入水平数据集,这个例子里,最重要的特征是“capital_gain”,这看起来是合理的。PDP部分依赖图(PDP或PD图)显示特征对机器学习模型的预测结果的边际效应,可以展示一个特征是如何影响预测的。部分依赖图可以显示目标与特征之间的关系是线性的,单调的还是更复杂的。例如,当应用于线性回归模型时,部分依赖图总是显示线性关系。回归的部分依赖函数定义为:
特征重要性可以告诉你哪些特征是最重要的或者是不重要的。partialdependence图可以告诉你一个特征是如何影响预测的。PDP分析步骤如下:
PDP特别适合用来回答类似这样的问题:
重要的是要记住,在该图中,较暗的颜色并不一定意味着较高的默认概率。在这里,我们绘制了受教育等级和年龄与收入等级概率。我们可以推断,在这两个自变量中,education_num起着更重要的作用,因为等高线图主要是垂直的,遵循x轴刻度标记(至少达到一个点)。ICE部分依赖图(PDP)和个体条件期望图(ICE)说明了一个或多个输入变量与黑盒模型的预测结果之间的关系。它们都基于可视化,模型不可知的技术。ICE图可以更深入地探索个体差异并识别模型输入之间的子组和相互作用。另一方面,ICE图使得可以深入到单个观察的水平。它们可以帮助探索个体差异,并确定模型输入之间的子组和交互。可以将每个ICE曲线视为一种模拟,显示如果改变特定观察的一个特征,模型预测会发生什么。为避免可视化过载,ICE图一次只显示一个模型变量。可以将每个ICE曲线视为一种模拟,显示如果您改变特定观察的一个特征,模型预测会发生什么。如图9所示,通过在曲线变量的唯一值上复制个体观察并对每个重复进行评分,获得一个观察的ICE曲线。下图中的PD图结果基本上是平坦的,给人的印象是X1与模型的预测之间没有关系。
当我们观察ICE图时,它们呈现出一幅截然不同的图:这种关系对于一次观察非常正面,但对另一次观察则非常负面。因此,与PD图告诉我们的情况相反,ICE图显示X1实际上与目标有关;。基本上,ICE图分离PD功能(毕竟是平均值)以揭示相互作用和个体差异。
通俗来说:就是选择一个样本以及样本附近的点,然后训练一个简单模型来拟合,虽然简单模型不能在完整数据集上有效,但至少在这个点附近都是有效的,这个简单模型的特征是人类可解析的,而训练出的权重也可以表示特征重要性。论文中算法描述:
为了更好地理解LIME的工作原理,让我们考虑两种不同类型的可解释性:
我们希望解释器与模型无关,并且在局部可靠。局部可靠的解释捕获要解释的实例邻域中的分类器行为。为了学习局部解释,LIME使用可解释的模型近似分类器围绕特定实例的决策边界。LIME与模型无关,这意味着它将模型视为黑盒子,并且不对模型行为做出任何假设。这使得LIME适用于任何预测模型。LIME的核心在于三个方面:
LIME作用在单个样本上。首先,我们取出一个样本,并(permute)重复这个数据同时增加一些微小扰动,这样就得到了一个新的数据集,数据集中包含相似的样本,都基于取出来的那个样本。对于这个新数据集中的每一个样本,我们可以计算它跟取出的样本之间的相似性,即在permutation中它被调整了多大,所有的统计距离、相似性矩阵都可以用在这里,比如用指定宽度的指数内核将欧式距离转化为相似度。下一步,使用最初训练的复杂模型,在新数据上进行预测。正因为新数据样本间的细微差别,我们可以跟踪那些微小扰动对预测结果的影响。最后,我们在新数据上训练出一个简单模型(通常是线性模型),并使用最重要的特征进行预测。最重要的特征有不同的决定方法,在指定加入模型解释中的特征数量(通常在5到10附近)的前提下,可以
上图给我们解释了对于一个样本的预测结果,是哪些特征决定样本被分类到类别0,哪些特征决定样本被分类到类别1,且具体列出样本在这些特征的数值大小。很直观和明确的解释为什么模型做这个决定。SHAPShaply值由美国洛杉矶加州大学教授罗伊德·夏普利(LloydShapley)提出,用于解决合作博弈的贡献和收益分配问题。N人合作中,单个成员的贡献不一样,收益分配也应该不一样。理想的分配方式是:贡献=收益;贡献和收益分配是否有可以量化的方法呢?Shapley方法就是这样一种方法:Shapley值:单个成员所得与自己的贡献相等。
基于Shap值的模型解释是一种和模型无关的方法。如上图,模型预测和Shap值解释是两个并行流程,Shap对模型预测的结果进行解释。NIPS论文地址:AUnifiedApproachtoInterpretingModelPredictions,也可以参考这篇博客:OneFeatureAttributionMethodto(Supposedly)RuleThemAll:ShapleyValues。原理:一个特征的shapleyvalue是该特征在所有的特征序列中的平均边际贡献。优点:
缺点:计算效率低。适用范围:
Shap方法的两大特性
树模型Shap值的解
详细内容参考论文。用Shap值识别特征交叉Shap方法计算两两特征交叉影响:
通俗理解:交叉影响=两个人合作贡献增益,减去各自单干的贡献;单个特征的贡献Shap方法计算单个特征的贡献(剔除交叉影响):
通俗理解:个人影响=个人合作贡献,减去其它N-1个人的贡献;下面还是以收入水平数据集进行案例分析:row_to_show=5data_for_prediction=X_test.iloc[row_to_show]#use5rowofdatahere.Couldusemultiplerowsifdesireddata_for_prediction_array=data_for_prediction.values.reshape(1,-1)#计算model的shap值explainer=shap.TreeExplainer(model)#计算样本数据的shap值shap_values=explainer.shap_values(data_for_prediction)shap.initjs()shap.force_plot(explainer.expected_value[1],shap_values[1],data_for_prediction)
图形解释
特征解释
SummaryPlots:shap_values=explainer.shap_values(X_test)shap.summary_plot(shap_values[1],X_test)
特征解释:
图形解释:
特征解释:
该方法可以在大多数编程语言中容易地实现并且集成到现有的神经网络框架中。当应用于深度ReLU网络时,LRP可以被理解为预测的深度泰勒分解。这里有如何实现LRP用于解释深度模型的代码教程,有兴趣可以动手实现,用于解释自己的深度模型。