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

Adaboost模型混淆矩阵报错:data与reference需为同水平因子

问题解决:混淆矩阵生成报错处理

核心问题分析

你遇到的两个报错根源一致:错误传入了fastAdaboost预测结果的完整列表,而非提取其中的预测类别向量:

  • caret::confusionMatrix要求输入两个同水平的因子向量,但你传入的a是包含公式、投票、类别等的复合列表,并非单一预测类别向量
  • cvms::confusion_matrix的"长度必须相同"报错,也是因为传入了列表而非与目标变量长度匹配的类别向量

从你的str(a)输出可以明确:预测的类别值存储在a$class元素中,这才是需要传入混淆矩阵函数的正确对象。

修正后的代码

1. 使用caret::confusionMatrix的正确写法

library(caret)
library(fastAdaboost)

data <- read.csv('~/Desktop/test1.csv', sep = ";")
data1 <- subset(data,select=c(4,5,6,7,8,12,15,16))

set.seed(1234)
parts = createDataPartition(data1$Status.szkody, p = 0.7, list = F)
train = data1[parts, ]
test = data1[-parts, ]

# 提前将目标变量转为因子(建议在划分数据集前统一处理,避免后续问题)
train$Status.szkody <- as.factor(train$Status.szkody)

model <- adaboost(Status.szkody ~., data = train,6)

# 提取预测类别向量,而非整个列表
a <- predict(model, train, type = "class")$class

# 生成混淆矩阵
confusionMatrix(a, train$Status.szkody, mode = "everything")

2. 使用cvms::confusion_matrix的正确写法

library(cvms)
# 同样提取a$class作为预测值传入
confusion_matrix(targets = train$Status.szkody, predictions = predict(model, train, type = "class")$class)

额外建议

  • 建议在数据预处理阶段就将目标变量Status.szkody转为因子,而非训练后临时处理,避免因子水平不一致的潜在问题
  • 后续处理测试集时,同样需要提取predict(model, test, type = "class")$class作为测试集的预测类别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:24:25