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

应用统计II项目R语言随机森林代码报错:参数长度不一致求助

问题排查:随机森林混淆矩阵报错(all arguments must have the same length)

问题描述

我是一名R语言新手,正在完成应用统计II(Applied Stats II)项目。运行代码时反复出现以下错误:

[1] "Confusion Matrix: TRAINING set based on random forest model built using 2 trees"
Error in table(train.data$heart_data, train.data.predict): all arguments must have the same length
Traceback:

  1. table(train.data$heart_data, train.data.predict)
  2. stop("all arguments must have the same length")

运行代码

set.seed(6522048)
library(randomForest)
model_rf1 <- randomForest(target ~ age+sex+cp+trestbps+chol+restecg+exang+ca, 
                          data = train.data, ntree = 2)
print("======================================================================================================================")
print('Confusion Matrix: TRAINING set based on random forest model built using 2 trees')
train.data.predict <- predict(model_rf1, train.data, type = "class")

conf.matrix <- table(train.data$heart_data, train.data.predict)[,c('YES','NO')]
rownames(conf.matrix) <- paste("Actual", rownames(conf.matrix), sep = ": ")
colnames(conf.matrix) <- paste("Prediction", colnames(conf.matrix), sep = ": ")

format(conf.matrix,justify="centre",digit=2)

print("=====================================================================================================================")
print('Confusion Matrix: TESTING set based on random forest model built using 2 trees')
test.data.predict <- predict(model_rf1, test.data, type = "class")

conf.matrix <- table(test.data$heart_data, test.data.predict)[,c('YES','NO')]
(conf.matrix) <- paste("Actual", rownames(conf.matrix), sep = ": ")
colnames(conf.matrix) <- paste("Prediction", colnames(conf.matrix), sep = ": ")

format(conf.matrix,justify="centre",digit=2)

错误原因与修复方案

核心问题

  1. 因变量名称不匹配:模型训练时用的因变量是target,但生成混淆矩阵时却调用了train.data$heart_data,二者要么不是同一变量,要么heart_data的长度和预测结果train.data.predict不匹配,导致table()函数报错。
  2. 语法错误:测试集部分的(conf.matrix) <- paste(...)多了一对括号,会将字符串直接赋值给conf.matrix,破坏后续矩阵操作逻辑。

修复步骤

  1. 统一因变量名称
    保持模型与混淆矩阵的因变量一致:

    • 如果模型中的因变量确实是target,修改混淆矩阵的table行:
      # 训练集
      conf.matrix <- table(train.data$target, train.data.predict)[,c('YES','NO')]
      # 测试集
      conf.matrix <- table(test.data$target, test.data.predict)[,c('YES','NO')]
      
    • 如果你的因变量实际是heart_data,则修改模型公式为heart_data ~ age+sex+cp+trestbps+chol+restecg+exang+ca。
  2. 修复测试集语法错误
    将测试集部分的(conf.matrix) <- paste(...)修正为rownames(conf.matrix) <- paste(...),与训练集逻辑保持一致:

    rownames(conf.matrix) <- paste("Actual", rownames(conf.matrix), sep = ": ")
    
  3. 可选:提前验证长度匹配
    可以在生成预测后添加验证代码,提前确认长度是否一致:

    # 训练集验证
    cat("训练集实际值长度:", length(train.data$target), "\n")
    cat("训练集预测值长度:", length(train.data.predict), "\n")
    # 测试集验证
    cat("测试集实际值长度:", length(test.data$target), "\n")
    cat("测试集预测值长度:", length(test.data.predict), "\n")
    

修复后的完整代码

set.seed(6522048)
library(randomForest)
# 注意:若因变量是heart_data,将此处的target替换为heart_data
model_rf1 <- randomForest(target ~ age+sex+cp+trestbps+chol+restecg+exang+ca, 
                          data = train.data, ntree = 2)
print("======================================================================================================================")
print('Confusion Matrix: TRAINING set based on random forest model built using 2 trees')
train.data.predict <- predict(model_rf1, train.data, type = "class")

conf.matrix <- table(train.data$target, train.data.predict)[,c('YES','NO')]
rownames(conf.matrix) <- paste("Actual", rownames(conf.matrix), sep = ": ")
colnames(conf.matrix) <- paste("Prediction", colnames(conf.matrix), sep = ": ")

# 打印格式化后的混淆矩阵
print(format(conf.matrix, justify="centre", digit=2))

print("=====================================================================================================================")
print('Confusion Matrix: TESTING set based on random forest model built using 2 trees')
test.data.predict <- predict(model_rf1, test.data, type = "class")

conf.matrix <- table(test.data$target, test.data.predict)[,c('YES','NO')]
rownames(conf.matrix) <- paste("Actual", rownames(conf.matrix), sep = ": ")
colnames(conf.matrix) <- paste("Prediction", colnames(conf.matrix), sep = ": ")

# 打印格式化后的混淆矩阵
print(format(conf.matrix, justify="centre", digit=2))

内容的提问来源于stack exchange,提问作者Jeff Routson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:16:01