R语言中wine数据集LDA建模与预测操作报错如何解决
常见报错原因
运行报错基本由以下问题导致:
MASS包本身不包含wine数据集,未提前加载gclus包就运行data(wine)会提示找不到对象,甚至加载到其他包中的同名异义数据集- LDA函数要求分组变量必须为因子类型,原始wine数据集中
Class是整数型编码,直接传入会触发模型拟合错误 - 拆分数据集时未对齐训练集、测试集的建模字段,调用
predict()时会出现变量不匹配报错 - 将
install.packages()放在常规运行脚本中重复执行,容易因镜像、权限问题中断流程
可直接运行的修正代码
1. 包加载与数据预处理
首次运行前先取消安装命令的注释,后续运行直接注释掉安装语句即可,避免重复安装:
# 首次运行执行安装 # install.packages("gclus") # install.packages("car") library(MASS) library(gclus) # 明确指定从gclus包加载wine数据集,避免数据集冲突 data(wine, package = "gclus") # 将分类标签转为因子格式,是LDA建模的必要步骤 wine$Class <- as.factor(wine$Class)
2. 按7:3比例拆分训练集与测试集
固定随机种子保证结果可复现:
set.seed(123) train_index <- sample(1:nrow(wine), size = 0.7 * nrow(wine)) train_set <- wine[train_index, ] test_set <- wine[-train_index, ]
3. 第一个子集LDA建模与预测
对应字段为Class, Malic, Hue, Magnesium:
# 提取建模字段 sub1_col <- c("Class", "Malic", "Hue", "Magnesium") train_sub1 <- train_set[sub1_col] test_sub1 <- test_set[sub1_col] # 拟合LDA模型 lda_fit1 <- lda(Class ~ ., data = train_sub1) # 测试集预测 pred_result1 <- predict(lda_fit1, newdata = test_sub1) # 输出混淆矩阵对比真实值与预测值 confusion1 <- table(真实标签 = test_sub1$Class, 预测标签 = pred_result1$class) print(confusion1) # 输出测试集准确率 acc1 <- sum(diag(confusion1)) / sum(confusion1) cat("第一个子集测试集准确率:", round(acc1*100, 2), "%\n")
4. 第二个子集LDA建模与预测
对应字段为Class, Hue, Alcalinity, Phenols, Malic, Magnesium, Intensity, Nonflavanoid, Flavanoids:
sub2_col <- c("Class","Hue", "Alcalinity", "Phenols", "Malic", "Magnesium", "Intensity", "Nonflavanoid","Flavanoids") train_sub2 <- train_set[sub2_col] test_sub2 <- test_set[sub2_col] lda_fit2 <- lda(Class ~ ., data = train_sub2) pred_result2 <- predict(lda_fit2, newdata = test_sub2) confusion2 <- table(真实标签 = test_sub2$Class, 预测标签 = pred_result2$class) print(confusion2) acc2 <- sum(diag(confusion2)) / sum(confusion2) cat("第二个子集测试集准确率:", round(acc2*100, 2), "%\n")
补充说明
- 如果运行时提示列名不存在,先执行
colnames(wine)查看当前加载数据集的实际列名,修正拼写错误即可 - 如果需要避免训练/测试集类别分布偏移,可以做分层抽样,保证两个集合的各类别占比和原数据集一致
- LDA函数内部会自动处理变量尺度差异,不需要提前对特征做标准化处理
内容的提问来源于stack exchange,提问作者nils
相关产品推荐
相关产品推荐

