You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何基于不同数据集训练的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数据集的特性来看:

  1. 测试集仅包含year=75的样本,在整个数据集中占比极低,去掉这部分样本后,训练集的类别比例(low/medium/high的占比)和全数据集几乎无差异,因此两个模型的先验概率几乎一致。
  2. 训练集和全数据集的特征(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:07:38