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

Caret包调用gbm方法生成混淆矩阵报因子层级错误的解决方法

报错含义说明

data and reference should be factors with the same levels是混淆矩阵计算的标准报错,触发原因是传入的预测结果、真实参考标签两个参数,要么不属于因子类型,要么两者的分类水平(类别取值的名称、数量、排列顺序)无法完全匹配,不能正常统计分类对错的样本数。

问题根因拆解
  • predict()传参错误:newdata参数要求传入和训练集自变量结构完全一致的待预测数据集,你误传入head(test.data$Country)(即测试集因变量列的前6个值),仅得到6行预测结果,和测试集108个样本的真实标签长度完全不匹配
  • 预测输出类型错误:开启类别概率输出后,gbm模型的predict()方法默认返回三个类别的所属概率数据框,不是离散的分类标签,概率矩阵无法直接作为混淆矩阵的输入
  • 因子水平不统一:测试集因变量初始为整数类型,即使后续手动转为因子,如果没有和训练集因变量的因子水平保持完全一致,也会触发水平匹配失败
可直接运行的正确实现流程
# 加载依赖包
library(caret)

# 1. 建模前统一处理因变量因子,固定水平顺序,从源头避免水平不一致
# 假设原始数据集名为raw_data
raw_data$Country <- factor(
  raw_data$Country,
  levels = c("France", "Holland", "Spain")
)

# 2. 打乱数据集+7:3拆分训练测试集
set.seed(123) # 固定随机种子保证结果可复现
shuffled_data <- raw_data[sample(nrow(raw_data)), ]
train_idx <- createDataPartition(shuffled_data$Country, p = 0.7, list = FALSE)
train.data <- shuffled_data[train_idx, ]
test.data <- shuffled_data[-train_idx, ]

# 3. 配置训练控制参数
train_control <- trainControl(
  method = "repeatedcv",
  number = 10,
  repeats = 10,
  classProbs = TRUE,
  summaryFunction = multiClassSummary
)

# 4. 拟合gbm分类模型
set.seed(123)
gbm_model <- train(
  Country ~ .,
  data = train.data,
  method = "gbm",
  trControl = train_control,
  verbose = FALSE
)

# 5. 正确生成预测结果
# 注意:newdata传入完整测试集,type="raw"指定输出离散分类标签,而非概率
pred_class <- predict(
  gbm_model,
  newdata = test.data,
  type = "raw"
)
# 若需要输出类别概率可单独运行:pred_prob <- predict(gbm_model, newdata = test.data, type = "prob")

# 6. 对齐因子水平后生成混淆矩阵
pred_class <- factor(pred_class, levels = levels(test.data$Country))
confusionMatrix(
  data = pred_class,
  reference = test.data$Country
)

注意事项:混淆矩阵仅接受离散的分类因子结果作为输入,概率矩阵仅用于计算AUC、logLoss等概率类指标;newdata传入的数据集必须包含模型训练时用到的全部自变量列,行数要和待预测样本数完全一致,不能传入单列因变量或部分样本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:31:00