什么是PDP、ICE
PDP(部分依赖图)和ICE(个体条件期望)是用于解释机器学习模型的方法,它们主要用于理解特征与目标变量之间的关系
PDP(部分依赖图)
PDP 是一种全局解释方法,它显示某个特征的变化如何影响模型的预测,通过平均所有其他特征的值来显示某个特征对目标变量的平均影响,PDP 的步骤:
- 选择特征:选择需要解释的特征
- 生成网格点:在所选特征的取值范围内生成一系列点
- 计算预测值:对于每个网格点,保持其他特征不变(平均值或实际值),计算模型的预测值
- 绘制曲线:将网格点和对应的预测值绘制成曲线,展示该特征与预测值之间的关系
PDP 能够显示特征的平均影响,但它忽略了特征之间的相互作用
ICE(个体条件期望)
ICE 是一种局部解释方法,它显示了特定样本的预测值随某个特征变化的情况,相比于 PDP,ICE 提供了每个个体样本的特征对目标变量的影响, ICE 的步骤:
- 选择特征:选择需要解释的特征
- 生成网格点:在所选特征的取值范围内生成一系列点
- 计算预测值:对于每个样本和每个网格点,保持其他特征不变,计算模型的预测值
- 绘制曲线:将每个样本的网格点和对应的预测值绘制成曲线,展示该特征与预测值之间的关系
ICE 图展示了不同样本的反应差异,可以更详细地了解特征的影响
PDP 和 ICE 的区别
范围:PDP 是全局的,显示特征对整体预测的平均影响;ICE 是局部的,显示特定样本的预测反应(也就是部分依赖图PDP是个体条件期望图ICE曲线的均值,这个含义在后文实际操作更加清晰明了)
细节:PDP 不能反映样本间的差异;ICE 可以显示样本间的差异
为什么生成网格点
可以发现PDP和ICE流程及其相似只是一个平均的区别,且都存在一个过程网格点的生成,这个实际上这就是这个模型解释的精髓所在,解释如下:
- 选择特征和范围:确定你想要研究的特征,并设置其取值范围,通常是从最小值到最大值
- 设置网格分辨率:确定在这个范围内生成多少个取值点,例如,可以设置分辨率为50,表示在范围内均匀生成50个取值点
- 生成网格点:根据设置的范围和分辨率,在特征的取值范围内生成一系列的值
- 计算预测结果:对于每个生成的取值点,保持其他特征不变,通过训练好的模型预测结果(通常是平均预测值)
- 绘制可视化:使用生成的网格点和对应的预测结果,绘制可视化来展示特征对预测结果的影响
通俗来讲就是你'希望探索特征'对因变量的影响,保持其他特征的值不变,并逐步变化'希望探索特征'列的取值,这个过程就是通过生成网格点来实现的,每个点对应一个特定的'希望探索特征'取值,观察其对模型预测结果的影响
代码实现
搭建LightGBM模型
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('california.xlsx')
from sklearn.model_selection import train_test_split
X = df.drop(['price'],axis=1)
y = df['price']
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 然后将训练集进一步划分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=42) # 0.125 x 0.8 = 0.1
# 数据集标准化
x_mean = X_train.mean()
x_std = X_train.std()
y_mean = y.mean()
y_std = y.std()
X_train = (X_train - x_mean)/x_std
y_train = (y_train-y_mean)/y_std
X_val = (X_val - x_mean)/x_std
y_val = (y_val - y_mean)/y_std
X_test = (X_test - x_mean)/x_std
y_test = (y_test - y_mean)/y_std
import lightgbm as lgb
# LightGBM模型参数
params_lgb = {
'learning_rate': 0.02,
'boosting_type': 'gbdt',
'objective': 'mse',
'metric': 'rmse',
'num_leaves': 127,
'verbose': -1,
'seed': 42,
'n_jobs': -1,
'feature_fraction': 0.8,
'bagging_fraction': 0.9,
'bagging_freq': 4
}
model_lgb = lgb.LGBMRegressor(**params_lgb)
model_lgb.fit(X_train, y_train, eval_set=[(X_val, y_val)],
eval_metric='rmse')
这里建立一个lightgbm模型,后续将对这个模型利用PDP、ICE进行解释
PDP绘制
from sklearn.inspection import PartialDependenceDisplay
features = ['MedInc'] # 替换为你要绘制的特征
# model_lgb为训练模型 X_val为验证集 kind为average代表绘制PDP
PartialDependenceDisplay.from_estimator(model_lgb, X_val, features, kind='average')
plt.show()
这里都是通过sklearn的PartialDependenceDisplay进行实现,除了这个实现方法,还可以通过shap、pdpbox实现,X轴:表示选择研究的特征的取值范围,Y轴表示模型的预测结果,根据PDP可视化可知在lightgbm模型下目标变量price 随着 自变量MedInc 的增加而增加
ICE绘制
features = ['MedInc']
PartialDependenceDisplay.from_estimator(model_lgb, X_val, features, kind='individual')
plt.show()
绘制ICE可视化只改变了参数kind='individual',可发现ICE相较于PDP线条更加密集,因为ICE展示在不同MedInc值下(其它特征值保持原值不变)每一个样本的price值,也就是特定特征取值范围内单个样本对因变量预测的变化路径,而PDP为这些结果的均值,这里也能看出目标变量price随着自变量MedInc的增加而增加,只是这里展示了不同样本的反应差异,可以更详细地了解特征的影响
同画布下绘制PDP、ICE
features = ['MedInc', 'HouseAge']
fig, ax = plt.subplots(figsize=(15, 5))
display = PartialDependenceDisplay.from_estimator(
model_lgb,
X_val,
features=features,
kind='both',
grid_resolution=50,
contour_kw={'cmap': 'viridis', 'alpha': 0.8},
ax=ax
)
ax.set_title('POP ICE', fontsize=16)
ax.set_xlabel('Median Income', fontsize=14)
ax.set_ylabel('House Age', fontsize=14)
plt.tick_params(axis='both', which='major', labelsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
改变参 数kind='both'同时绘制PDP、ICE,当然这里的代码对可视化做了一些改变不采用默认可视化,并且同时绘制了两个变量的PDP、ICE
2D PDP绘制
# 选择两个特征绘制2D PDP
features = ['MedInc', 'AveOccup']
# 使用 contour_kw 参数绘制2D PDP
fig, ax = plt.subplots(figsize=(10, 6))
PartialDependenceDisplay.from_estimator(
model_lgb,
X_val,
features=[features],
kind='average',
grid_resolution=50,
contour_kw={'cmap': 'viridis', 'alpha': 0.8},
ax=ax
)
plt.suptitle('2D Partial Dependence Plot for MedInc and AveOccup')
plt.show()
前面进行的所有探讨都是讨论的单变量对预测值的影响,没有考虑变量之间是如何同时对预测值进行影响的,这里引入2D PDP可以同时考虑两个特征变量的取值范围,并显示它们对因变量预测的联合影响 ,这里 从三个方面去理解 2D PDP:轴分别为两个特征、等高线显示在不同组合下两个特征的模型预测值,每条等高线代表一个特定的预测值,沿着等高线模型预测值保持不变,等高线的形状和分布显示了两个特征如何交互影响模型的预测、颜色映射表示模型预测值的大下,颜色越深(根据你使用的cmap),预测值越高或越低具体取决于颜色映射的设置,对这个2D PDP的具体解读如下:
MedInc 值从低到高,颜色从深到浅,意味着随着MedInc的增加,模型预测值增加,
AveOccup 值从低到高,颜色逐渐变深,意味着随着AveOccup的增加,模型预测值减少,等高线越密集,表示预测值对特征的变化越敏感,这里作者认为一般,(等高线的平行分布表明特征之间的独立性,而弯曲的等高线表明特征之间存在交互作用)这里等高线显示一个倾斜的方向,表示MedInc和AveOccup的组合影响模型预测值,当MedInc
高且AveOccup
低时,预测值最高,这可能暗示在高收入且低密度的地区,房价较高
PartialDependenceDisplay参数
这里给出了一部分参数,具体参考官方文档
往期推荐
Pythorch框架构建Attention-lstm时序模型
利用python meteostat库对全球气象数据访问,获取历史气象数据
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考