将rpart模型转换为PMML时遇逻辑值缺失错误求助
解决rpart转PMML时的"需要TRUE/FALSE值的位置存在缺失值"错误
你遇到的这个错误本质上是pmml包处理极端树结构时的小bug:当rpart模型的节点中存在代理分割(surrogate split)信息缺失的情况时,代码里的条件判断if (ff$nsurrogate[parent_ii] > 0)会因为nsurrogate是NA而崩溃。
从你的复现代码来看,设置cp=-1和minsplit=1会让rpart生成非常深且极端的树(几乎每个类别都单独分裂),这种情况下很容易出现节点没有代理分割的情况,进而导致nsurrogate列出现缺失值。
下面是几种可行的解决办法:
方法1:调整rpart参数生成规范树
最稳妥的方式是避免生成过于极端的树,把rpart的控制参数调整到合理范围,比如改用默认的cp值,或者提高minsplit的阈值:
library(rpart) library(pmml) # 调整参数,生成更规范的决策树 model <- rpart(y ~ a, df, control = rpart.control(minsplit = 5, minbucket = 2, cp=0.01)) # 尝试转换PMML pmml.rpart(model)
方法2:手动修补模型的缺失值(保留原树结构)
如果你必须保留当前的树结构,可以手动把model$frame中nsurrogate列的NA值替换为0,让PMML转换的条件判断能正常执行:
# 修补模型中的nsurrogate缺失值 model$frame$nsurrogate[is.na(model$frame$nsurrogate)] <- 0 # 再次执行转换 pmml.rpart(model)
方法3:升级pmml包
你的pmml包版本是1.5.7,这个bug在后续的版本中已经被修复了。如果环境允许,建议直接升级到最新版:
install.packages("pmml")
你可以先试试方法1,要是必须保留原树结构再用方法2,升级包则是一劳永逸的方案~
内容的提问来源于stack exchange,提问作者Volokh
相关产品推荐
相关产品推荐

