You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:25:57