为何基于不同数据集训练的LDA模型测试结果完全一致?
问题
我使用以下代码处理Auto数据集:
library(ISLR2) df = Auto df$mclass <- as.factor(ifelse(df$mpg <20, 'low', ifelse(df$mpg >= 20 & df$mpg < 27, 'medium', 'high')))
我将数据集划分为测试集和训练集:
test = df[df$year == 75,] test.direction = test$mclass training = df[df$year != 75,] training.direction = training$mclass
首先,我基于全数据集训练LDA模型:
lda1 = lda(mclass ~ acceleration + displacement + horsepower + weight, df)
并在测试集上进行预测:
table (predict(lda1,test)$class, test.direction)
随后,我仅基于训练集重新训练LDA模型:
lda2 = lda(mclass ~ acceleration + displacement + horsepower + weight, data = training)
并再次在测试集上进行预测:
table (predict(lda2,test)$class,test.direction)
尽管两次训练使用的数据集不同,但两次预测的混淆矩阵和测试误差完全一致,这与我的预期不符,请问原因是什么?
解答
出现这种情况的核心原因是:用全数据集训练的LDA模型和用训练集(year≠75)训练的LDA模型,其核心参数几乎完全一致,导致判别边界重合,最终在测试集上的分类结果完全相同。
LDA的分类逻辑依赖三个关键要素:
- 类别先验概率:默认基于训练数据中各类别的占比计算
- 类别均值向量:每个类别下特征变量的均值
- 共享协方差矩阵:所有类别共享的特征协方差结构
结合Auto数据集的特性来看:
- 测试集仅包含
year=75的样本,在整个数据集中占比极低,去掉这部分样本后,训练集的类别比例(low/medium/high的占比)和全数据集几乎无差异,因此两个模型的先验概率几乎一致。 - 训练集和全数据集的特征(
acceleration/displacement/horsepower/weight)在各类别下的均值、整体协方差矩阵也几乎没有差异——少量样本的移除不会显著改变这些统计特征。
你可以通过输出并对比两个模型的参数来验证这一点:
# 对比两类模型的类别均值 lda1$means lda2$means # 对比先验概率 lda1$prior lda2$prior # 提取并对比协方差矩阵 lda1_cov <- lda1$scaling %*% diag(lda1$svd) %*% t(lda1$scaling) lda2_cov <- lda2$scaling %*% diag(lda2$svd) %*% t(lda2$scaling) round(lda1_cov - lda2_cov, 5)
会发现这些参数的差异极小,甚至可以忽略不计,因此两个模型对测试集样本的判别结果完全一致。
内容的提问来源于stack exchange,提问作者user4891693
相关产品推荐
相关产品推荐

