mlrMBO运行proposePoints报错:km类对象无效问题求助
问题复现与解决
问题描述
执行proposePoints(opt.state)时触发如下错误:
Error in validObject(model, complete = TRUE) : invalid class “km” object: the number of experiments must be larger than the spatial dimension
相关代码:
x <- structure(list(`1` = c(0L, 0L, 0L, 0L, 0L), `2` = c(0L, 0L, 0L, 0L, 0L), `3` = c(1L, 0L, 0L, 0L, 0L), `4` = c(0L, 0L, 0L, 0L, 0L), `5` = c(0L, 0L, 0L, 0L, 0L), `6` = c(0L, 0L, 0L, 0L, 0L), `7` = c(1L, 0L, 0L, 0L, 0L), `8` = c(1L, 1L, 0L, 0L, 1L), `9` = c(0L, 0L, 0L, 0L, 0L), `10` = c(1L, 1L, 1L, 0L, 0L), `11` = c(0L, 0L, 0L, 0L, 0L), `12` = c(1L, 1L, 1L, 0L, 0L), `13` = c(0L, 1L, 0L, 0L, 1L), `14` = c(0L, 1L, 0L, 0L, 0L), `15` = c(0L, 1L, 1L, 0L, 0L), `16` = c(0L, 0L, 0L, 0L, 0L), `17` = c(1L, 1L, 0L, 0L, 0L), `18` = c(1L, 1L, 0L, 1L, 0L), y = c(75, 62.5, 50, 75, 62.5)), class = "data.frame", row.names = c(NA,-5L)) clnm <- head(colnames(x), -1) library(mlrMBO) ps = makeParamSet( params = lapply(clnm, function(name) makeIntegerParam(name, lower = 0, upper = 1))) ctrl = makeMBOControl() ctrl = setMBOControlInfill(ctrl, crit = crit.ei) opt.state = initSMBO(par.set = ps, design = x, control = ctrl, minimize = FALSE, noisy = FALSE)
错误原因
mlrMBO默认使用的高斯过程模型(km类)有硬性要求:样本数量必须大于特征维度。你的数据中:
- 样本数:5行
- 特征数:18列(排除y列)
5 < 18,不满足模型的基本拟合条件,因此报错。
解决方案
方案1:移除无效特征
数据中存在大量全0的特征(如1、2、4、5、6、9、11、16),这些特征对模型无贡献,可直接删除以降低维度:
# 过滤掉全0的特征列 x_filtered <- x[, colSums(x != 0) > 0] clnm_filtered <- head(colnames(x_filtered), -1) # 重新定义参数集 ps_filtered = makeParamSet( params = lapply(clnm_filtered, function(name) makeIntegerParam(name, lower = 0, upper = 1))) # 重新初始化SMBO opt.state_filtered = initSMBO(par.set = ps_filtered, design = x_filtered, control = ctrl, minimize = FALSE, noisy = FALSE) # 生成新方案 proposePoints(opt.state_filtered)
处理后特征数降至10,若仍不满足样本>特征的要求,可进一步筛选方差极小的特征。
方案2:更换高维友好模型
改用随机森林这类适配高维小样本场景的模型,替代默认的高斯过程:
library(mlr) # 创建随机森林回归学习器 learner <- makeLearner("regr.randomForest", ntree = 100) # 初始化SMBO时指定自定义学习器 opt.state_rf = initSMBO(par.set = ps, design = x, control = ctrl, minimize = FALSE, noisy = FALSE, learner = learner) # 生成新方案 proposePoints(opt.state_rf)
方案3:补充初始样本
收集更多样本,确保样本数量大于特征维度(至少19个样本),即可继续使用默认的高斯过程模型。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

