mlr3使用randomForest做回归计算特征重要性调用importance()及设置参数报错
问题本质
- 报错来源于
mlr3learners包对原生randomForest包封装的回归学习器的内置特征重要性计算方法:方法内部会读取训练时存储的超参数importance的值,作为分支判断的输入。当前报错说明存储的参数值不是预期的长度为1的字符串,而是长度大于1的向量,导致switch函数无法正常执行。出现参数长度异常的常见原因是当初配置超参数时,误将importance参数传入了多值向量,没有取单值。 - 调试时观察到
imp对象已包含全量特征重要性数据,说明模型训练流程、重要性计算环节都没有出现数据丢失,故障仅出现在方法内部的参数读取判断环节。
解决方法
修正训练阶段的超参数传参逻辑
你之前直接在调用importance()方法时传入importance = "mse"是无效操作:mlr3封装的该学习器的importance()方法没有开放这个入参,importance是训练阶段必须配置的学习器超参数,不属于方法调用的可传参项,因此才会触发“unused argument”的报错。
正确的配置方式是在初始化学习器时就传入单值的importance参数,示例代码:
library(mlr3learners) # 初始化回归随机森林学习器,训练阶段就指定单值的importance参数 rf_lrn = lrn("regr.randomforest", importance = "mse") # 后续正常执行训练流程即可 rf_lrn$train(task)
针对已完成训练的存量模型的快速修复
如果不想重新执行全量训练流程,可以直接手动修正学习器内部存储的异常参数,绕过报错:
- 定位学习器对象内部封装的原生随机森林模型实体,也就是
rf_lrn$model - 手动将模型实体下的
importance字段赋值为长度1的目标字符串,例如rf_lrn$model$importance <- "mse" - 修正后直接调用
rf_lrn$importance()即可正常输出结果,毕竟重要性的原始计算结果已经完整存在,仅需要修正参数读取环节的异常即可。
避坑提示
注意区分mlr3生态下两个不同实现的随机森林学习器的参数逻辑,避免混用:
- 基于
ranger包实现的regr.ranger学习器,支持在调用importance()方法时传入参数指定重要性计算类型 - 基于原生
randomForest包实现的regr.randomforest学习器,必须在训练前就配置好importance超参数,不支持在调用重要性方法时临时传入参数。
内容的提问来源于stack exchange,提问作者intelinsight
相关产品推荐
相关产品推荐

