R语言随机森林模型混淆矩阵报错:data与reference因子水平不一致
葡萄酒质量随机森林预测混淆矩阵报错修复方案
问题根源
- 训练集拆分逻辑错误:红葡萄酒的训练集
trainRed误用了白葡萄酒的拆分索引,导致训练集混入白葡萄酒数据,模型学习目标混乱。 - 任务类型错误:
quality变量为数值型,randomForest默认执行回归任务,预测结果是连续数值,转成因子后每个数值都是独立水平,与测试集离散的质量等级(3-9)无法匹配,触发混淆矩阵报错。
修复后完整代码
# 加载所需包 library(tidyverse) library(caret) library(randomForest) # 读取葡萄酒数据集 wines <- read_csv("wine-quality.csv") # 重命名列 names(wines) <- c("type","fixed_acidity","volatile_acidity","citric_acid", "residual_sugar", "chlorides","free_sulfur_dioxide","total_sulfur_dioxide","density","pH", "sulphates", "alcohol","quality") # 转换类型变量为因子,将质量变量转为分类因子(指定固定水平) wines$type <- as.factor(wines$type) wines$quality <- factor(wines$quality, levels = c(3,4,5,6,7,8,9)) # 拆分红、白葡萄酒数据 red <- wines[wines$type == "red",] white <- wines[wines$type == "white",] # 设置随机种子确保可复现 set.seed(123) # 拆分红葡萄酒训练/测试集 trainIndex_red <- createDataPartition(red$quality, p = 0.8, list = FALSE) trainRed <- red[trainIndex_red, ] testRed <- red[-trainIndex_red, ] # 拆分白葡萄酒训练/测试集 trainIndex_white <- createDataPartition(white$quality, p = 0.8, list = FALSE) trainWhite <- white[trainIndex_white, ] testWhite <- white[-trainIndex_white, ] # 构建随机森林分类模型(因quality是因子,自动执行分类任务) rfModelRed <- randomForest(quality ~ ., data = trainRed, ntree = 500) rfModelWhite <- randomForest(quality ~ ., data = trainWhite, ntree = 500) # 生成预测结果(自动为同水平的因子类型) rfpredictionsred <- predict(rfModelRed, newdata = testRed) rfpredictionswhite <- predict(rfModelWhite, newdata = testWhite) # 计算RMSE(将因子转为数值适配计算) rfRedrmse <- RMSE(as.numeric(rfpredictionsred), as.numeric(testRed$quality)) rfWhitermse <- RMSE(as.numeric(rfpredictionswhite), as.numeric(testWhite$quality)) # 生成混淆矩阵(因子水平完全匹配) cmrfRed <- confusionMatrix(rfpredictionsred, testRed$quality) accuraccyrfRed <- cmrfRed$overall['Accuracy'] cmrfWhite <- confusionMatrix(rfpredictionswhite, testWhite$quality) accuraccyrfWhite <- cmrfWhite$overall['Accuracy'] # 查看结果 print(cmrfRed) print(accuraccyrfRed)
关键修改说明
- 修正训练集拆分:分别为红、白葡萄酒生成独立拆分索引,确保训练集仅包含对应类型数据。
- 强制分类任务:将
quality转为指定水平的因子,让randomForest自动执行分类,预测结果与测试集标签水平一致。 - 清理冗余代码:删除原代码中未使用的
red_wines/white_wines赋值语句,避免逻辑混乱。 - 适配RMSE计算:将因子转换为数值后计算误差,适配分类任务的评估需求。
内容的提问来源于stack exchange,提问作者CocaCola
相关产品推荐
相关产品推荐

