审稿人:要警惕打着机器学习的名义“造”论文,特别是判别分析(LDA)

文摘   2024-12-31 09:02   荷兰  

前言

判别分析(Discriminant Analysis)是一种经典的分类方法,旨在根据已有样本的分类信息,建立预测分类的模型。其核心是找到变量的线性组合,使得类别间的差异最大化。

其中,线性判别分析(Linear Discriminant Analysis, LDA)是最常见的判别分析方法。LDA假设类别之间具有相同的协方差矩阵,通过寻找最佳分离超平面进行分类。常用于生物学(如基因表达数据分类)、社会科学(如问卷调查数据分析)和金融领域(如信用风险评估)。很多审稿人喜欢看到有创意,比较高级的数据分析,不喜欢传统的判别分析,这方面我保留不同的观点。我相信对于90%的硕博士来说,能够数量掌握经典的数据分析方法,才是优秀的科研潜力的体现。

在今天的教程中,我们将使用 R 和经典的 iris 数据集,完整演示 LDA 的使用流程,包括数据准备、模型训练、结果分析和可视化。

1. 数据准备

# 加载必要的包
library(MASS)
library(ggplot2)
library(caret)

# 加载 iris 数据集
data(iris)

# 确保分类变量是因子
iris$Species <- as.factor(iris$Species)

# 划分训练集和测试集
set.seed(123)
train_index <- createDataPartition(iris$Species, p = 0.7, list = FALSE)
train_data <- iris[train_index, ]
test_data <- iris[-train_index, ]

2. 线性判别分析(LDA)

# 执行线性判别分析
lda_model <- lda(Species ~ ., data = train_data)

# 查看模型结果
print(lda_model)

## Call:
## lda(Species ~ ., data = train_data)
##
## Prior probabilities of groups:
## setosa versicolor virginica
## 0.3333333 0.3333333 0.3333333
##
## Group means:
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## setosa 4.991429 3.365714 1.471429 0.2314286
## versicolor 5.942857 2.777143 4.262857 1.3285714
## virginica 6.631429 2.982857 5.591429 2.0342857
##
## Coefficients of linear discriminants:
## LD1 LD2
## Sepal.Length 0.8603517 -0.02531284
## Sepal.Width 1.3884435 -2.37490707
## Petal.Length -2.2730220 0.89795664
## Petal.Width -2.9135037 -2.68733735
##
## Proportion of trace:
## LD1 LD2
## 0.992 0.008

3. 模型预测和性能评估

# 在测试集上预测
predictions <- predict(lda_model, test_data)

# 混淆矩阵评估性能
confusion_matrix <- confusionMatrix(predictions$class, test_data$Species)
print(confusion_matrix)

## Confusion Matrix and Statistics
##
## Reference
## Prediction setosa versicolor virginica
## setosa 15 0 0
## versicolor 0 15 1
## virginica 0 0 14
##
## Overall Statistics
##
## Accuracy : 0.9778
## 95% CI : (0.8823, 0.9994)
## No Information Rate : 0.3333
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.9667
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: setosa Class: versicolor Class: virginica
## Sensitivity 1.0000 1.0000 0.9333
## Specificity 1.0000 0.9667 1.0000
## Pos Pred Value 1.0000 0.9375 1.0000
## Neg Pred Value 1.0000 1.0000 0.9677
## Prevalence 0.3333 0.3333 0.3333
## Detection Rate 0.3333 0.3333 0.3111
## Detection Prevalence 0.3333 0.3556 0.3111
## Balanced Accuracy 1.0000 0.9833 0.9667

4. 判别结果可视化

# 可视化

lda_data <- data.frame(
LD1 = predictions$x[,1],
LD2 = predictions$x[,2],
Species = test_data$Species
)

ggplot(lda_data, aes(x = LD1, y = LD2, color = Species, shape = Species)) +
geom_point(size = 4, alpha = 0.8) +
stat_ellipse(level = 0.95, aes(fill = Species), alpha = 0.2, geom = "polygon") +
scale_color_manual(values = c("#E41A1C", "#377EB8", "#4DAF4A")) +
scale_fill_manual(values = c("#E41A1C", "#377EB8", "#4DAF4A")) +
labs(title = "LDA Visualization: Iris Dataset",
subtitle = "Projection onto the First Two Linear Discriminants",
x = "Linear Discriminant 1 (LD1)",
y = "Linear Discriminant 2 (LD2)") +
theme_minimal(base_size = 16) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
legend.position = "top",
legend.title = element_blank()
)

5. 模型优化

如果有必要,可以使用交叉验证进一步优化模型性能。

# 使用交叉验证优化模型
set.seed(123)
lda_tuned <- train(
Species ~ ., data = train_data,
method = "lda",
trControl = trainControl(method = "cv", number = 10)
)

# 打印优化结果
print(lda_tuned)

## Linear Discriminant Analysis
##
## 105 samples
## 4 predictor
## 3 classes: 'setosa', 'versicolor', 'virginica'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 94, 94, 94, 94, 93, 96, ...
## Resampling results:
##
## Accuracy Kappa
## 0.9825758 0.9735759

小结

简单的说,判别模型的基本套路包含三个步骤:数据准备和分割;模型训练和预测;可视化与性能评估。判别分析的基本套路非常简单,关键在于数据的准备和后续模型的改进。后续我们将持续更新和其他经典机器学习方法,帮助你应对复杂数据分析任务。如果你有任何疑问或特定需求,请随时联系!
感谢关注,你的支持是我不懈的动力!

科研代码
专注R和Python的数据分析。
 最新文章