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. POJ3048

    素数筛,数据范围不大,直接暴力筛. 坑:有个数据是 1 1,答案是1.差点没把我卡去世. 我的三观哪去了. #include<iostream> #include<cstdio> ...

  2. C语言学习(三)

    一.数组.循环.判断条件   #include<stdio.h> int main(){ int a =100; int b =200; int i; int arr [5]; if (a ...

  3. odoo时间过滤

    Odoo中本日.本月.上月过滤器实现方法   Odoo中本日.本月.上月过滤器实现方法<filter string="今日订单" name="today" ...

  4. Python基础之tabview

    以前写过界面,但是没有记录下来,以至于现在得从头学习一次,论做好笔记的重要性. 现在学习的是怎么写一个tabview出来,也就是用tkinter做一个界面切换的效果.参考链接:https://blog ...

  5. 第七篇 -- photoshop cs6 激活

    下载photoshop cs6破解版 下载amtlib.dll 破解就是将amtlib.dll替换,路径:C:\Program Files\Adobe\Adobe Photoshop CS6 (64 ...

  6. Linux if[......] then ......else...... fi

    条件表达式 if [ -f  file ]    如果文件存在if [ -d ...   ]    如果目录存在if [ -s file  ]    如果文件存在且非空 if [ -r file  ] ...

  7. Mplus 8.3 Combo Version for Win/Mac安装破解教程

    Mplus 8.3是一个统计建模程序,它为研究人员提供了一个灵活的工具来分析数据.本文提供其破解版安装包下载,亲测可永久免费使用,支持Windows 和 Mac操作系统. Mplus 8.3界面简单, ...

  8. 构建前端第6篇之---内嵌css样式 <el-button style="width:100%"> 登录 </el-button>

    张艳涛写于2021-1-20日 What: 如何让button的长度和input长度一致呢 最先想到的是给这个button加一个class ="buttonclass",然后在vu ...

  9. Tom_No_02 Servlet向流中打印内容,之后在调用finsihResponse,调用上是先发送了body,后发送Header的解释

    上次在培训班学上网课的时候就发现了这个问题,一直没有解决,昨天又碰到了,2-3小时也未能发现点端倪,今早又仔细缕了下,让我看了他的秘密 1.Servlet向流中打印内容,之后在调用finsihResp ...

  10. open jdk 绿色版 下载

    https://adoptopenjdk.net/ 是 rethat 的 openjdk 地址, jdk 11 , 进入页面后搜索 : jdk_x64_windo , 下载 zip 绿色版的那个. h ...