R语言Stacking集成学习运行时报`-ncol(test)`一元运算符参数无效错误
报错原因与解决方案
Error in -ncol(test) : invalid argument to unary operator 报错的本质是代码执行到-ncol(test)时,ncol(test)返回了NULL,R不支持对NULL执行一元负号运算,触发该错误。
核心修复方案
- 调整函数定义与调用的顺序
R为顺序执行的脚本语言,你当前代码先调用ans <- stacking_et0(train, test),后定义stacking_et0函数,首次运行时函数未加载,会引发各类异常。将stacking_et0函数的完整定义代码移到调用语句之前即可解决该类顺序问题。 - 强制保留数据框结构,避免自动降维
R对数据框取单列时默认会自动降维为向量,向量无列数属性,ncol(向量)返回NULL,是触发本次报错的直接原因。所有切片操作添加drop = FALSE参数强制保留数据框结构:stacking_et0 <- function(train, test, nmeta_mdls=1){ # 可选:添加输入校验提前拦截异常输入 stopifnot(is.data.frame(train), ncol(train)>=2, is.data.frame(test), ncol(test)>=2) nmdls <- 3 test <- test[,-ncol(test), drop = FALSE] out_train <- train[,ncol(train), drop = FALSE] train <- train[,-ncol(train), drop = FALSE] # 后续原有代码保持不变 - 修复数据集拆分函数隐患
你当前拆分函数用内置函数名length作为变量,且训练集行数未转整数,可能引发索引异常,修改后代码:split_data <- function(dataset, train = TRUE){ n_obs <- nrow(dataset) total_row <- as.integer(n_obs * 0.8) split <- 1:total_row if (train == TRUE){ return(dataset[split, , drop = FALSE]) } else { return(dataset[-split, , drop = FALSE]) } }
逻辑优化建议(可选,直接影响模型效果)
当前二级元模型的训练数据使用了原始训练集train,没有输入一级模型输出的特征,完全丢失了Stacking集成的价值,修改二级训练代码的输入数据:
# 把原来的data = as.matrix(train)替换为data = as.matrix(new_train) meta_model <- xgboost(data = as.matrix(new_train), label = as.matrix(out_train), num_parallel_tree=num_par, nrounds = iter_bos, max_depth= depth, min_child_weight=weight, subsample=0.9, eta= 0.1, verbose = 0)
内容的提问来源于stack exchange,提问作者Boggarapu Harshini
相关产品推荐
相关产品推荐

