如何为DALEX::model_profile()指定variable_splits参数?
解决DALEX中model_profile()的variable_splits参数设置问题
问题说明
使用DALEX包的model_profile()函数计算随机森林模型的累积局部效应(ALE)时,收到警告:某变量唯一值超过201个,将使用全部值进行拆分,建议通过variable_splits参数手动修改此行为。尝试调用ingredients::calculate_variable_split生成拆分规则时,发现该函数并非ingredients包的导出对象,无法直接调用。
正确设置方法
variable_splits参数需要传入一个列表,列表中每个元素对应一个变量的拆分规则,结构需包含拆分点(cut_points)和变量名(name)。可通过两种方式构造:
方式1:调用ingredients内部函数生成拆分规则
calculate_variable_split是ingredients包的内部未导出函数,可通过三个冒号(:::)调用,指定拆分点数:
# 为toomany变量生成20个拆分点 split_toomany <- ingredients:::calculate_variable_split(data$toomany, n = 20) # 构造variable_splits列表,键为目标变量名 variable_splits_list <- list(toomany = split_toomany)
方式2:手动构造拆分规则
直接通过分位数或自定义区间生成拆分点,手动组装符合要求的结构:
# 对toomany变量按20个分位数生成拆分点 cut_points <- quantile(data$toomany, seq(0, 1, length.out = 21)) # 构造拆分规则列表 variable_splits_list <- list( toomany = list( cut_points = cut_points, name = "toomany" ) )
完整示例代码
将构造好的拆分列表传入model_profile()即可消除警告:
library(tidyverse) library(ranger) library(DALEX) data("iris") glimpse(iris) data<-rbind(iris,iris)%>%# 翻倍数据使观测数超过201 mutate(Species=as.factor(ifelse(Species=="setosa",1,0)))%>%# 将Species转为二分类因子 mutate(toomany=sample(1:1000,300,replace=FALSE))# 生成唯一值超过201的变量 mod<-ranger(Species~.,data,keep.inbag =TRUE,importance='impurity',seed=4,probability=TRUE)# 训练随机森林概率模型 ex<-DALEX::explain(model=mod, data=data[,-5], y=as.numeric(as.character(data$Species)), label="Random Forest")# 创建解释器对象 # 方式1:使用ingredients内部函数生成拆分规则 split_toomany <- ingredients:::calculate_variable_split(data$toomany, n = 20) variable_splits_list <- list(toomany = split_toomany) # 或者方式2:手动构造拆分规则 # cut_points <- quantile(data$toomany, seq(0, 1, length.out = 21)) # variable_splits_list <- list( # toomany = list( # cut_points = cut_points, # name = "toomany" # ) # ) # 传入variable_splits参数计算ALE,无警告 ale<-model_profile(explainer=ex,type="accumulated",variable_splits=variable_splits_list)
补充说明
- 若需为多个变量设置拆分规则,只需在
variable_splits_list中添加对应变量的拆分元素即可,格式与单个变量一致。 - 拆分点数
n可按需调整,通常建议设置为20-50之间,平衡计算效率与结果精度。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

