使用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
相关产品推荐
相关产品推荐

