论文解读(一 普拉斯):机器学习模型的衡量指标

2023-10-08 13:20

本文主要是介绍论文解读(一 普拉斯):机器学习模型的衡量指标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                                      ——方法——

❶ 模型效果评估指标图

❶ Confusion Matrix

一个完美的分类模型就是,如果一个客户实际上属于类别 good,也预测成 good,处于类别 bad,也就预测成 bad。实际上一些是 good 的客户,根据我们的模型,却预测他为 bad,对一些原本是 bad 的客户,却预测他为 good。我们需要知道,这个模型到底预测对了多少,预测错了多少,混淆矩阵就把所有这些信息,都归到一个表里:

Sensitivity (覆盖率,True Positive Rate) = 正确预测到的正例数 / 实际正例总数;Recall (True Positive Rate, or Sensitivity) = true positive/total actual positive = d/c+d;

PV+ (命中率,Precision, Positive Predicted Value) = 正确预测到的正例数 / 预测正例总数;Precision (Positive Predicted Value, PV+) = true positive/ total predicted positive = d/b+d;

Specificity (负例的覆盖率,True Negative Rate) = 正确预测到的负例个数 / 实际负例总数;Specificity (True Negative Rate) = true negative/total actual negative = a/a+b;

图中关于混淆矩阵结果理解:recall:0.54;precision:0.915;specificity:0.95。

 Lift

它衡量的是,与不利用模型相比,模型的预测能力 "变好" 了多少。实质上它强调的是投入与产出比。不利用模型,我们只能利用 "正例的比例是 c+d/a+b+c+d" 这个样本信息来估计正例的比例 ( baseline model ),而利用模型之后,我们不需要从整个样本中来挑选正例,只需要从我们预测为正例的那个样本的子集 ( b+d ) 中挑选正例,这时预测的准确率为 d/b+d。

显然,lift ( 提升指数 ) 越大,模型的运行效果越好。如果这个模型的预测能力跟 baseline model 一样,那么 d/b+d 就等于 c+d/a+b+c+d ( lift 等于 1 ),这个模型就没有任何 "提升" 了 ( 套一句金融市场的话,它的业绩没有跑过市场 )。

❸ ROC 曲线 & PR 曲线 & KS 曲线

实际应用中,通常是先基于训练好的分类器得出测试样本的预测概率,然后将该测试样本的预测概率与给定的阈值进行比较,若该预测概率大于给定阈值,则将该测试样本划分为正类,反之则将其划分为反类。对于不同的分类任务,该分类阈值的取值也是不一样的。

① ROC 曲线 ( The Receiver Operating Characteristic Curve ) 给出的是不同分类阈值情况下真正率 ( TPr ) 和假正率 ( FPr ) 的变化曲线。

② PR 曲线 ( Precision-Recall Curve ) 给出的是不同分类阈值情况下查准率 ( Precision ) 和查全率 ( Recall ) 的变化曲线。

有文献指出,ROC 曲线相比 PR 曲线有一个非常好的特性:就是当正负样本分布发生变化的时候,ROC 曲线的形状能够基本保持不变,而 PR 曲线的形状会发生较剧烈的变化。为了使得 ROC 曲线之间能更好的进行比较,通常采用 AUC,即 ROC 曲线下的面积来衡量一个分类算法的性能。其中,AUC 的值越大,表明分类性能越好。

③ KS ( Kolmogorov-Smirnov Curve ) 曲线横轴为不同的分类阈值,纵轴为真正率 ( TPr ) 和假正率 ( FPr ) 的变化曲线。KS 值 = max|TPr-FPr|,等价于 ΔTPr=ΔFPr,这和 ROC 曲线上找最优阈值的条件一致。KS 值常在征信评分模型中用于衡量区分预测正负样本的分隔程度。一般来说,KS 值越大,表明正负样本区分的程度越好,说明模型区分度越高。但并非所有的情况 KS 值都是越高越好的,尤其在征信模型中,如正负样本完全分错的情况下,KS 值依旧可以很高。征信模型最期望得到的信用分数分布为正态分布,如果 KS 值过大,如0.9,就可以认为正负样本分得过开了,不太可能是正态分布,反而比较可能是极端化的分布状态 ( 如 U 字型 ),这样的分数就很不好,基本可以认为不可用。

❹ Cumulative gains chart

横坐标表示:代表我们样本的百分比,假设有10000个样本,0.1代表1000个,1代表10000个样本。

纵坐标表示:代表横轴所代表的那么多样本中,判断正确的比率。

baseline 表示:如果我们不用模型,那我们对每一个人的打分都是一样的,正率在所有样本空间都是一样的,连接起来就成为一条直线。

曲线含义:采用模型进行预测。y 值的分子代表模型预测且预测为正例的人数,分母是整个群体正例人数。

❺ Silhouette Analysis

Silhouette 指的是一种解释和验证数据集群内一致性的方法。该技术提供了每个对象分类的简洁图形表示。

轮廓值是对象与其自身群集 ( 内聚 ) 相比与其他群集 ( 分离 ) 相似程度的度量。轮廓范围从-1到+1,其中高值表示对象与其自己的簇很好地匹配并且与相邻簇很不匹配。如果大多数对象具有高值,则群集配置是合适的。如果许多点具有低值或负值,则群集配置可能具有太多或太少的群集。

图中通过 Silhouette 方法大致对数据集样本分类有了掌握,可以看到0/1类别大致比例。

❻ Learning Curve

概念:学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集是否可以减小过拟合。

Bias 是用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异。

Variance 是不同的训练数据集训练出的模型输出值之间的差异。

解读:当训练集和测试集的误差收敛但却很高时,为高偏差。左上角的偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。我们可以增加模型参数,比如,构建更多的特征,减小正则项。此时通过增加数据量是不起作用的。当训练集和测试集的误差之间有大的差距时,为高方差。当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。右上角方差很高,训练集和验证集的准确率相差太多,应该是过拟合。我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。理想情况是是找到偏差和方差都很小的情况,即收敛且误差较小。

❷ Permutation Importance

一个最基本的问题大概会是什么特征对我模型预测的影响最大呢?这个东西就叫做 "feature importance" 即特征重要性。Anyway,字面意思看着就很重要啦。我们有很多方法来衡量特征的重要性,这里呢,将会介绍一种方法:排列重要性。这种方法和其他方法比起来,优势有:

❶ 计算速度快

❷ 广泛使用和理解

❸ 我们希望特征重要性与属性具有一致性

工作原理:排列重要性,一定是在 model 训练完成后,才可以计算的。简单来说,就是改变数据表格中某一列的数据的排列,保持其余特征不动,看其对预测精度的影响有多大。大概三个步骤:

❶ 训练好模型

❷ 拿某一个 feature column,然后随机打乱顺序。然后用模型来重新预测一遍,看看自己的 metric 或者 loss 。Function 变化了多少。

❸ 把上一个步骤中打乱的 column 复原,换下一个 column 重复上一个步骤,直到所有 column 都算一遍。

代码示例:

from xgboost import XGBClassifier    
from sklearn.model_selection import train_test_split
import eli5   # python计算permutation importance工具包   
from eli5.sklearn import PermutationImportancepath = './census_income_dataset.csv'
data = pd.read_csv(path)
#...省略数据预处理过程
X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.2, random_state = 400)# 训练XGBoost模型
model = xgb.XGBClassifier(learning_rate =0.05,n_estimators=100,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)perm = PermutationImportance(model, random_state = 1).fit(X_test, y_test) # 实例化
eli5.show_weights(perm, feature_names = X_test.columns.tolist())

结果分析:

❶ 靠近上方的绿色特征,表示对模型预测较为重要的特征;

❷ 为了排除随机性,每一次 shuffle 都会进行多次,然后取结果的均值和标准差;

❸ 部分特征出现负值,表示其 shuffle 之后,对精度反而有所提升。这通常出现在特征不那么重要的时候。当数据集较小的时候,这种情况更为常见;

❹ "+ -" 之后的数字衡量的是一次重新洗牌后的表现如何变化。

这个数据集是收入水平数据集,这个例子里,最重要的特征是 "capital_gain",这看起来是合理的。

❸ PDP

部分依赖图 ( PDP 或 PD 图 ) 显示特征对机器学习模型的预测结果的边际效应,可以展示一个特征是如何影响预测的。部分依赖图可以显示目标与特征之间的关系是线性的,单调的还是更复杂的。例如,当应用于线性回归模型时,部分依赖图总是显示线性关系。

回归的部分依赖函数定义为:

❶ xSxS 是部分依赖图要画的特征集合

❷ xCxC 是其他特征

通常,集合 SS 中有一到两个特征,这个集合中的特征我们想知道他们对预测的影响。在集合 SS 和集合 CC 中的特征并集组成了全部特征空间 x。边际化机器学习模型输出在集合 C 的特征分布上。PDP 的一个假设是,C 中的特征与 s 中的特征不相关。如果违反这个假设,部分依赖图的平均值将包括非常不可能甚至不可能的数据点。

边缘化概念

边缘化是一种通过累加一个变量的可能值以判定另一个变量的边缘分布的方法。这听起来有点抽象,让我们看一个例子:

假设我们想知道天气是如何影响英国人的幸福感的,也就是 P ( 幸福感|天气 )。假定我们具有衡量某人的幸福感所需的定义和设备,同时记录了某个英格兰人和某个苏格兰人所处位置的天气。可能苏格兰人通常而言要比英格兰人幸福。所以我们其实在衡量的是 P ( 幸福感, 国|天气 ),即,我们同时考察幸福感和国。

边缘化告诉我们,我们可以通过累加国家的所有可能值 ( 英国由3国组成:英格兰、苏格兰、威尔士 ),得到想要计算的数字,即 P ( 幸福感|天气 ) = P ( 幸福感, 国=英格兰|天气 ) + P ( 幸福感, 国=苏格兰|天气 ) + P ( 幸福感, 国=威尔士|天气 )。

部分函数 f^xSf^xS 通过计算在训练数据的平均值,即 Monte Carlo 方法:

x(i)CxC(i) 是数据集中的真实特征值,这些特征是不关注的特征。

特征重要性可以告诉你哪些特征是最重要的或者是不重要的。

partial dependence 图可以告诉你一个特征是如何影响预测的。

PDP 分析步骤如下:

❶ 训练一个 Xgboost 模型 ( 假设 F1 … F4 是我们的特征,Y 是目标变量,假设 F1 是最重要的特征 )。

❷ 我们有兴趣探索 Y 和 F1 的直接关系。

❸ 用 F1 ( A ) 代替 F1 列,并为所有的观察找到新的预测值。采取预测的平均值 ( 称之为基准值 )。

❹ 对 F1 ( B ) … F1 ( E ) 重复步骤3,即针对特征 F1 的所有不同值。

❺ PDP 的 X 轴具有不同的 F1 值,而 Y 轴是虽该基准值 F1 值的平均预测而变化。

PDP 特别适合用来回答类似这样的问题:

❶ 在所有的收入水平的特征中,年龄和学历是如何影响收入的?或者说,在不同的国家相同年龄的人群收入水平有多少相似呢?

❷ 预测推荐基金时,投资偏好的不同会带来多大的影响?还是有其他更重要的影响因素?

如果你对线性回归或者逻辑回归比较熟悉,那么 partial dependence 可以被类比为这两类模型中的 "系数"。并且 partial dependence 在复杂模型中的作用比在简单模型中更大,抓出更复杂的特性。

同样还是用 census_income 的数据集,不同的个体在各个方面都是不一样的。比如种族,年龄,受教育程度等等。一眼看过去,很难区分这些特征对结果的影响有多大。为了清晰的分析,我们还是先只拿出某一行数据,比如说这一行数据里,有种族 White,45岁,Bachelors。我们将会用已有模型来预测结果,将这一行的某一个变量,反复的进行修改和重新预测,比如将年龄修改从45修改为60,等等。持续观察预测结果,在不同的年龄时有什么样的变化。

这里的例子,只用到了一行数据。特征之间的相互作用关系通过这一行来观察可能不太妥当,那么考虑用多行数据来进行试验,然后根据平均值画出图像来。

from pdpbox import pdpfeature = 'age'
# 创建好画图所需的数据
pdp_goals = pdp.pdp_isolate(model, X_train, df.columns, feature)
# 画出“age”这一特征的partial dependence plot
pdp.pdp_plot(pdp_goals, feature)
plt.show()

❶ y 轴是预测结果的变化量。

❷ 蓝色阴影区域代表了置信的大小。

从这幅图可以看出,age 的增加肯定可以增加高收入概率,但是增加到一定的时候,对这个概率影响不大了。

置信区间概念

给定置信水平,根据估计值确定真实值可能出现的区间范围,该区间通常以估计值为中心,该区间则为置信区间。

feature = 'education_num'
pdp_goals = pdp.pdp_isolate(model, X_train, df.columns, feature)
pdp.pdp_plot(pdp_goals, feature)
plt.show()

从这副图可以看出,受教育程度对收入起积极作用,随着受的教育越多,收入越高,也符合常人理解。

fig, axes, summary_df_1 = info_plots.target_plot_interact(df=dataset, features=['age', 'education_num'], feature_names=['age', 'education_num'], target='income_level'
)

在此图表中,气泡大小不太重要,因为它与观测数量 ( 事件发生的次数 ) 有关。最重要的见解来自气泡的颜色,较暗的气泡意味着更高的默认概率。这是一个强大的工具,因为它可以深入了解我们选择的两个变量对因变量的影响。

features_to_plot = ['age', 'education_num']
inter1  = pdp.pdp_interact(model, df, df.columns, features_to_plot)
pdp.pdp_interact_plot(inter1, features_to_plot, plot_type='grid', x_quantile=True, ncols = 2, plot_pdp=True)
plt.show()

上图可以看出,受教育程度和年龄对收入水平有着正相关作用,且随着受教育程度增加,年龄从35-90,高收入的概率越来越大。

fig, axes = pdp.pdp_interact_plot(inter1, ['age', 'education_num'], plot_type='contour', x_quantile=True, ncols=2, plot_pdp=True
)

 

重要的是要记住,在该图中,较暗的颜色并不一定意味着较高的默认概率。在这里,我们绘制了受教育等级和年龄与收入等级概率。我们可以推断,在这两个自变量中,education_num 起着更重要的作用,因为等高线图主要是垂直的,遵循x轴刻度标记 ( 至少达到一个点 )。

❹ ICE

部分依赖图 ( PDP ) 和个体条件期望图 ( ICE ) 说明了一个或多个输入变量与黑盒模型的预测结果之间的关系。它们都基于可视化,模型不可知的技术。ICE 图可以更深入地探索个体差异并识别模型输入之间的子组和相互作用。

另一方面,ICE 图使得可以深入到单个观察的水平。它们可以帮助探索个体差异,并确定模型输入之间的子组和交互。可以将每个 ICE 曲线视为一种模拟,显示如果改变特定观察的一个特征,模型预测会发生什么。为避免可视化过载,ICE 图一次只显示一个模型变量。

可以将每个 ICE 曲线视为一种模拟,显示如果您改变特定观察的一个特征,模型预测会发生什么。如图9所示,通过在曲线变量的唯一值上复制个体观察并对每个重复进行评分,获得一个观察的 ICE 曲线。

下图中的 PD 图结果基本上是平坦的,给人的印象是 X1 与模型的预测之间没有关系。

当我们观察 ICE 图时,它们呈现出一幅截然不同的图:这种关系对于一次观察非常正面,但对另一次观察则非常负面。因此,与 PD 图告诉我们的情况相反,ICE 图显示 X1 实际上与目标有关。基本上,ICE 图分离 PD 功能 ( 毕竟是平均值 ) 以揭示相互作用和个体差异。

当对大数据集分析时,则可能需要进行一些调整。例如,可以对选定的变量进行分箱,也可以对数据集进行采样或分组。这些技术可以更快地提供实际图的合理近似值。

如果想进一步了解 PD 和 ICE 图,Ray Wright 写了一篇很好的论文,展示了 PD 和 ICE 图如何用于比较和获得机器学习模型的洞察力,特别是所谓的 "黑盒" 算法,如随机森林,神经网络和梯度增强。在他的论文中,他还讨论了 PD 图的局限性,并提供了有关如何为大数据生成可缩放图的建议。

https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2018/1950-2018.pdf

❺ LIME

局部可解释不可知模型 ( LIME ) 是一种算法,它提供了一种新颖的技术,以可解释和可信任的方式解释任何预测模型的结果。它的工作原理是围绕想要解释的预测在本地训练可解释的模型。这个工作发表于2016年 KDD 的论文。工具学习地址。

http://sameersingh.org/files/papers/lime-kdd16.pdf

https://lime-ml.readthedocs.io/en/latest/lime.html

流程:

❶ 训练模型,模型 ( 记作 ff ) 可以是 LR、NN、Wide and deep、C4.5 Decision tree、Random forest、GBDT 等任意模型。

❷ 训练结束后我们需要解析模型,先选择一个待解析的样本,样本通过模型计算可以得到一个 prediction ( 包含预测的 label 以及预测为1的 probability ),这时我们在这个样本的附近选择新的样本并用模型计算出多个 prediction,这样样本组合新的样本集。

❸ 然后使用新的可解析的特征和 prediction 作为 label 来训练新的简单模型 ( 例如 LR ),然后使用简单模型的权重作为这些特征的重要性作为输出。

通俗来说:

就是选择一个样本以及样本附近的点,然后训练一个简单模型来拟合,虽然简单模型不能在完整数据集上有效,但至少在这个点附近都是有效的,这个简单模型的特征是人类可解析的,而训练出的权重也可以表示特征重要性。

论文中算法描述:

为了更好地理解 LIME 的工作原理,让我们考虑两种不同类型的可解释性:

❶ 全局可解释性:全局解释有助于我们理解由训练的响应函数建模的整个条件分布,但全局解释可以是近似的或基于平均值。

❷ 局部可解释性:局部解释促进对单个数据点或分布的小范围的理解,例如一组输入记录及其相应的预测。由于小范围的条件分布很可能是线性的,因此局部解释可能比全局解释更准确。LIME 旨在提供局部可解释性,因此对于特定决策或结果最为准确。

我们希望解释器与模型无关,并且在局部可靠。局部可靠的解释捕获要解释的实例邻域中的分类器行为。为了学习局部解释,LIME 使用可解释的模型近似分类器围绕特定实例的决策边界。LIME 与模型无关,这意味着它将模型视为黑盒子,并且不对模型行为做出任何假设。这使得 LIME 适用于任何预测模型。

LIME 的核心在于三个方面:

❶ 这里不对模型整体提供解释,而是局部对每一个样本单独进行解释

❷ 即使机器学习模型训练过程会产生一些抽象的特征,但是解释基于当前输入数据的变量特征

❸ 通过局部建立简单模型进行预测来对大多数重要特征进行解释

LIME 作用在单个样本上。

首先,我们取出一个样本,并 ( permute ) 重复这个数据同时增加一些微小扰动,这样就得到了一个新的数据集,数据集中包含相似的样本,都基于取出来的那个样本。对于这个新数据集中的每一个样本,我们可以计算它跟取出的样本之间的相似性,即在 permutation 中它被调整了多大,所有的统计距离、相似性矩阵都可以用在这里,比如用指定宽度的指数内核将欧式距离转化为相似度。

下一步,使用最初训练的复杂模型,在新数据上进行预测。正因为新数据样本间的细微差别,我们可以跟踪那些微小扰动对预测结果的影响。

最后,我们在新数据上训练出一个简单模型 ( 通常是线性模型 ),并使用最重要的特征进行预测。最重要的特征有不同的决定方法,在指定加入模型解释中的特征数量 ( 通常在5到10附近 ) 的前提下,可以:

❶ 选择在使用复杂模型进行预测时回归拟合上具有最高权重的特征

❷ 运用正向选择,选择可以提高复杂模型的预测的回归拟合的变量

❸ 在复杂的机器学习模型预测的基础上,选择正则化的收缩率最小的 lasso 预测拟合的特征

❹ 使用不多于我们已经选择了的特征的节点数量来构建决策树

## 创建LIME解释器
explainer = lime.lime_tabular.LimeTabularExplainer(X_train ,feature_names = features_name, class_names=['0','1'], categorical_features=data_cat_features, 
categorical_names=cat_columns, kernel_width=3)
predict_fn_xgb = lambda x: xgb.predict_proba(x).astype(float)
exp = explainer.explain_instance(X_test[2], predict_fn_xgb, num_features=6)
exp.show_in_notebook(show_all=False)

上图给我们解释了对于一个样本的预测结果,是哪些特征决定样本被分类到类别0,哪些特征决定样本被分类到类别1,且具体列出样本在这些特征的数值大小。很直观和明确的解释为什么模型做这个决定。

 SHAP

Shaply 值由美国洛杉矶加州大学教授罗伊德·夏普利 ( Lloyd Shapley ) 提出,用于解决合作博弈的贡献和收益分配问题。N 人合作中,单个成员的贡献不一样,收益分配也应该不一样。理想的分配方式是:贡献=收益;

贡献和收益分配是否有可以量化的方法呢?

Shapley 方法就是这样一种方法:Shapley 值 ( 单个成员所得与自己的贡献相等)。

基于 Shap 值的模型解释是一种和模型无关的方法。如上图,模型预测和 Shap 值解释是两个并行流程,Shap 对模型预测的结果进行解释。NIPS 论文地址:A Unified Approach to Interpreting Model Predictions,也可以参考这篇博客:One Feature Attribution Method to (Supposedly) Rule Them All: Shapley Values。

原理:一个特征的 shapley value 是该特征在所有的特征序列中的平均边际贡献。

优点:

❶ 解决了多重共线性问题;

❷ 不仅考虑单个变量的影响,而且考虑变量组的影响,变量之间可能存在协同效应。

缺点:计算效率低。

适用范围:

❶ 计算个体的特征 shapley value;

❷ 所有个体的每个特征的 shapley value 的绝对值求和或求平均即为整体的特征重要性。

Shap 方法的两大特性:

❶ 特征归因 ( 收益 ) 一致性:

定义

模型改变 ( A->B ),特征 x 的贡献不递减 ( 增加或者保持现状 ),则归因 ( 收益 ) 也不递减。

特点

特征作用越大 ( 小 ),重要度越高 ( 低 ),和模型变化无关。

全局特征一致性

① mean(|Tree SHAP|):Shap 值

② Gain:特征用于划分时所带来的训练损失减益的平均值

③ Split Count:根据特征用于划分的次数计算重要性

④ Permutation:将特征的值随机排列,用排列前后的模型误差来计算重要性

局部样本 ( Fever=yes, cough=yes 的样本 ) 一致性

① Saabas[5] : 树创建完成后,根据样本预测值,将父节点和子节点 value 的差异,作为父节点的特征重要性

② Tree SHAP : 基于 Shap 值矩阵 ( 样本数*特征数 ),计算出 Fever 和 Cough 的重要性

❷ 特征归因 ( 收益 ) 可加性:

解释性方法如果具有特征归因可加性,特征重要性和模型预测值可以通过特征贡献的线性组合来表示。简单模型最好的解释是它本身;复杂模型,直接进行解释并不容易,需要通过代理模型来解释。接下来引入代理模型 ( 解释模型 ) 来描述特征归因可加性。

树模型 Shap 值的解:

① N 为全体特征集合,S 为 N 的一个排列子集 ( 顺序相关 )

② 求和第一项:排列数

③ 求和第二项:对于任意子集 S,特征i的贡献

④ 特征 i 的 shap 值可以理解为i的贡献归因

详细内容参考论文。

用 Shap 值识别特征交叉

Shap 方法计算两两特征交叉影响:

通俗理解:交叉影响=两个人合作贡献增益,减去各自单干的贡献;

单个特征的贡献

Shap 方法计算单个特征的贡献 ( 剔除交叉影响 ):

通俗理解:个人影响=个人合作贡献,减去其它 N-1 个人的贡献。

下面还是以收入水平数据集进行案例分析:

row_to_show = 5
data_for_prediction = X_test.iloc[row_to_show]  # use 5 row of data here. Could use multiple rows if desired
data_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)

图形解释

① Base value:模型在数据集上的输出均值:-0.1524

② Output value:模型在单个样本的输出值:0.68

③ 起正向作用的特征:marital_status2、occupation3

④ 起负向作用的特征:capital_gain、education_num

特征解释

① 解释 Output value ( 单个样本 ) 和 Base value ( 全体样本 Shap 平均值 ) 的差异,以及差异是由哪些特征造成的

② 红色是起正向作用的特征,蓝色是起负向作用的特征

shap_values_b = explainer.shap_values(X_test)
shap.force_plot(explainer.expected_value[0], shap_values_b[0], X_test, link="logit")

特征解释

解释 Output value 和 Base value 的差异,以及差异是由哪些特征造成的。

Summary Plots:

shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values[1], X_test)

图形解释

① 每个点是一个样本 ( 人 ),图片中包含所有样本

② X轴:样本按 Shap 值排序-

③ Y轴:特征按 Shap 值排序

④ 颜色:特征的数值越大,越红

特征解释:

martial_status2 这个特征最重要,且值越大,收入会相对更高,到达一定峰值,会明显下降。

年龄也是影响结果的重要特征,年龄小收入普遍低,但年龄到达一定程度,并不会增加收入,存在年龄小,收入高的人群。

收入水平和 capital_gain 大致呈正相关。

shap.summary_plot(shap_values[1],X_test, plot_type="bar")

上图是特征重要性图谱,由上向下重要性依次减弱。

shap_values = explainer.shap_values(df)
shap.dependence_plot('age', shap_values[1], df, interaction_index="capital_gain")

图形解释:

① X轴:age

② Y轴(左):一个样本的 age 对应的 Shap 值

③ 颜色:capital_gain 越大越红

特征解释:

① 排除所有特征的影响,描述 age 和 capital_gain 的关系。

② 年龄大的人更趋向于有大的资本收益,小部分年轻人有大的资本收益。

❼ RETAIN

论文使用称为 RETAIN 的建模策略解决了这个限制,这是一种两级神经网络顺序数据的注意模型,提供对预测结果的详细解释保持与 RNN 相当的预测精度。为此,RETAIN 依赖于关注机制被建模以表示在遭遇期间医生的行为。一个区别 RETAIN 的功能 ( 参见图1 ) 是利用注意力生成来利用序列信息机制,同时学习可解释的表示。并模仿医生的行为,RETAIN 以相反的时间顺序检查患者的过去访问,从而促进更稳定的注意后代。因此,RETAIN 会识别最有意义的访问次数并量化访问量有助于预测的功能。

模型使用两套权重,一套是 visit-level attention,另外一套是 variable-level attention。使用两个 RNN 网络分别产生。

Step1:使用线性 embedding

Step2:产生 visit-level attention。其中输入 RNN 中的数据采用时间逆序输入。对于稀疏的 attention,使用 Sparsemax 而不是 Softmax。

Step3:产生variable-levelattention,其中输入 RNN 中的数据采用时间逆序输入。

Step4:根据以上两步生成的 attentionweight,生成 context vector。Ci 表示病人第 i 次 visit。

Step5:根据 Context Vector 生成预测结果。

❽ LRP

逐层相关性传播 ( LRP ) 是一种通过在神经网络中运行反向传递来识别重要像素的方法。向后传递是保守的相关再分配过程,其中对较高层贡献最大的神经元从其获得最大相关性。LRP 程序如下图所示。

该方法可以在大多数编程语言中容易地实现并且集成到现有的神经网络框架中。当应用于深度 ReLU 网络时,LRP 可以被理解为预测的深度泰勒分解。

这里有如何实现 LRP 用于解释深度模型的代码教程,有兴趣可以动手实现,用于解释自己的深度模型。

这篇关于论文解读(一 普拉斯):机器学习模型的衡量指标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

SpringCloud负载均衡spring-cloud-starter-loadbalancer解读

《SpringCloud负载均衡spring-cloud-starter-loadbalancer解读》:本文主要介绍SpringCloud负载均衡spring-cloud-starter-loa... 目录简述主要特点使用负载均衡算法1. 轮询负载均衡策略(Round Robin)2. 随机负载均衡策略(

解读spring.factories文件配置详情

《解读spring.factories文件配置详情》:本文主要介绍解读spring.factories文件配置详情,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用场景作用内部原理机制SPI机制Spring Factories 实现原理用法及配置spring.f

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi