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 ...
随机推荐
- Navicat 12的安装与使用(附加破解)
地址https://blog.csdn.net/tomos428/article/details/80483450?tdsourcetag=s_pctim_aiomsg
- WCF寄宿windows服务一
如果只是寄宿单个wcf服务,方法很简单,步骤:1.创建好一个windows服务.关于windows服务内容见:http://www.cnblogs.com/zhaow/p/7866916.html2. ...
- QT编译Mysql驱动问题及解决方案
默认情况下,qt 并没有自带mysql的数据库插件,需要自己编译先安装mysql server ,运行setup.exe时选择自定义安装,安装目录设为"D:\mysqldev"不要 ...
- spring AOP的相关术语
连接点:Joinpoint 其实业务层接口的方法 切入点:Pointcut 被增强的是切入点,没被增强是永远都是连接点.连接点不一定是切入点,切入点一定是连接点 通知:Advice 就是指要增强的 ...
- sql的关键字
整理一下sql的关键字,一直都在用,只是很少去整理,所以今天简单整理一下,主要是整理CRUD的一些关键字. 写在前面:sql 不区分大小写 select 简单查询语句 select columnNam ...
- maven入门-- part5 本地仓库,远程仓库,私服
解读Maven在仓库中的存储路径: 1.基于groupId准备路径,将句点分隔符转成路径分隔符,就是将 "." 转换成 "/" ; example: org ...
- jQuery EasyUI中DataGird动态生成列的方法
EasyUI中使用DataGird显示数据列表中,有时需要根据需要显示不同的列,例如,在权限管理中,不同的用户登录后只能查看自己权限范围内的列表字段,这就需要DataGird动态组合列,下面介绍Eas ...
- 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
- Jenkins升级版本
1 Jenkins的管理界面,下载最新版本的war包 2 找到自己部署Jenkins的war包的tomcat目录,替换最新的war包,重启tomcat即可 只需要把之前的war包重命名一个名字,不要以 ...
- centos 7 安装 Docker Engine-CentOS 社区版
获取Docker Engine-CentOS社区: https://docs.docker.com/install/linux/docker-ce/centos/ 1.操作系统要求 1.1 要安装 D ...