Method Feature(s) Sample(s) Result Value/Feature
Permutation Importance 1 all validation samples Single Scale
Partial Dependence Plots 1~2 all validation samples Vector(reasults vs feature)
SHAP Values N individual sample 每个feature对当前结果的贡献(相对于baseline)
Advanced Uses of SHAP Values- Summary Plots N all 绘制每个feature在每个样本预测结果中的贡献(相对于baseline)
Advanced Uses of SHAP Values- SHAP Dependence Contribution Plots 2 all 绘制2个feature在所有样本也测结果中的贡献(相对于baseline)

参考: https://www.kaggle.com/learn/machine-learning-explainability

这个课程将讲解如何从复杂的机器学习模型中解释这些发现。

  1. 模型认为数据中的哪些特征是最重要的?
  2. 对于来自模型的任何单个预测,数据中的每个特性如何影响该特定预测
  3. 每个特性如何影响模型的整体预测(当考虑大量可能的预测时,它的典型影响是什么?)
这些发现有许多用途,包括
  1. 调试,理解模型所发现的模式将帮助您识别那些与您对真实世界的认识不一致的地方
  2. 为特征工程提供信息
  3. 指导未来的数据收集
  4. 为人的决策提供信息
  5. 建立信任,提高产品在用户中的接受度。

Permutation Importance置换重要性

统计每个feature的重要程度,训具体步骤如下:

  1. 正常训练完模型。
  2. 对原始validation数据,依次shuffle每个feature的原始数据。
  3. 根据得到的模型参数,对shuffle后的数据进行预测,计算性能(准确度)下降程度。
  4. 对每个feature重复2-3,最后得出每个feature的重要程度(shuffle它后性能下降程度)

用eli5库实现的置换重要性计算

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier data = pd.read_csv('../input/fifa-2018-match-statistics/FIFA 2018 Statistics.csv')
y = (data['Man of the Match'] == "Yes") # Convert from string "Yes"/"No" to binary
feature_names = [i for i in data.columns if data[i].dtype in [np.int64]]
X = data[feature_names]
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
my_model = RandomForestClassifier(random_state=0).fit(train_X, train_y)

import eli5
from eli5.sklearn import PermutationImportance
perm = PermutationImportance(my_model, random_state=1).fit(val_X, val_y)
eli5.show_weights(perm, feature_names = val_X.columns.tolist())

官方例程输出如下,其中排在前面的是更重要的feature,排在后面的是不那么重要的feature,最后偶然出现负数,也是正常现象。

毕竟是shuffle feature data,对一些不太重要的feature,偶尔出现shuffle后比shuffle前更准确也时有发生。

Partial Dependence Plots

用于统计feature(s)如何影响predictions,用pdpbox库

单个feature的影响

# Build Random Forest model
rf_model = RandomForestClassifier(random_state=0).fit(train_X, train_y) pdp_dist = pdp.pdp_isolate(model=rf_model, dataset=val_X, model_features=feature_names, feature=feature_to_plot) pdp.pdp_plot(pdp_dist, feature_to_plot)
plt.show()

两个features的组合影响

# Similar to previous PDP plot except we use pdp_interact instead of pdp_isolate and pdp_interact_plot instead of pdp_isolate_plot
features_to_plot = ['Goal Scored', 'Distance Covered (Kms)']
inter1 = pdp.pdp_interact(model=tree_model, dataset=val_X, model_features=feature_names, features=features_to_plot) pdp.pdp_interact_plot(pdp_interact_out=inter1, feature_names=features_to_plot, plot_type='contour')
plt.show()

SHAP Values, SHapley Additive exPlanations

对于特定sample的预测,解释每个feature在其中的影响,正负都有。

可用于:

  1. 一个模型说银行不应该借钱给别人,法律要求银行解释每笔贷款被拒的原因。
  2. 医疗服务提供者想要确定,是什么因素导致了每个病人患某些疾病的风险,这样他们就可以通过有针对性的健康干预,直接解决这些风险因素

使用shap库,代码片段如下,其中KernelExplainer 结果和TreeExplainer不完全一样,但是比较接近,结果中表达的意思相同。

import shap  # package used to calculate Shap values

# Create object that can calculate shap values
explainer = shap.TreeExplainer(my_model) # Calculate Shap values
shap_values = explainer.shap_values(data_for_prediction) shap.initjs()
shap.force_plot(explainer.expected_value[1], shap_values[1], data_for_prediction) # use Kernel SHAP to explain test set predictions
k_explainer = shap.KernelExplainer(my_model.predict_proba, train_X)
k_shap_values = k_explainer.shap_values(data_for_prediction)
shap.force_plot(k_explainer.expected_value[1], k_shap_values[1], data_for_prediction)

运行结果的图表类似如下图形,

  • 其中左边(红色)代表当前样本相对于baseline增加的预测值
  • 右边(蓝色)代表当前样本相对于baseline减少的预测值
  • 左边(红色) - 右边(蓝色) => output_value - base_value

Advanced Uses of SHAP Values

Summary Plots

import shap  # package used to calculate Shap values

# Create object that can calculate shap values
explainer = shap.TreeExplainer(my_model) # calculate shap values. This is what we will plot.
# Calculate shap_values for all of val_X rather than a single row, to have more data for plot.
shap_values = explainer.shap_values(val_X) # Make plot. Index of [1] is explained in text below.
shap.summary_plot(shap_values[1], val_X)

结果如下图所示:

  • 每个点代表一个sample
  • 垂直方向是特征
  • 水平方向是该特征对应的SHAP Value
  • 颜色代表该特征的数值大小

SHAP Dependence Contribution Plots

import shap  # package used to calculate Shap values

# Create object that can calculate shap values
explainer = shap.TreeExplainer(my_model) # calculate shap values. This is what we will plot.
shap_values = explainer.shap_values(X) # make plot.
shap.dependence_plot('Ball Possession %', shap_values[1], X, interaction_index="Goal Scored")

运行结果图简介:

  • 横坐标表示Ball Possession %特征的值
  • 纵坐标表示SHAP Value值
  • 颜色(如右边注释)表示Goal Scored特征的值

学习小记: Kaggle Learn - Machine Learning Explainability的更多相关文章

  1. How do I learn machine learning?

    https://www.quora.com/How-do-I-learn-machine-learning-1?redirected_qid=6578644   How Can I Learn X? ...

  2. ML Lecture 0-2: Why we need to learn machine learning?

    在Github上也po了这个系列学习笔记(MachineLearningCourseNote),觉得写的不错的小伙伴欢迎来给项目点个赞哦~~ ML Lecture 0-2: Why we need t ...

  3. kaggle _Titanic: Machine Learning from Disaster

    A Data Science Framework: To Achieve 99% Accuracy https://www.kaggle.com/ldfreeman3/a-data-science-f ...

  4. Kaggle:Titanic: Machine Learning from Disaster

    一直想着抓取股票的变化,偶然的机会在看股票数据抓取的博客看到了kaggle,然后看了看里面的题,感觉挺新颖的,就试了试. 题目如图:给了一个train.csv,现在预测test.csv里面的Passa ...

  5. 李宏毅老师机器学习课程笔记_ML Lecture 0-2: Why we need to learn machine learning?

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  6. 机器学习案例学习【每周一例】之 Titanic: Machine Learning from Disaster

     下面一文章就总结几点关键: 1.要学会观察,尤其是输入数据的特征提取时,看各输入数据和输出的关系,用绘图看! 2.训练后,看测试数据和训练数据误差,确定是否过拟合还是欠拟合: 3.欠拟合的话,说明模 ...

  7. How do I learn mathematics for machine learning?

    https://www.quora.com/How-do-I-learn-mathematics-for-machine-learning   How do I learn mathematics f ...

  8. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  9. In machine learning, is more data always better than better algorithms?

    In machine learning, is more data always better than better algorithms? No. There are times when mor ...

随机推荐

  1. 网络损伤仪WANsim中的时延的不同模型

    网络损伤仪WANsim中的3种时延模型 时延指的是报文从网络的一端到达另一端所花费的时间. 网络损伤仪WANsim中为用户提供了3种时延损伤的模型.常量模型.均匀分布.正态分布. 这3种模型按照各自的 ...

  2. SpringBoot之yaml语法及静态资源访问

    配置文件-yaml 在spring Boot开发中推荐使用yaml来作为配置文件. 基本语法: key: value:kv之间有空格 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab,只允许空格 ...

  3. (opencv09)cv2.getStructuringElement()构造卷积核

    (opencv09)cv2.getStructuringElement()构造卷积核 rectkernel = cv2.getStructuringElement(shape, ksize, anch ...

  4. 【LeetCode】297. 二叉树的序列化与反序列化

    297. 二叉树的序列化与反序列化 知识点:二叉树:递归 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一 ...

  5. Liferay Portal CE 反序列化命令执行漏洞(CVE-2020-7961)

    影响范围 Liferay Portal 6.1.X Liferay Portal 6.2.X Liferay Portal 7.0.X Liferay Portal 7.1.X Liferay Por ...

  6. MFC对文件文件夹转移、删除、重命名、复制【转】

    HFileOperation()函数主要对文件夹有四种操作:复制,删除,移动,重命名. 写了四个函数.可以很好的对文件夹进行操作. //函数名:MoveFolder //参数:lpszFromPath ...

  7. Prettier-Code Formater代码格式化插件使用教程

    目录 Prettier-Code Formater代码格式化插件使用教程 插件的安装 插件的使用 方式一: 配置VScode代码格式化后, 结合VScode快捷键使用 方式二: CLI中使用命令行的方 ...

  8. 连通图与Tarjan算法

    引言 Tarjan算法是一个基于深度优先搜索的处理树上连通性问题的算法,可以解决,割边,割点,双连通,强连通等问题. 首先要明白Tarjan算法,首先要知道它能解决的问题的定义. 连通图 无向图 由双 ...

  9. 1051 Pop Sequence (25分)栈

    刷题 题意:栈的容量是5,从1~7这7个数字,写5个测试数据 做法:模拟栈 #include<bits/stdc++.h> using namespace std; const int m ...

  10. Shell-12-linux信号

    信号类型 信号:信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数 进程可以通过三种方式来响应一个信号: 1.忽略信号,即对信号不做任何处理,其中有两个信号不能忽略: ...