You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法基于caret的train对象计算cforest模型的条件变量重要性

基于caret训练的cforest模型计算条件变量重要性的解决方法

问题背景

使用caret包的train()函数拟合cforest模型(该模型支持原生处理缺失值,故设置na.action = na.pass),但计算条件变量重要性时遇到两类报错:

  • 调用caret::varImp(cforet_model, conditional = TRUE)时,报错提示cannot compute variable importance measure with missing values
  • 调用partykit::varimp(cforet_model$finalModel, conditional = TRUE)时,报错提示no applicable method for 'varimp' applied to an object of class "RandomForest"

示例代码:

# 加载iris数据集
data(iris)

# 在自变量中引入缺失值
set.seed(5978)
iris$Sepal.Length[sample(1:nrow(iris), 10)] <- NA

# 使用caret拟合cforest模型
library(caret)

cforet_model <-  train(Species ~ ., data = iris, method = "cforest", 
                       na.action = na.pass,
                       trControl = trainControl(method = "cv", number = 5))

class(cforet_model)

# 尝试计算条件变量重要性
varimp_cforest <- caret::varImp(cforet_model, conditional = TRUE)
varimp_cforest <- partykit::varimp(cforet_model$finalModel, conditional = TRUE)

问题原因

  1. caret::train()默认调用party包的旧版cforest实现,生成的finalModel属于RandomForest类,而非partykit包所需的cforest类,导致partykit::varimp()无法识别。
  2. caret::varImp()底层调用的是party::varimp(),该函数不支持在存在缺失值的场景下计算条件变量重要性。

解决步骤

1. 改用partykit包的cforest实现训练模型

train()函数中指定control = partykit::cforest_control(),确保生成的模型对象符合partykit的要求:

library(caret)
library(partykit)

data(iris)
set.seed(5978)
iris$Sepal.Length[sample(1:nrow(iris), 10)] <- NA

# 训练模型时指定partykit的控制参数
cforet_model <- train(Species ~ ., 
                      data = iris, 
                      method = "cforest", 
                      na.action = na.pass,
                      trControl = trainControl(method = "cv", number = 5),
                      control = partykit::cforest_control())

# 验证模型类:应为 "cforest" "RandomForest"
class(cforet_model$finalModel)

2. 使用partykit::varimp()计算条件变量重要性

直接调用partykit的函数,传入训练好的finalModel和原始数据:

# 计算条件变量重要性
varimp_cforest <- partykit::varimp(cforet_model$finalModel, 
                                   conditional = TRUE,
                                   data = iris)

# 输出结果
print(varimp_cforest)

补充说明

  • 若坚持使用caret::varImp(),需先对缺失值进行插补处理,但这会丧失cforest原生支持缺失值的优势,因此更推荐上述方法。
  • 条件变量重要性的计算依赖原始数据集,必须传入data参数,否则可能导致结果不准确或报错。

内容的提问来源于stack exchange,提问作者Linus

火山引擎 最新活动