R语言gclus包wine数据集拆分后如何对指定子集执行LDA分析
R中对wine数据集指定子集执行线性判别分析(LDA)操作指南
R生态中线性判别分析最成熟的实现是MASS包内置的lda()函数,在你已经完成7:3训练测试集拆分的基础上,按以下步骤操作即可得到结果。
前置准备
首先完成依赖加载和数据格式修正,请将以下代码插入到你原有数据集拆分代码的最前面,避免分类标签识别错误:
# 加载LDA所需的MASS包,若首次运行报错请先执行 install.packages("MASS") library(MASS) data("wine") # 将分类标签Class转为因子类型,避免模型将其识别为连续变量 wine$Class <- as.factor(wine$Class) # 以下是你原有的数据集拆分代码,放在类型转换之后即可 sample_size <- floor(0.70 * nrow(wine)) set.seed(123) train_index <- sample(seq_len(nrow(wine)), size = sample_size) train <- wine[train_index, ] test <- wine[-train_index, ]
第一个子集(Class、Ash、OD280、Nonflavanoid)建模
该子集共包含3个预测变量,对应双判别轴(因葡萄酒共3个类别),操作代码如下:
# 筛选当前子集需要的变量 vars_set1 <- c("Class", "Ash", "OD280", "Nonflavanoid") train_set1 <- train[, vars_set1] test_set1 <- test[, vars_set1] # 仅使用训练集拟合LDA模型 lda_fit1 <- lda(Class ~ ., data = train_set1) # 输出模型核心结果:组先验概率、组均值、线性判别系数 print(lda_fit1) # 在测试集上做预测,输出混淆矩阵计算准确率 pred_res1 <- predict(lda_fit1, newdata = test_set1) confusion_mat1 <- table(真实标签 = test_set1$Class, 预测标签 = pred_res1$class) print(confusion_mat1) acc1 <- sum(diag(confusion_mat1)) / sum(confusion_mat1) cat("子集1测试集分类准确率:", sprintf("%.2f%%", acc1*100), "\n")
第二个子集(Class、Hue、Magnesium、Flavanoids、Alcohol、Malic、Intensity、Alcalinity、Proline)建模
该子集共包含8个预测变量,建模逻辑与第一个子集完全一致,替换变量列表即可:
# 筛选当前子集需要的变量 vars_set2 <- c("Class", "Hue", "Magnesium", "Flavanoids", "Alcohol", "Malic", "Intensity", "Alcalinity", "Proline") train_set2 <- train[, vars_set2] test_set2 <- test[, vars_set2] # 拟合LDA模型 lda_fit2 <- lda(Class ~ ., data = train_set2) print(lda_fit2) # 测试集预测与效果评估 pred_res2 <- predict(lda_fit2, newdata = test_set2) confusion_mat2 <- table(真实标签 = test_set2$Class, 预测标签 = pred_res2$class) print(confusion_mat2) acc2 <- sum(diag(confusion_mat2)) / sum(confusion_mat2) cat("子集2测试集分类准确率:", sprintf("%.2f%%", acc2*100), "\n")
补充说明
- 建模全程仅使用训练集数据拟合参数,测试集数据完全不参与训练过程,避免数据泄露导致准确率估计虚高
- 标准LDA假设各组样本服从多元正态分布、组间协方差矩阵齐性,若数据不满足该假设,可替换为
MASS包中的qda()函数执行二次判别分析 - 若需要绘制LDA判别投影图,可直接提取预测结果中的
x元素,即每个样本在判别轴上的投影坐标
内容的提问来源于stack exchange,提问作者SarahB
相关产品推荐
相关产品推荐

