FateMurphy / CEEMDAN_LSTM

CEEMDAN_LSTM is a Python project for decomposition-integration forecasting models based on EMD methods and LSTM.
MIT License
205 stars 42 forks source link

关于integrate()中inte_form设置的一些疑问? #3

Closed Hezhexi2002 closed 1 year ago

Hezhexi2002 commented 1 year ago

@FateMurphy 大佬,你好,我是一名大二本科生,正在准备今年数学建模国赛,然后学校给我们发了几道练习题,我们选了其中c题,其实也是今年华中杯b题: C题数字经济问题.docx 然后我们现在在做2,3问的时候发现单独用LSTM预测效果不太好,所以想试着用VMD或者EMD先将原始序列进行分解之后再预测,所以找到了您这个repo,然后我其实改动了一点部分,就是读csv那里,因为我的时间格式是2021/7/14 9:35:00这种,所以我还稍微改了改CEEMDAN_LSTM.py,但是当我后面继续运行cl.run_example()后回报这样的错: image 我看了一下因为我的原始序列分解后有13个IMFs,所以按照默认inte_form=233来integrate就会有问题,我试着把CEEMDAN_LSTM.py中integrate那里改成这样: image 但是运行还是有那个错,所以想请教一下大佬,另外同时也想问一下大佬这个repo里的LSTM能够实现多变量预测单变量吗,因为我的数据集中除了要预测的成交量之外还有其他提取出来的相关指标,这是我的数据集: new.zip 之前我是找了一份能够实现多变量预测单变量的LSTM代码,我可以参照着这个改,但是主要是用多变量可能就得把每个变量都得进行分解,然后最终把所有变量分解之后的模态integrate在一起吗,希望大佬能够指点指点!

Hezhexi2002 commented 1 year ago

@FateMurphy 大佬,你好,我是一名大二本科生,正在准备今年数学建模国赛,然后学校给我们发了几道练习题,我们选了其中c题,其实也是今年华中杯b题: C题数字经济问题.docx 然后我们现在在做2,3问的时候发现单独用LSTM预测效果不太好,所以想试着用VMD或者EMD先将原始序列进行分解之后再预测,所以找到了您这个repo,然后我其实改动了一点部分,就是读csv那里,因为我的时间格式是2021/7/14 9:35:00这种,所以我还稍微改了改CEEMDAN_LSTM.py,但是当我后面继续运行cl.run_example()后回报这样的错: image 我看了一下因为我的原始序列分解后有13个IMFs,所以按照默认inte_form=233来integrate就会有问题,我试着把CEEMDAN_LSTM.py中integrate那里改成这样: image 但是运行还是有那个错,所以想请教一下大佬,另外同时也想问一下大佬这个repo里的LSTM能够实现多变量预测单变量吗,因为我的数据集中除了要预测的成交量之外还有其他提取出来的相关指标,这是我的数据集: new.zip 之前我是找了一份能够实现多变量预测单变量的LSTM代码,我可以参照着这个改,但是主要是用多变量可能就得把每个变量都得进行分解,然后最终把所有变量分解之后的模态integrate在一起吗,希望大佬能够指点指点!

大佬,不好意思,我后来发现这个inte_form可以你自己给,主要是我一开始直接运行的cl.run_example()这个函数,所以默认是233然后我分解的IMF有13个就会报错,我后来按照sample entropy的结果给了346的分组: image 然后我使用Single_LSTM()先简单看了看预测效果,确实很不错: image 相较于我之前使用多个变量预测成交量的结果还好一点,尤其是峰值部分: image 但是有个问题,就是最后evaluate的时候算的RMSE那些指标都很大,而且r2还是负数,我之前用多变量预测的那个模型也是这样,我当时问过另一个大佬,他说可能是因为我预测的成交量的实际值很大,而且我预测的未来912个数据,所以导致在计算RMSE的时候会出现这种情况,他建议我使用其他metrics去评估模型,但是我使用r2算出来还是负数,所以我也搞不明白究竟是为什么,另外我想问一下大佬就是Single_LSTM()这个函数相当于是使用原始未分解的序列训练然后预测吗,以及后面的Ensemble_LSTM(),Respective_LSTM()以及Hybrid_LSTM()都有什么不一样呢,我看注释好像Respective_LSTM()是对integrate之后的co-IMFs分别单独进行预测,Ensemble_LSTM()是把所有IMFs的预测融合起来,不过Hybrid_LSTM()确实不太清楚,希望大佬解惑!:-)

FateMurphy commented 1 year ago

非常感谢你的来信,有什么问题都可以问我。

值得注意: 1、请注意模型是否符合你问题的要求,模型目前假定当日指数与前30天的有关,也就是说在预测时是会使用部分测试集数据来预测下一个点的数据(部分比赛你是无法得到测试集数据的,这时候建议使用滚动预测或者LightGBM算法参赛)。例如在预测2022年1月28日00:00的指数时,本模型是会使用到2022年1月27日23:55以及之前29个时间点的数据来预测的(这些数据点不用于训练)。 2、还需要注意你所应用的是高频预测,在跑模型的时间上是否有要求?CEEMDAN+LSTM用于预测的时间是远大于5分钟的。 3、因为问的人太多,最近我新建了一个repo,CEEMDAN-VMD-GRU,这里面代码比较简洁,适合你短时间理解。 4、VMD这个包目前存在一定个问题(不是我写的,所以我也改不了),无法分解奇数个数的数据序列,最简单粗暴的解决办法就是删掉一个数据点,让训练序列变成偶数个即可。

回答问题: 1、原问题:运行cl.run_example()报错ValueError ——回答:大多数错误我都有英文提示,可以看看代码报错发了什么。关于inte_form,在新的CEEMDAN-VMD-GRU这里是直接用K-Means聚合的,节省操作。在原来这个repo里,可以根据sample entropy自主选定合并方式,方便测试。 2、原问题:但是有个问题,就是最后evaluate的时候算的RMSE那些指标都很大,而且r2还是负数。 ——回答:比较常用的比赛指标是MAPE类的指标。RMSE、MAE会跟数据的范围有很大关关系,归一化和原始数据计算出来的完全不一样,我一般会把数据归一化之后再比较。R2和MAPE基本上可以直接看(如果预测出来有负数,也会导致一定变化)。如果R2是负数,只能说明预测效果很差,需要调参,换模型,确认训练集输入是否正确等。 3、原问题:这个repo里的LSTM能够实现多变量预测单变量吗? ——回答:不能,如果想加也是建议改动另一个repo,在最后拟合fitting的时候加上,不要用相加adding的方法。如果把每个变量都进行分解,我建议直接使用Ensemble_LSTM()去预测。(Github有流程图,你可以去看看)

Regards, FEITE ZHOU jupiterzhou@foxmail.com

Hezhexi2002 commented 1 year ago

非常感谢你的来信,有什么问题都可以问我。

值得注意: 1、请注意模型是否符合你问题的要求,模型目前假定当日指数与前30天的有关,也就是说在预测时是会使用部分测试集数据来预测下一个点的数据(部分比赛你是无法得到测试集数据的,这时候建议使用滚动预测或者LightGBM算法参赛)。例如在预测2022年1月28日00:00的指数时,本模型是会使用到2022年1月27日23:55以及之前29个时间点的数据来预测的(这些数据点不用于训练)。 2、还需要注意你所应用的是高频预测,在跑模型的时间上是否有要求?CEEMDAN+LSTM用于预测的时间是远大于5分钟的。 3、因为问的人太多,最近我新建了一个repo,CEEMDAN-VMD-GRU,这里面代码比较简洁,适合你短时间理解。 4、VMD这个包目前存在一定个问题(不是我写的,所以我也改不了),无法分解奇数个数的数据序列,最简单粗暴的解决办法就是删掉一个数据点,让训练序列变成偶数个即可。

回答问题: 1、原问题:运行cl.run_example()报错ValueError ——回答:大多数错误我都有英文提示,可以看看代码报错发了什么。关于inte_form,在新的CEEMDAN-VMD-GRU这里是直接用K-Means聚合的,节省操作。在原来这个repo里,可以根据sample entropy自主选定合并方式,方便测试。 2、原问题:但是有个问题,就是最后evaluate的时候算的RMSE那些指标都很大,而且r2还是负数。 ——回答:比较常用的比赛指标是MAPE类的指标。RMSE、MAE会跟数据的范围有很大关关系,归一化和原始数据计算出来的完全不一样,我一般会把数据归一化之后再比较。R2和MAPE基本上可以直接看(如果预测出来有负数,也会导致一定变化)。如果R2是负数,只能说明预测效果很差,需要调参,换模型,确认训练集输入是否正确等。 3、原问题:这个repo里的LSTM能够实现多变量预测单变量吗? ——回答:不能,如果想加也是建议改动另一个repo,在最后拟合fitting的时候加上,不要用相加adding的方法。如果把每个变量都进行分解,我建议直接使用Ensemble_LSTM()去预测。(Github有流程图,你可以去看看)

Regards, FEITE ZHOU jupiterzhou@foxmail.com

好的,谢谢大佬亲自回复,确实不好意思,因为比较急,所以问的比较混乱: 1、针对您的第一个回答,我后来看了代码注释后对于后面的一些函数还是比较清楚了,昨晚去了解了sample entropy的相关理论之后我就推测可以根据这个来选择IMFs的合并方式,我的sample entropy结果如下图: image 可以看到前三个IMFs在不同的m,r设置下数值都相差不大,同样中间4个IMFs和最后6个IMFs也是如此,所以我在后面intergrate的时候采用了346这个form,同时对于大佬您所说的模型目前假定当日指数与前30天的有关,其实这个参数我在训练时根据我的数据集做了相应修改,因为我的原始序列一天从早上9:35到11:30,下午13:05到15:00每隔5分钟总共48个数据,两次峰值之间的间隔也就是48,所以我改成了48,然后因为我要预测1月24号到28号未来912个数据,所以我将PERIODS设置为了912,我昨晚和今天分别尝试了代码中的Single_LSTM(),Ensemble_LSTM(),Respective_LSTM()来训练预测,效果都还不错,下面是我用,Respective_LSTM()预测的截图,只训练了100个epochs: LZ6{CJAE~SNKF9C3CL5$W1W 另外就是关于您所提到的滚动预测的问题,其实我之前用的多变量LSTM就使用了滑窗来滚动预测,就是将预测得到的值重新加入到窗口中继续预测下一个点,我当时使用这种方法预测得到的结果如下图: image 当时总共使用了和成交量相关性比较大的两个指标来预测 2、针对您的第二个回答,正如1中截图所示,无论是我之前使用多变量LSTM滑动窗口滚动预测还是您的代码,最终的评估模型计算r2,RMSE等指标时都非常奇怪,使用您的代码计算的r2还算是正常的,但是在scale之后计算得到的RMSE,MAE等还是很大: image 这张图是我用Respective_LSTM()分别对每个Co-IMFs预测得到的结果,可以看到在scale之后计算得到的RMSE,MAE等指标变得非常大,但是后面当我将预测结果和实际值先归一化之后再计算得到的结果似乎又变得挺正常了,结果如下: image 但是MAPE还是感觉有点大,我之前也请教过另一个大佬,他说可能就是因为我的数据范围太大了导致的,事实上我要预测的成交量的量级确实比较大,峰值甚至有11位数,然后我也再想是否正是因为模型在原序列峰值处拟合的不好导致最终计算的这些评估指标很奇怪,不过其实我之所以使用您的代码也是因为想改进在峰值处的预测效果,确实比之前好很多,但是计算的指标仍然没有改善也让我实在想不通 3、对于大佬您的最后一个回答,其实我现在应该不会直接使用多变量去预测了,因为之前已经尝试过效果也只是差强人意,主要是由于我们提取的与成交量相关的指标实际上和成交量的趋势相差很多,我们之前已经尝试过将所有变量原始序列分解为季节性分量,趋势性分量还有残差,结果最终得到的结果是只有和成交量相似度最高的竟然是同为数字经济板块指数的成交额,然后后来我们指导老师建议我们将提取出来的相关指标来用于修正只用成交量预测的结果,所以我现在也是打算这样做,使用您的代码将成交量原始序列分解为多个IMFs单独预测最后再将结果相加得到预测结果Vlstm,之后直接用成交量和其他指标的实际数据拟合出一个关系式得到成交量y1,然后将两者加权相加得到最终预测结果C1,权重使用粒子群或者蝙蝠算法等智能算法来寻找Vlstm和y1组合的最优权重,目标函数就是C1和实际值的RMSE,但是目前尝试使用matlab直接多元线性回归得到成交量与其他指标的关系式有点问题,现在正还是打算直接把用和成交量相关的其他指标直接使用之前的多变量LSTM进行预测得到预测结果Vlstm‘,然后再与Vlstm加权相加,但是现在还没尝试,所以也不知道效果如何 总而言之,目前我的主要问题还是模型评估时计算得到的r2,RMSE有些异常,所以还是主要想请教一下您这个问题真的是因为我的预测结果和实际值在峰值处相差较大还是其他原因

FateMurphy commented 1 year ago

因为你数据的范围很大,所以RMSE、MAE这么大是很正常的,和你的预测效果无关,可以只看归一化之后的RMSE,MAE,实际优化就看R2、MAPE就行。MAPE偏大说明还需要继续优化,你的序列经常有暴增,预测效果不好也是正常的。可以观察分解后的序列走势,3个co-imfs可能无法满足你的要求,另外epochs提升到1000也能提高预测效果(1000对于趋势项容易过拟合)。

Hezhexi2002 commented 1 year ago

因为你数据的范围很大,所以RMSE、MAE这么大是很正常的,和你的预测效果无关,可以只看归一化之后的RMSE,MAE,实际优化就看R2、MAPE就行。MAPE偏大说明还需要继续优化,你的序列经常有暴增,预测效果不好也是正常的。可以观察分解后的序列走势,3个co-imfs可能无法满足你的要求,另外epochs提升到1000也能提高预测效果(1000对于趋势项容易过拟合)。

好的,大佬这么快回复真的让我受宠若惊,我之后会尝试重新选取更多的一些co-imfs再试试,另外我还想问一下就是为什么r2和MAPE不受归一化的影响,而RMSE和MAE就会受到归一化的影响呢,然后我之前使用多变量LSTM预测的结果: image 其实拟合的还是很不错,为什么r2算出来又是负数,这真的让我有点百思不得其解,希望大佬能进一步讲一讲,还有就是关于我提到的第3点,就是我也想问一下大佬您就是如何用上提取出的这些和成交量相关的指标来进一步优化预测效果呢,因为直接加进LSTM多变量预测确实效果不是很好,因为这些指标和成交量虽然有相关性,但是可视化后其实它们的趋势和成交量差了很多,因为这几个指标时间戳是按天的,然后当时我们为了对齐数据,就把这些指标一天从早上9:35到11:30,下午13:05到15:00每隔5分钟的数据都取的那天的值,所以这些序列放大后实际是呈阶梯状的,所以我现在也在思考如何将这些指标用来矫正单独使用成交量预测的结果,也想问问大佬您有什么看法?

Hezhexi2002 commented 1 year ago

大佬,我按照您说的重新将我分解的imfs组合了一次,下面是我分解的imfs: image 可以看到总共有12个imfs,然后这次我按照4224的form组合得到了4个co-imfs,使用Ensemble_LSTM()同样训练100个epochs结果r2和MAPE最后竟然反而降低了: image 所以我觉得可能确实自己人为去划分这个form很难找到最优组合,我想试着把您说的另外一个仓库中使用k-means根据sample entropy自动聚合得到最优form,不过我也想着增加epochs训练试试,主要是因为我在本地训练,配置是i7-10750H+RTX 2060 Max-P还行,主要是我看您代码里用的LSTM layer不是cudnn优化过的那个,1000个epochs估计得等好一会儿,不过我准备先改成500试试,看看有没有改善

FateMurphy commented 1 year ago

1、r2算出来是负数以及为什么RMSE、MAE这么大的原因你去看一下数学公式就理解了,r2和MAPE有除以一个数据范围。 2、安装tensorflow-gpu和CUDA即可加速运行,详细操作可以百度。 3、这个分解结果调整inte_form的意义不大,继续使用之前的就行,需要关注的是各子序列的预测结果和r2、MAPE。 4、优化方法之前提过一下,(1)尝试一下Hybrid_LSTM(),框架和CEEMDAN-VMD-GRU类似,最后用fitting(注释掉的代码)取代adding。(2)在(1)框架的基础上,fitting操作时可以加入更多的指标数据,呈阶梯状也没有关系。fitting的操作是根据子序列预测结果,再次进行训练,借助各种数据拟合得到最终预测结果。这也就是逆分解的过程,CEEMDAN分解的子序列通常是直接相加就能得到原始序列,但也可以用LSTM取代相加操作转为拟合,可以考虑随机森林、LGB等其他算法来拟合。

Hezhexi2002 commented 1 year ago

1、r2算出来是负数以及为什么RMSE、MAE这么大的原因你去看一下数学公式就理解了,r2和MAPE有除以一个数据范围。 2、安装tensorflow-gpu和CUDA即可加速运行,详细操作可以百度。 3、这个分解结果调整inte_form的意义不大,继续使用之前的就行,需要关注的是各子序列的预测结果和r2、MAPE。 4、优化方法之前提过一下,(1)尝试一下Hybrid_LSTM(),框架和CEEMDAN-VMD-GRU类似,最后用fitting(注释掉的代码)取代adding。(2)在(1)框架的基础上,fitting操作时可以加入更多的指标数据,呈阶梯状也没有关系。fitting的操作是根据子序列预测结果,再次进行训练,借助各种数据拟合得到最终预测结果。这也就是逆分解的过程,CEEMDAN分解的子序列通常是直接相加就能得到原始序列,但也可以用LSTM取代相加操作转为拟合,可以考虑随机森林、LGB等其他算法来拟合。

嗯嗯,好的,谢谢大佬,其实tensorflow-gpu还有cuda这些都装过了,因为之前一直在实验室搞cv算法,训练模型肯定要用cuda,刚刚那样说其实也是调侃一下啦,不过您最后的那个建议确实可以,不过我之前还没用过Hybrid_LSTM()训练,CEEMDAN-VMD-GRU这个repo也才刚刚clone下来,今晚一会儿去看看代码,然后按照您的思路去试试!