R语言特征标准化后调用seq函数报错'from必须为有限值'问题求助
R二分类任务网格生成报错修复方案
错误根因
dplyr::select()操作未赋值回原数据框,导致后续使用的bes仍为原始全字段数据,列索引不符合预期,若对应索引列非数值型,scale()后会生成缺失值。- 数据集拆分时
subset的筛选条件误用赋值符=而非逻辑判断符==:subset(bes, split=T)会在函数内部创建局部变量split赋值为TRUE,最终training取全量数据、testing取空数据集,取极值时会返回非有限值。 - 测试集单独标准化不符合规范,会造成数据泄露。
修复后可运行代码
library(caTools) library(dplyr) # 字段筛选后赋值回原对象 bes <- dplyr::select(bes, age, lr_scale, euRefVoteAfter) split <- sample.split(bes$euRefVoteAfter, SplitRatio = 0.75) # 拆分时用逻辑判断符==匹配拆分标记 training <- subset(bes, split == TRUE) testing <- subset(bes, split == FALSE) # 统一用训练集的统计量做标准化,避免数据泄露 train_scale_res <- scale(training[-3]) training[-3] <- train_scale_res testing[-3] <- scale(testing[-3], center = attr(train_scale_res, "scaled:center"), scale = attr(train_scale_res, "scaled:scale")) library(class) # 极值计算加na.rm=T兜底,过滤原始数据可能存在的缺失值 X1 <- seq(min(training[,1], na.rm = TRUE) - 1, max(training[,1], na.rm = TRUE) + 1, by = 0.01) X2 <- seq(min(training[,2], na.rm = TRUE) - 1, max(training[,2], na.rm = TRUE) + 1, by = 0.01)
补充说明
如果原始数据的age或lr_scale字段本身存在大量缺失值,建议先做缺失值插补再执行后续建模操作,避免过滤缺失值后结果偏差。
内容的提问来源于stack exchange,提问作者lata
相关产品推荐
相关产品推荐

