PDP(部分依赖图)、ICE(个体条件期望)解释机器学习模型保姆级教程

技术

picture.image

什么是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')
      

picture.image

这里建立一个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()
      

picture.image

这里都是通过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()
      

picture.image

绘制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()
      

picture.image

改变参 数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()
      

picture.image

前面进行的所有探讨都是讨论的单变量对预测值的影响,没有考虑变量之间是如何同时对预测值进行影响的,这里引入2D PDP可以同时考虑两个特征变量的取值范围,并显示它们对因变量预测的联合影响 ,这里 从三个方面去理解 2D PDP:轴分别为两个特征、等高线显示在不同组合下两个特征的模型预测值,每条等高线代表一个特定的预测值,沿着等高线模型预测值保持不变,等高线的形状和分布显示了两个特征如何交互影响模型的预测、颜色映射表示模型预测值的大下,颜色越深(根据你使用的cmap),预测值越高或越低具体取决于颜色映射的设置,对这个2D PDP的具体解读如下:

MedInc 值从低到高,颜色从深到浅,意味着随着MedInc的增加,模型预测值增加, AveOccup 值从低到高,颜色逐渐变深,意味着随着AveOccup的增加,模型预测值减少,等高线越密集,表示预测值对特征的变化越敏感,这里作者认为一般,(等高线的平行分布表明特征之间的独立性,而弯曲的等高线表明特征之间存在交互作用)这里等高线显示一个倾斜的方向,表示MedInc和AveOccup的组合影响模型预测值,当MedInc高且AveOccup低时,预测值最高,这可能暗示在高收入且低密度的地区,房价较高

PartialDependenceDisplay参数

picture.image

这里给出了一部分参数,具体参考官方文档

往期推荐

Pythorch框架构建Attention-lstm时序模型

SHAP全解析:机器学习、深度学习模型解释保姆级教程

利用python meteostat库对全球气象数据访问,获取历史气象数据

Python桑基图可视化:揭示数据行为路径

梯度提升集成:LightGBM与XGBoost组合预测

特征工程——数据转换

回归任务常见评价指标解读以及Python实现

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论