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

使用R语言lm与predict函数时训练集和测试集预测结果一致问题

为啥你的线性回归预测结果完全一样?

嘿,我来拆解下你遇到的这个奇怪问题:明明用了不同的训练和测试数据,predict出来的结果居然完全相同,sum(abs(pred1-pred))等于0。

核心原因:你的数据完全独立无关联!

你生成的数据里,y是独立的正态随机数,x的每一列也都是独立的正态随机数——换句话说,y和所有特征完全没有相关性。当你用lm(y~x, xy)拟合模型时,模型会学到所有自变量的系数都趋近于0,只剩下一个接近y均值的截距项(而y的均值本身也接近0)。

这时候,不管你传入训练集的x.df还是测试集的test.x.df,预测值其实就是那个截距项(所有特征乘以0系数都消失了),结果自然完全一样。

你可以自己验证下,打印模型的系数看看:

coef(fit)

除了(Intercept)之外,所有xX1到xX100的系数都几乎是0,这就是问题的根源。

快速验证结论

精简代码跑一遍,就能直观看到结果:

set.seed(1)
x = matrix(rnorm(300*100),300,100)
y = rnorm(300)
fit = lm(y~x, data = data.frame(y, x))

# 查看前几个系数,几乎都是0
head(coef(fit))
# 查看预测值的统计量,所有值都集中在截距附近
summary(predict(fit, data.frame(x)))
summary(predict(fit, data.frame(matrix(rnorm(300*100),300,100))))

如何得到不同的预测结果?

要让预测值有差异,得让y和x之间存在真实的关联。比如手动构建一个带相关性的因变量:

set.seed(1)
x = matrix(rnorm(300*100),300,100)
# 让y和前5个特征线性相关,再加入噪声
y = 0.5*x[,1] + 0.3*x[,2] - 0.2*x[,3] + 0.1*x[,4] + 0.4*x[,5] + rnorm(300)
test.x = matrix(rnorm(300*100),300,100)

fit = lm(y~x, data = data.frame(y, x))
pred1 = predict(fit, data.frame(x))
pred = predict(fit, data.frame(test.x))

# 现在这个和就不会是0了
sum(abs(pred1-pred))

这时候模型会学到非零的系数,训练集和测试集的特征不同,预测结果自然也就不一样了。

内容的提问来源于stack exchange,提问作者naturlich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:07:50