R中party与partykit包varimp返回变量数不同,如何让其返回全部变量?
party与partykit包
varimp()返回变量数量差异的解决方法 问题描述
使用party和partykit包的varimp()函数计算条件随机森林(CRF)的变量重要性时,两者返回的变量数量不一致:
party::varimp()返回的变量数与模型输入的自变量总数一致(示例中为60个)partykit::varimp()返回的变量数更少(示例中为43个)
注:此处仅讨论返回变量的数量差异,不涉及重要性排序或数值大小的区别
补充背景
在使用parallel进行并行计算时,partykit计算条件变量重要性的速度比party更快,因此优先考虑使用partykit,但需要解决变量数量缺失的问题。
最小可复现示例
library(party) library(partykit) set.seed(303) # 生成模拟数据 df <- data.frame(matrix(ncol = 61, nrow = 100)) iVarNames <- paste("iVar", 1:60, sep="") colnames(df) <- c("dVar", iVarNames) # 生成因变量 df$dVar <- runif(100, min=0, max=10) # 生成自变量(与因变量存在线性关联) for (icol in iVarNames){ df[[icol]] <- df$dVar + runif(1, 0.5, 1)*rnorm(100, sd=runif(1, 1, 5)) } # 构建模型公式 formVar <- reformulate(iVarNames, 'dVar') # 使用party训练CRF crfParty <- party::cforest(formVar, data=df, controls=party::cforest_unbiased(ntree=300, mtry=as.integer(length(iVarNames)/3))) # 获取变量重要性 impParty <- sort(party::varimp(crfParty), decreasing=TRUE) # 使用partykit训练CRF crfPartykit <- partykit::cforest(formVar, data=df, ntree=300, mtry=as.integer(length(iVarNames)/3)) # 获取变量重要性(默认行为) impPartykit <- sort(partykit::varimp(crfPartykit), decreasing=TRUE) # 对比返回长度 length(impParty) length(impPartykit)
运行结果
[1] 60 [1] 43
原因分析
partykit::varimp()的默认行为会自动过滤掉从未在任何决策树中被用作分割变量的自变量——这些变量在所有树中都没参与分割,因此默认不返回。而party::varimp()会保留所有输入变量,即使其重要性为0。
解决方法
在调用partykit::varimp()时添加drop=FALSE参数,强制返回所有输入变量:
# 获取所有变量的重要性 impPartykit_full <- sort(partykit::varimp(crfPartykit, drop=FALSE), decreasing=TRUE) # 验证长度 length(impPartykit_full)
修改后运行结果
[1] 60
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

