tidymodels中绘制C5.0决策树报错原因及解决方法
在tidymodels中绘制C5.0决策树时解决"object 'x' not found"错误的方法
问题背景
使用tidymodels框架训练C5.0决策树后,调用plot()函数会抛出Error in eval(parse(text = paste(obj$call)[xspot])) : object 'x' not found错误,但直接使用C50包训练相同参数的模型时,plot()可以正常生成决策树图。
错误原因
查看tidymodels训练出的C5.0模型的调用记录(summary()输出的Call部分):
C5.0.default(x = x, y = y, trials = 1, control = C50::C5.0Control(minCases = 2, sample = 0))
这里的x和y是tidymodels内部传递的临时变量,训练完成后这些变量会被清理回收。而C5.0的plot()函数依赖从模型的call参数中解析x来获取特征数据集,因此找不到x对象导致报错。
直接使用C50包训练时,模型的call里是具体的数据集(比如x = iris[,1:4]),plot()可以直接定位到数据,所以正常工作。
解决方法
方法1:手动补充模型的x属性
提取tidymodels训练后的C5.0模型对象,手动将训练数据的特征列赋值给模型的x属性:
# 提取底层C5.0模型 c50_model <- fttd$fit$fit$fit # 为模型补充特征数据 c50_model$x <- iris[, 1:4] # 正常绘制决策树 plot(c50_model)
方法2:直接使用C50::C5.0Plot()函数
调用C50包提供的C5.0Plot()函数,显式传入模型和特征数据,绕开对call参数的解析:
C50::C5.0Plot(fttd$fit$fit$fit, data = iris[, 1:4])
两种方法都能生成与直接使用C50包训练时一致的决策树可视化结果。
内容的提问来源于stack exchange,提问作者Marc Kees
相关产品推荐
相关产品推荐

