R中导入SPSS Modeler导出的含CompoundPredicate的CHAID PMML模型有新进展吗?
在R中导入含CompoundPredicate的SPSS Modeler CHAID PMML模型解决方案
针对你用partykit导入SPSS Modeler导出的CHAID PMML时遇到的CompoundPredicate not yet implemented错误,目前有几个可行的解决方向,以及一些最新进展:
1. 用xml2手动解析重构模型
partykit对复杂谓词的支持有限,但可以配合XML解析工具自己处理CompoundPredicate节点:
- 先用
xml2::read_xml()加载你的PMML文件 - 定位到CHAID树里的
CompoundPredicate节点,提取里面的子条件(比如And/Or逻辑下的多个简单判断) - 把这些条件合并成R能识别的表达式(比如用
&连接And逻辑的条件),再手动组装成partykit支持的constparty模型结构
2. 试试r2pmml的开发版
r2pmml原本是用来把R模型转成PMML的,现在开发版加了反向解析功能,专门适配过SPSS导出的CHAID模型:
- 先装开发版:
devtools::install_github("jpmml/r2pmml") - 导入模型:
model <- r2pmml::parse_pmml("你的模型文件.pmml") - 注意这个功能还在迭代,遇到特殊情况可以去项目仓库提反馈
3. 写脚本修改PMML结构
针对SPSS导出的PMML格式,批量把CompoundPredicate转换成partykit能识别的结构:
- 比如把
<CompoundPredicate booleanOperator="And">下的多个条件合并成一个表达式,替换掉原节点 - 示例代码片段:
library(xml2) pmml_doc <- read_xml("chaid_model.pmml") # 找到所有CompoundPredicate节点 compound_nodes <- xml_find_all(pmml_doc, "//CompoundPredicate") for(node in compound_nodes){ op_type <- xml_attr(node, "booleanOperator") # 提取每个子条件 simple_preds <- xml_find_all(node, ".//SimplePredicate") cond_list <- lapply(simple_preds, function(p){ paste0(xml_attr(p, "field"), " ", xml_attr(p, "operator"), " ", xml_attr(p, "value")) }) # 合并成逻辑表达式 combined_cond <- paste(cond_list, collapse = ifelse(op_type == "And", " & ", " | ")) # 这里可以根据partykit的要求替换节点内容,或者直接生成可用的表达式 } # 保存修改后的PMML再用partykit导入 write_xml(pmml_doc, "modified_chaid.pmml")
最新进展说明
截至2024年,partykit官方还没正式支持CompoundPredicate,但社区有用户提交了相关PR,你可以关注项目的GitHub仓库动态;另外r2pmml的反向解析功能一直在优化,对SPSS CHAID的支持越来越完善,优先试试这个。
内容的提问来源于stack exchange,提问作者Mojoesque
相关产品推荐
相关产品推荐

