R语言For循环输出异常排查:KSVM模型C值遍历后test_accuracy结果不符合预期
问题诊断与修复方案
咱们一步步拆解你的问题,很快就能搞定:
核心问题1:初始化test_accuracy时的致命错误
你写的初始化代码是:
test_accuracy <- rep(0, length(11))
这里length(11)返回的是1(因为11是单个数值,长度为1),所以你的test_accuracy一开始只有1个元素。当循环里x不断递增到2、3...11时,R会自动扩展这个向量,额外的位置默认填充NA,这就是你看到大量NA的直接原因。
正确的初始化应该匹配Test_Cs的长度:
test_accuracy <- rep(0, length(Test_Cs))
这样一开始就创建了11个0的数值向量,刚好对应你要测试的11个C值。
核心问题2:潜在的变量污染
从你的输出里能看到混合的字符串(比如"C:1000.009:0.862385321100917"),这说明你当前环境里的test_accuracy可能之前被定义成了字符型向量。当你往字符向量里赋值数值时,R会自动把数值转成字符,导致结果混乱。
解决办法:在运行代码前,先清理这个旧变量:
rm(test_accuracy) # 先删除旧的污染变量 test_accuracy <- rep(0, length(Test_Cs)) # 重新初始化数值向量
优化建议:用更安全的循环索引
你用x手动计数的方式容易出错,不如直接用seq_along(Test_Cs)遍历索引,这样更直观也更不容易出问题:
# 先清理并初始化正确的向量 rm(test_accuracy) test_accuracy <- rep(0, length(Test_Cs)) # 用索引遍历,替代手动维护x变量 for (x in seq_along(Test_Cs)) { current_C <- Test_Cs[x] # 训练模型(注意把中文引号改成英文引号!) ksvm_model <- ksvm(as.matrix(data[,1:10]), as.factor(data[,11]), scaled=TRUE, type="C-svc", kernel="vanilladot", C=current_C) # 预测并计算准确率 pred <- predict(ksvm_model, data[,1:10]) accu_percentage <- sum(pred == data[,11])/nrow(data) # 赋值到对应位置 test_accuracy[x] <- accu_percentage } print(test_accuracy)
额外注意点
- 检查你的
type和kernel参数引号:你写的是中文引号“C-svc”,必须改成英文引号"C-svc",不然R会直接报错! - 如果你是想测试模型的泛化能力,建议不要用训练数据
data来计算准确率,应该提前拆分出单独的测试集,不然得到的只是训练准确率,不能反映模型的真实性能。
内容的提问来源于stack exchange,提问作者Grace_radetsk
相关产品推荐
相关产品推荐

