Partial Dependence Plot
Partial Dependence就是用来解释某个特征和目标值y的关系的,一般是通过画出Partial Dependence Plot(PDP)来体现。
PDP是依赖于模型本身的,所以我们需要先训练模型(比如训练一个random forest模型)。假设我们想研究y和特征\(X_1\)的关系,那么PDP就是一个关于\(X_1\)和模型预测值的函数。我们先拟合了一个随机森林模型RF(X),然后用\(X_k^{i}\)表示训练集中第k个样本的第i个特征,那么PDP的函数就是
\]
也就是说PDP在\(X_1\)的值,就是把训练集中第一个变量换成\(X_1\)之后,原模型预测出来的平均值。
根据\(X_1\)的不同取值,\(f(X_1)\)就可以练成折线,这个折线就是Partial Dependence Plot,横轴是\(X_1\),纵轴就是Partial Dependence。
下图就是一个例子
aaarticlea/png;base64,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" alt="img">
自己写代码模拟:
from sklearn.tree import DecisionTreeRegressor
from sklearn.inspection import partial_dependence
from sklearn.datasets import load_boston
import numpy as np
import matplotlib.pyplot as plt
data = load_boston()
X, y = data.data, data.target
dtr = DecisionTreeRegressor()
dtr.fit(X,y)
def my_pdp(model, X, feat_idx):
fmax, fmin = np.max(X[:, feat_idx]), np.min(X[:, feat_idx])
frange = np.linspace(fmin, fmax, 100)
preds = []
for x in frange:
X_ = X.copy()
X_[:, feat_idx] = x
pred = model.predict(X_)
preds.append(np.mean(pred))
return (frange, np.array(preds))
del dtr.classes_
my_data = my_pdp(dtr, X, 0)
sk_data = partial_dependence(dtr, X = X, features = [0], percentiles=[0,1])
plt.subplot(121)
plt.plot(my_data[0], my_data[1])
plt.subplot(122)
plt.plot(sk_data[1][0], sk_data[0][0])
plt.show()
Github python library PDPbox
优点
pdp的计算是直观的:partial dependence function 在某个特定特征值位置表示预测的平均值,如果我们强制所有的数据点都取那个特征值。在我的经验中,lay people(普通人,没有专业知识的大众)通常都可以很快理解PDPs的idea。
如果你要计算的PDP的特征和其它特征没有关联,那么PDP可以完美的展示出这个特征大体上上如何影响预测值的。在不相关的情况下,解释是清晰的:PDP展示了平均预测值在某个特征改变时是如何变化的。如果特征是相互关联的,这会变得更加复杂。
不足
实际分析PDP时的最大特征个数是2。这不是PDP的错误,而是由于我们人无法想象超过三维的空间。
有一些 PDP并不展示特征分布。忽略分布可能会造成误解,因为你可能会过度解读具有少量数据的地方。这个问题通过展示一个rug或者histogram在x轴上的方式很容易解决。
独立性假设是PDP的最大问题,它假设计算的特征和其它特征是不相关的。当特征是相关的时候,我们创造的新的数据点在特征分布的空间中出现的概率是很低的。对这个问题的一个解决方法就是Accumulate Local Effect plots,或者简称ALE plots,它工作在条件分布下而不是边缘分布下。
多种类的影响可能会被隐藏,因为PDP仅仅展示边际影响的平均值。假设对于一个要计算的特征,一半的数据点对预测有正相关性,一半的数据点对预测有负相关性。PD曲线可能会是一个水平的直线,因为两半数据点的影响可能会互相抵消。然后你可能会得出特征对预测没有影响的结论。通过绘制individual conditional expectation curves而不是aggregated line,我们可以揭示出这种heterogeneous effects。
Partial Dependence Plot的更多相关文章
- XAI/MLI 可解释机器学习系列1- 开源&paper汇总
一直在关注可解释机器学习领域,因为确实在工作中有许多应用 模型检查,特征重要性是否符合预期和AUC一样重要 模型解释,比起虚无缥缈的模型指标,解释模型学到的规律更能说服业务方 样本解释,为什么这些用户 ...
- Gradient Boosted Regression Trees 2
Gradient Boosted Regression Trees 2 Regularization GBRT provide three knobs to control overfitting ...
- 集成方法:渐进梯度回归树GBRT(迭代决策树)
http://blog.csdn.net/pipisorry/article/details/60776803 单决策树C4.5由于功能太简单.而且非常easy出现过拟合的现象.于是引申出了很多变种决 ...
- kaggle Partial_Dependence_Plots
# Partial dependence plots# 改变单变量对最终预测结果的影响# 先fit出一种模型,然后取一行,不断改变某一特征,看它对最终结果的印象.# 但是,只使用一行不具有典型性# 所 ...
- 学习小记: Kaggle Learn - Machine Learning Explainability
Method Feature(s) Sample(s) Result Value/Feature Permutation Importance 1 all validation samples Sin ...
- R语言实战(四)回归
本文对应<R语言实战>第8章:回归 回归是一个广义的概念,通指那些用一个或多个预测变量(也称自变量或解释变量)来预测响应变量(也称因变量.效标变量或结果变量)的方法.通常,回归分析可以用来 ...
- XGBoost、LightGBM的详细对比介绍
sklearn集成方法 集成方法的目的是结合一些基于某些算法训练得到的基学习器来改进其泛化能力和鲁棒性(相对单个的基学习器而言)主流的两种做法分别是: bagging 基本思想 独立的训练一些基学习器 ...
- scikit-learn:class and function reference(看看你究竟掌握了多少。。)
http://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition Reference This is t ...
- XGBoost、LightGBM、Catboost总结
sklearn集成方法 bagging 常见变体(按照样本采样方式的不同划分) Pasting:直接从样本集里随机抽取的到训练样本子集 Bagging:自助采样(有放回的抽样)得到训练子集 Rando ...
随机推荐
- 管家婆crm9.2 sp2升级问题求助及解决方案
升级过程中发生如下问题: 弹出对话框1:升级完成,但是有错误产生. 弹出对话框2:升级数据库发生错误:An attempt was made to load an assembly from a ne ...
- 基于C#开发的扩展按钮控件
最近在准备一套自定义控件开发的课程,下面将第一个做的按钮控件分享给大家. 其实这个控件属于自定义控件中的扩展控件,与组合控件和GDI+开发的控件不同,这个控件是继承原生的Button, 这个控件的目的 ...
- ubuntu 编译zbar 静态库
wget http://downloads.sourceforge.net/project/zbar/zbar/0.10/zbar-0.10.tar.gz tar -zvxf zbar-0.10.ta ...
- SQL Server 分页SQL
SELECT * FROM(SELECT ROW_NUMBER() OVER(order by Id DESC)AS rownum, (SELECT COUNT(*) FROM Ana_Strateg ...
- 【Day2】1.循环结构
视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...
- cmake 判断操作系统平台
转载自 cmake 判断操作系统平台 MESSAGE(STATUS "operation system is ${CMAKE_SYSTEM}") IF (CMAKE_SYSTEM_ ...
- java指定运行jar包中的其中一个main方法
java -cp jar包 类名 java -cp ******.jar com.******.EsEtl
- 详解python中的生成器表达式
什么是生成器表达式 还记得列表解析吗?我们把[]换成()就变成生成器表达式了. g = (x for x in [1, 2, 3, 4]) print(g) # <generator objec ...
- 并发编程: GIL锁、GIL与互斥锁区别、进程池与线程池的区别
一.GIL 二.关于GIL性能的讨论 三.计算密集测试 四.IO密集测试 五.GIL与互斥锁 六.TCP客户端 七.进程池 八.进程什么时候算是空闲 九.线程池 一.GIL GIL Global In ...
- Hadoop_06_Hadoop的HDFS的概念和特性
1.HDFS的概念和特性 1.1. 首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件 1.2. 它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色:重 ...