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

