求助一个线性回归模型预测的问题

2021-11-03 17:12:41 +08:00
 acone2003
Model 是一个训练好的线性回归模型,Features 是待预测的样本集,在调试的时候发现对全部样本进行预测和对部分样本进行预测,同样的样本预测值略有不同,为什么?怎么解决?
两个语句如下,同样的样本,前一百个样本的预测值会有所不同,并且越往后差别越大
Predict1 = Model.predict( Features )
Predict2 = Model.predict( Features[ 0:100, : ] )

环境:Win7 X64,anaconda 3.5.1
2830 次点击
所在节点    Python
19 条回复
czfy
2021-11-03 17:17:12 +08:00
这个是普通的线性回归,X 每个取值是独立的,还是类似时间序列 X 的值之间是相关的?
mmrindextt
2021-11-03 17:25:19 +08:00
进行模型调优
tqyq88
2021-11-03 17:51:03 +08:00
模型是基于什么数据集训练的?待预测的样本集是什么类型的数据?
如果是边界开放的数据集,什么模型也是没用的。
线性回归预测本来就只能解决边界封闭的数据的问题。
zhishiwanwan01
2021-11-03 18:59:30 +08:00
@tqyq88 请问什么是边界封闭的数据啊
albertni
2021-11-03 20:00:49 +08:00
时间序列模型的样本之间是相关的,改变样本集会影响单个样本的预测结果
jaredyam
2021-11-03 20:59:21 +08:00
所谓训练好的模型是说当前模型已经通过训练数据固定了超参数,你使用不同(多)的输入给模型,得到不同的输出,有什么问题么。即使股票市场规则写明了,不同人掌握的信息量不一样,做出的决策就有区别,不太清楚你想解决什么。
Xs0ul
2021-11-03 21:21:14 +08:00
挺怪的,不如直接说你用了什么模型,以及预测偏差有多大
ttys001
2021-11-04 01:15:12 +08:00
的确奇怪,正常的线性回归不会发生这种事儿~
建议说的更详细点。
LS 一堆连问题都没明白的就别说话了……
ipwx
2021-11-04 01:28:35 +08:00
Model 是什么模型。
----

盲猜其实 Model 不是“线性回归”,是深度回归模型。并且可能用了 Batch Normalization 这种会让训练样本之间产生关联的东西,并且忘了关掉 training 模式 hhh
uni
2021-11-04 08:56:17 +08:00
既然是线性回归模型,你可以把模型里面的参数全部打出来然后自己算一遍看看是怎么回事吧
txhwind
2021-11-04 10:09:10 +08:00
如果数值差异小于 1e-5 ,可能是数值计算实现的逻辑不同。
否则应该是用错了。
acone2003
2021-11-04 11:21:57 +08:00
统一回复楼上诸位,可能我没有描述清楚:Features 是有几千个样本的测试样本集,每个样本大约有 200 个特征,各样本都是独立的,Model 确实是已经训练好的线性回归模型。我用 Predict1 = Model.predict( Features )这条语句先预测这几千个样本,然后截取头 100 个查看一下预测结果。然后用 Predict2 = Model.predict( Features[ 0:100, : ] )这条语句先截取头 100 个样本,再预测这 100 个样本。按道理说两次的结果应是一样的。但事实是,头几个样本的预测值几乎是一模一样的,但后来就有差别了,并且差别越来越大,到第 100 个样本时以是百分之几的差别。我不知道为什么会是这样。
ladychili
2021-11-04 11:38:26 +08:00
「 Model 确实是已经训练好的线性回归模型」说明不了问题。
把你 Model 从定义到 fit 的代码发出来看看。
albertni
2021-11-04 12:21:29 +08:00
@acone2003 你这个偏差变大的结果符合时间序列模型的表现,前项预测的残差代入后项,模型参数合适的话残差可能逐渐变大。最好的 debug 办法就是把模型写出来,手算几个看看结果怎么样,否则都是悬丝诊脉。
acone2003
2021-11-04 15:51:21 +08:00
回 Albertni:谢谢你,我按照你的建议试一试。
回 ladychili:模型的定义和训练都是调用的 sklearn 中的标准函数,分别是:
Model = sklearn.linear_model.LinearRegression( n_jobs=CpuNum )#创建 Model ,CpuNum 是 Cpu 的线程数
Model.fit( TrainFeatures, TrainYValues )#训练模型,两个参数分别是训练集的特征和真实值
Predict1 = Model.predict( Features )#此两句是利用训练好的模型进行预测
Predict2 = Model.predict( Features[ 0:100, : ] )
yuruizhe
2021-11-04 19:37:08 +08:00
Model.predict( Features[ 0:1, : ] )
Model.predict( Features[ 1:2, : ] )
Model.predict( Features[ 2:3, : ] )
Model.predict( Features[ 3:4, : ] )
Model.predict( Features[ 5:6, : ] )
Model.predict( Features[ 6:7, : ] )
Model.predict( Features[ 7:8, : ] )
Model.predict( Features[ 8:9, : ] )
这九个结果与
Model.predict( Features[ 0:9, : ] )
一样吗?
tomcat65535
2021-11-09 10:55:06 +08:00
如果是线性回归,你不妨直接把训练好的 weights 取出来,自己乘一下你的 features
VIVVACI
2021-11-10 16:53:09 +08:00
我无法复现你的问题,建议把全部的代码和输出发上来
中间输出
print(f"train_x shape is : {train_x.shape}")
VIVVACI
2021-11-10 16:54:35 +08:00
@VIVVACI 结尾时输出 Predict1[:100] - Predict2

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812790

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX