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
相关产品推荐
相关产品推荐

