V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
acone2003
V2EX  ›  Python

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

  •  
  •   acone2003 · 2021-11-03 17:12:41 +08:00 · 2800 次点击
    这是一个创建于 1116 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Model 是一个训练好的线性回归模型,Features 是待预测的样本集,在调试的时候发现对全部样本进行预测和对部分样本进行预测,同样的样本预测值略有不同,为什么?怎么解决?
    两个语句如下,同样的样本,前一百个样本的预测值会有所不同,并且越往后差别越大
    Predict1 = Model.predict( Features )
    Predict2 = Model.predict( Features[ 0:100, : ] )

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

    盲猜其实 Model 不是“线性回归”,是深度回归模型。并且可能用了 Batch Normalization 这种会让训练样本之间产生关联的东西,并且忘了关掉 training 模式 hhh
    uni
        10
    uni  
       2021-11-04 08:56:17 +08:00
    既然是线性回归模型,你可以把模型里面的参数全部打出来然后自己算一遍看看是怎么回事吧
    txhwind
        11
    txhwind  
       2021-11-04 10:09:10 +08:00
    如果数值差异小于 1e-5 ,可能是数值计算实现的逻辑不同。
    否则应该是用错了。
    acone2003
        12
    acone2003  
    OP
       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
        13
    ladychili  
       2021-11-04 11:38:26 +08:00
    「 Model 确实是已经训练好的线性回归模型」说明不了问题。
    把你 Model 从定义到 fit 的代码发出来看看。
    albertni
        14
    albertni  
       2021-11-04 12:21:29 +08:00 via Android
    @acone2003 你这个偏差变大的结果符合时间序列模型的表现,前项预测的残差代入后项,模型参数合适的话残差可能逐渐变大。最好的 debug 办法就是把模型写出来,手算几个看看结果怎么样,否则都是悬丝诊脉。
    acone2003
        15
    acone2003  
    OP
       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
        16
    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
        17
    tomcat65535  
       2021-11-09 10:55:06 +08:00
    如果是线性回归,你不妨直接把训练好的 weights 取出来,自己乘一下你的 features
    VIVVACI
        18
    VIVVACI  
       2021-11-10 16:53:09 +08:00
    我无法复现你的问题,建议把全部的代码和输出发上来
    中间输出
    print(f"train_x shape is : {train_x.shape}")
    VIVVACI
        19
    VIVVACI  
       2021-11-10 16:54:35 +08:00
    @VIVVACI 结尾时输出 Predict1[:100] - Predict2
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2461 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:28 · PVG 10:28 · LAX 18:28 · JFK 21:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.