如何使用RapidMiner中的时间序列模型进行未来预测?

luc_bartkowskiluc_bartkowski 成员职位:46Maven
2018年12月编辑 帮助

我想这个话题是关于RapidMiner时间序列预测最常被问到的问题。一些例子:

我们都会问同样的问题。

我们希望能够预测明天、下周、下个月,无论时间的范围和维度是什么。

有些人甚至在他们的主题/帖子中多次问同样的问题,好像问题不清楚似的。

因此,下面的图片,它说明了这个问题。

rmcomq.jpeg

如何:

  • 计算10月5日的预测(黑色标记);
  • 使用窗口操作符的“-0属性”(蓝色标记);
  • 为了预测(橙色箭头)未知的未来,10月5日的最后值(红色标记);
  • 以同样的方式,“-0属性”(棕色标记)用于计算训练/验证/测试示例集中的预测(黄色标记);
  • 但是不能使用未知的未来最后值(红色标记)作为标签(绿色标记)?

唯一可能的答案是@Thomas_Otthttp://community.www.turtlecreekpls.com/t5/Getting-Started-Forum/Time-Series-Forecasting-for-Data/m-p/37315。他的回答链接到XML rm过程http://community.www.turtlecreekpls.com/t5/RapidMiner-Studio-Forum/Recall-Error/m-p/37302#U37302。该XML实现了一个复杂的过程,包括宏操作、串联的多个窗口操作符、记忆/召回和循环操作符,甚至还有一个“Materialize Data”操作符来释放RapidMiner中的内存。这个过程也是基于雅虎历史数据操作符的,不幸的是它不再工作了。因此,我甚至不确定这个过程是否回答了这个主题的问题。是否有一个更简单的过程/解决方案可用来回答这个主题的问题?

谢谢,

卢克

最佳答案

  • luc_bartkowskiluc_bartkowski 成员职位:46Maven
    解决方案接受

    很高兴这样做,马丁。

    说实话,我对ARIMA还不太了解。这个周末我会在YouTube上看一些关于ARIMA的视频。

    但幸运的是,RapidMiner提供了一个优化参数操作符。?

    所以@tftemme结果如下:

    石油Prediction.jpg

    模型是:

    OilPredictionModelARIMA.jpeg

    还有XML

    < ?xml version="1.0" encoding="UTF-8"?> <过程version = " 7.6.001”>
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文







    <过程扩展= " true " >



    < /操作符>

    <列出关键= " function_descriptions " >

    < / >列表
    < /操作符>



    < /操作符>



    < /操作符>



    < /操作符>

    <过程扩展= " true " >

    <过程扩展= " true " >








    <枚举关键= "参数" / >


    < /操作符>


    < /操作符>


    < /操作符>













    < /操作符>







    < /操作符>



    <列出关键= " rename_additional_attributes " >







    < / >列表
    < /操作符>







    > < /过程
    < /操作符>




    > < /过程
    < /操作符>



    < /操作符>



    <列出关键= " set_additional_roles " >


    < / >列表
    < /操作符>













    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>


    <过程扩展= " true " >

    “参数”<列表键= >


    < / >列表














    <过程扩展= " true " >








    < /操作符>




    应用ARIMA过程预测时间序列的下10个值
    < /操作符>











    > < /过程
    < /操作符>








    < /操作符>




    应用ARIMA过程预测时间序列的下10个值
    < /操作符>









    > < /过程
    < /操作符>



    <列出关键= " set_additional_roles " >

    < / >列表
    < /操作符>

    <过程扩展= " true " >

    “参数”<列表键= >


    < / >列表














    <过程扩展= " true " >








    < /操作符>




    应用ARIMA过程预测时间序列的下10个值
    < /操作符>











    > < /过程
    < /操作符>








    < /操作符>




    应用ARIMA过程预测时间序列的下10个值
    < /操作符>









    > < /过程
    < /操作符>



    <列出关键= " set_additional_roles " >

    < / >列表
    < /操作符>

    <过程扩展= " true " >

    “参数”<列表键= >


    < / >列表














    <过程扩展= " true " >








    < /操作符>




    应用ARIMA过程预测时间序列的下10个值
    < /操作符>









    > < /过程
    < /操作符>








    < /操作符>




    应用ARIMA过程预测时间序列的下10个值
    < /操作符>









    > < /过程
    < /操作符>



    <列出关键= " set_additional_roles " >

    < / >列表
    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>




    <列出关键= " key_attributes " >

    < / >列表

    < /操作符>




    <列出关键= " key_attributes " >

    < / >列表

    < /操作符>













    < /操作符>








































































    < /操作符>






    <列出关键= "参数" / >


    < /操作符>































    流程配置(训练样例集、水平、周期ARIMA优化、预测日期)
    选择时间序列范围
    获取源数据
    生成未来预测
    报表
    > < /过程
    < /操作符>
    > < /过程

    真的很喜欢RapidMiner。

    周末愉快。

    问候,

    卢克

    sgenzer Thomas_Ott sunnyal

答案

  • sgenzersgenzer 12管理员,版主,员工,RapidMiner认证分析师,社区经理,成员,大学教授,PM版主职位:2959年社区经理

    你好@luc_bartkowski-谢谢。我同意这是一个非常常见的用例,也同意它可以更容易。一个快速剧透是时间序列扩展正在进行完全重建(看看两周前的博客通过@tftemme).也就是说,我认为我们可以在这里帮助巩固这些线程,也许把它变成一个新扩展的样本?:)如果是这样,你可以发布(转发?)数据集,我们将一起工作。

    至于雅虎历史数据的问题,是的,我们在这个论坛上讨论了很多。许多人已经发布了替代解决方案(请参阅我关于Alpha Venture的知识库文章或关于使用Quandl的文章)。与此同时,我们正在努力推出一个更持久、更好的解决方案。


    斯科特

    Telcontar120
  • Telcontar120Telcontar120 主持人,RapidMiner认证分析师,RapidMiner认证专家,会员职位:1635年独角兽

    就我个人而言@sgenzer我非常期待重建时间序列扩展和添加新的操作符,以使事情变得更容易,或者填补当前提供的空白(R包“预测”,有人吗?)。

    但与此同时@luc_bartkowski您可能会发现还有另一个示例过程,它进行了大量注释,可能会对您有所帮助。如果你安装了系列扩展,那么当你打开RapidMiner的“文件>新进程”窗口时,你会被提示一个系列预测模板,如图所示(只需向下滚动,直到你看到它)。我想你会发现它很有帮助。时间序列样本。png

    布莱恩·T。
    Lindon合资企业
    乐鱼平台进入来自认证RapidMiner专家的数据科学咨询
    sgenzer
  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    亲爱的@Telcontar120

    谢谢你的回答,但是“时间序列预测”模板也不能预测超出示例集的日期。

    问候,

    卢克

  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    你好@sgenzer/斯科特,

    我已经设法逆向工程的“循环”解决方案@Thomas_Ott并将其构建到我自己的时间序列预测过程中。

    我“接近了”,但仍然“没有雪茄”。?请参阅以下图片和附带的XML。第一张图显示了我的“标准”时间序列预测训练/验证/测试过程。第二张图片放大了Loop子流程。

    这些过程是基于Quandl CME_CL1原油期货连续合约1 CL1前月数据集。

    请注意,我在每个属性名称前添加了“oil”。因此,该数据集的Open属性被重命名为oilOpen。

    所有其他属性也一样:oilDate, oilHigh, oilLow, oilLast等。

    Loop子流程在Test示例集的最后一个日期之后生成一定数量的未来日期。量等于视界。但是由于某些原因,Loop子流程没有为每个新的(未来的)日期生成新的预测(标签)。它从Remember/Recall操作符(Test示例集的最后一行)复制预测(标签),并将该值(作为常量)添加到每个新的未来日期。

    我的理解是,Thomas的Loop子流程实现使用模型生成一个新的预测(标签),并将其值放在属性“Close”中。在我看来,属性Close不存在于Thomas的Loop子进程中,它应该是Close-0。所以我不知道我在我的过程中重用的这个示例过程是否正常运行。

    任何有助于消除我的流程模型中的最后一个缺陷的帮助都是值得感谢的。

    谢谢你的支持。

    卢克

    oilTimeSeriesPrediction.jpeg

    oilTimeSeriesPrediction2.jpeg

    < ?xml version="1.0" encoding="UTF-8"?> <过程version = " 7.6.001”>
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文







    <过程扩展= " true " >



    < /操作符>



    < /操作符>



    < /操作符>

    <过程扩展= " true " >

    <过程扩展= " true " >








    <枚举关键= "参数" / >


    < /操作符>


    < /操作符>


    < /操作符>













    < /操作符>







    < /操作符>



    <列出关键= " rename_additional_attributes " >







    < / >列表
    < /操作符>








    > < /过程
    < /操作符>




    > < /过程
    < /操作符>



    < /操作符>




    <列出关键= " set_additional_roles " >


    < / >列表
    < /操作符>













    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>











    < /操作符>








    <过程扩展= " true " >


























    < /操作符>





    > < /过程
    <过程扩展= " true " >

    <列出关键= " application_parameters " / >

    < /操作符>






    < /操作符>









    > < /过程
    < /操作符>



    <列出关键= " set_additional_roles " >


    < / >列表
    < /操作符>













    < /操作符>




    <列出关键= " filters_list " / >


    < /操作符>











    < /操作符>


    <列出关键= " application_parameters " / >

    < /操作符>





    <列出关键= " additional_macros " / >
    Calculate<br>窗口测试示例集的<br>行数
    < /操作符>

    <列出关键= " function_descriptions " >

    < / >列表
    设置宏filter_range<br>为测试示例集中的行数减去1<br>(以获得测试示例集的最后一行)
    < /操作符>




    获取测试示例集中的最后一行<br>
    < /操作符>





    记住测试示例集的<br>最后一行包括最后一个日期开始<br>循环<br>预测未来日期
    < /操作符>







    <过程扩展= " true " >




    回忆Test示例集的最后一行<br>来定义将由循环操作符生成的示例集的结构。<br/>它还定义了最后一个测试日期,以便生成新的日期。
    < /操作符>

    <列出关键= " application_parameters " / >

    < /操作符>

    <列出关键= " function_descriptions " >

    < / >列表

    生成n个未来日期(每个循环一个接一个),与测试示例集的最后日期相邻。n = %{PredictionHorizon}
    < /操作符>

    <参数键="attribute_name"值="预测(标签)"" / >

    <列出关键= " set_additional_roles " >









    < / >列表
    设置预测(label)的角色为<br/>regular
    < /操作符>


    <参数键="属性" value="预测(标签)"" / >










    选择预测(label)
    < /操作符>















    使用前一个操作符&;$1-&;的反向引用替换oilLast-0值
    < /操作符>



    清理<br/>内存以获得一个干净的示例集
    < /操作符>












    > < /过程
    在每个循环中生成一个新的未来日期并在该日期上应用模型
    < /操作符>




    将循环的每个结果附加到未来预测示例集
    < /操作符>





























    流程配置(训练样例集,地平线,窗口,保持样例集)
    训练/验证时间序列模型
    测试时间序列模型
    获取源数据
    生成未来预测
    > < /过程
    < /操作符>
    > < /过程

  • Thomas_OttThomas_Ott RapidMiner认证分析师,RapidMiner认证专家,成员职位:1761年独角兽

    我回去一段时间后,原来的过程被张贴和修复它,因为它不是每天正确地产生关闭值。我得在另一台机器上找。

  • sgenzersgenzer 12管理员,版主,员工,RapidMiner认证分析师,社区经理,成员,大学教授,PM版主职位:2959年社区经理

    @luc_bartkowski-好的,我花了些时间看你们的流程。也许我遗漏了一些东西,但你在“测试”模型时实际上是在预测未来。Apply Model操作器的输出将向您显示10天前的石油预测。对吧?

    截图2017-10-04 10:38.30 AM.png

    < ?xml version="1.0" encoding="UTF-8"?> <过程version = " 7.6.001”>
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文

    <过程扩展= " true " >



    < /操作符>



    < /操作符>



    < /操作符>

    <过程扩展= " true " >

    <过程扩展= " true " >



    <枚举关键= "参数" / >
    < /操作符>


    < /操作符>


    < /操作符>



    < /操作符>




    < /操作符>



    <列出关键= " rename_additional_attributes " >







    < / >列表
    < /操作符>







    > < /过程
    < /操作符>




    > < /过程
    < /操作符>


    < /操作符>




    <列出关键= " set_additional_roles " >


    < / >列表
    < /操作符>



    < /操作符>



    <列出关键= " filters_list " / >
    < /操作符>



    <列出关键= " filters_list " / >
    < /操作符>






    < /操作符>




    <过程扩展= " true " >






    > < /过程
    <过程扩展= " true " >

    <列出关键= " application_parameters " / >
    < /操作符>




    < /操作符>









    > < /过程
    < /操作符>



    <列出关键= " set_additional_roles " >


    < / >列表
    < /操作符>



    < /操作符>






    < /操作符>

    <列出关键= " application_parameters " / >
    < /操作符>



    < /操作符>




















    流程配置(训练样例集,地平线,窗口,保持样例集)
    训练/验证时间序列模型
    获取源数据
    > < /过程
    < /操作符>
    > < /过程

    斯科特

  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    我的模型有一个设置地平线的过程参数(右上)。

    所以我可以使用不同的视界选项。

    这个视界用于训练/验证过程,也用于测试过程。

    我想用同样的视界来预测未来。

    所以,是的,如果地平线设置为10,那么我想预测10月8日的Last值,考虑到训练/验证/测试示例集中的最后日期是9月28日。

    我怀疑托马斯的例子模型只适用于地平线= 1。因此我改变了我的模型。

    我修改的模型从测试示例集中选择最后n个值,并将其放入“循环示例”子流程中。

    因此,“循环示例”中的子流程获取用于计算未来oilDates预测(标签)的值。

    在“循环示例”子过程中,我还设法更改了日期,例如提前N天更改了oilDate。N =地平线了。

    但后来我卡住了,不知道该做什么/使用哪个操作符,以获得对未来日期的预期预测。

    请在以下XML中找到修改后的模型。

    < ?xml version="1.0" encoding="UTF-8"?> <过程version = " 7.6.001”>















    使用前一个操作符&;$1-&;的反向引用替换oilLast-0值
    < /操作符>
    > < /过程

  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    @Thomas_Ott

    亲爱的托马斯,我同意。

    我自己也意识到了。你解决了另一个独立于过程的问题。

    但是,它仍然是解决方案的唯一模板。我很高兴找到关于这个主题的解决方案的任何模板。

    尽管所有的信息,教程,模板,博客,视频在网上关于时间序列预测与RapidMiner你给我指出了一个可能的解决方案。因为你的帖子,我为此感谢你。你做得很好,我从你身上学到了很多,谢谢。

    最好的问候,

    卢克

    sgenzer
  • Thomas_OttThomas_Ott RapidMiner认证分析师,RapidMiner认证专家,成员职位:1761年独角兽

    @luc_bartkowski谢谢你的夸奖。我有一堆时间序列过程,我应该整理和重新发布。它们非常重要,因为RapidMiner中的时间序列还不是很有组织(到目前为止),但开发团队和社区已经取得了进展。

    sgenzer luc_bartkowski
  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    你好,斯科特,

    我知道为什么你能在你的图片中预测到10月3日。那是因为你昨天在10月4日下载了Quandl的源数据。

    您的源数据包括10月3日oilOpen等的值。这就是为什么10月3日,包括一个有价值的预测,在你的图片中可见。但无论你的视野是什么,你的图片都不会显示出10月3日之后的预测。

    我很抱歉,因此我不能在这个话题上点击“解决”按钮。

    我开始怀疑,这个话题所要解决的问题是:

    “Apply model”操作符(也)总是需要一个Label来计算预测。

    因为这样的Label对于未来日期不可用,所以“Apply model”操作符将永远无法计算未来日期的预测。

    为了说明这个结论,再看一下我在这篇文章中的第一张照片。为了生成这张图片,我为9月28日之后的所有属性添加了假值(“0”例如零)的未来日期,包括9月29日至10月5日标签(oilLast)的零值。“应用模型”操作符使用这些未来(假)标签来预测这些未来的日期。因此,所有9月28日之后的预测值都为7.667,基于带有“0”的标签,例如这些未来日期的零值。如前所述:我怀疑“应用模型”总是需要一个有价值的标签来进行预测。

    这要么是本主题中解决的问题的解释,要么是我对“应用模型”的实现不正确。

    如果是后者,请在XML中发送一个示例模型作为回复,该示例模型实现了一个“应用模型”操作符,该操作符将预测超出源数据集范围的情况。

    最好的问候,

    卢克

  • sgenzersgenzer 12管理员,版主,员工,RapidMiner认证分析师,社区经理,成员,大学教授,PM版主职位:2959年社区经理

    我在这上面花了些时间。让我知道你的想法。

    < ?xml version="1.0" encoding="UTF-8"?> <过程version = " 7.6.001”>
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文

    <过程扩展= " true " >

    <过程扩展= " true " >

    <过程扩展= " true " >



    <枚举关键= "参数" / >
    < /操作符>


    < /操作符>


    < /操作符>



    < /操作符>



    < /操作符>



    <列出关键= " rename_additional_attributes " >







    < / >列表
    < /操作符>







    > < /过程
    < /操作符>




    > < /过程
    < /操作符>


    < /操作符>



    < /操作符>



    < /操作符>



    < /操作符>



    <列出关键= " filters_list " / >
    < /操作符>

    <枚举关键= "分区" >


    < /枚举>

    < /操作符>


    <列出关键= " set_additional_roles " >

    < / >列表
    < /操作符>



    < /操作符>






    < /操作符>


    < /操作符>



    <列出关键= " rename_additional_attributes " / >
    < /操作符>




    <过程扩展= " true " >






    > < /过程
    <过程扩展= " true " >

    <列出关键= " application_parameters " / >
    < /操作符>




    < /操作符>









    > < /过程
    < /操作符>


    <列出关键= " set_additional_roles " >

    < / >列表
    < /操作符>



    < /操作符>






    < /操作符>


    < /操作符>



    <列出关键= " rename_additional_attributes " / >
    < /操作符>

    <列出关键= " application_parameters " / >
    < /操作符>

    <列出关键= " application_parameters " / >
    < /操作符>


    < /操作符>




    < /操作符>


    <列出关键= " key_attributes " / >
    < /操作符>



    < /操作符>


































    流程配置(训练样例集,地平线,窗口,保持样例集)
    训练/验证时间序列模型
    获取源数据
    测试模型
    预测
    > < /过程
    < /操作符>
    > < /过程

    斯科特

  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    我做了一些额外的测试。

    Thomas修复的关于记忆/回忆的模型是基于转换日期的实现。

    我注意到RapidMiner使用java变量的全局实现。宏不是存储位置,而是指向全局变量的指针。

    利用这些知识,我在Loop操作符前面的其他地方更改了日期。这些值在Loop中不会改变,因为它们是全局的。

    我把结果放在了下一张图里。人们可以更改日期,将日期向前,向后,在任何地方。这些图片是基于10天的地平线。Apply模型将只使用这些日期作为ID。我在之前的主题中注意到了这一点。但是“Apply model”操作符不能预测源数据集范围之外的情况,无论这些示例的日期是什么,也无论这些示例的日期是什么。

    因为在源数据集的范围内没有future Label。

    preddatemin.jpeg日期向后移动10天,9月28日变成9月18日

    preddateplus.jpeg9月28日变成10月8日

  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    在这个XML过程中,我所做的唯一一件事就是将源日期更改为基于MySQL的示例集。

    如您所知,源示例集的值直到9月28日。

    这些是结果。请看下面的图片。

    在此过程中设置的唯一结果示例由操作符Sort(2)提供。

    该预测的范围不超出源数据集,在我的源数据集9月28日。

    predictionssort (2) jpeg排序(2)结果示例集。

    predictionscotttest.jpeg

  • sgenzersgenzer 12管理员,版主,员工,RapidMiner认证分析师,社区经理,成员,大学教授,PM版主职位:2959年社区经理

    你好。所以我猜你的帖子,你确实运行了我建立的过程。未来10天的预测在那个截图中,它们只是不在新的行中。如果您查看标记为“预测(未来10天)”的列,该列表示在oilDate中列出的日期之后10天的石油预测价格。例如,在9月15日,预测(未来10天)=50.077。因此,这是对9月15日以后10天内油价的预测。根据我的计算,这不是9月25日,因为这些价格只列出了每周7天中的5天。因此,这表明,根据该模型,9月29日的原油价格为50.077,以此类推……

    10.12: 52.473

    10.11: 52.258

    Oct 10:52 .336

    十月9:51 .892

    10月6日:50.454

    10月5日:50.648

    10月4日:49.682

    10月3日:49.479

    10月2日:49.606

    9月29日:50.077

    这就是为什么在“10天前”一列中看不到任何值的原因——它还没有出现在数据集中。是的,我本可以花点时间把这些都移动一下,这样看起来就像我上面输入的那样…:)

    斯科特

  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    与ARIMA培训师解决并应用预测。

    谢谢您的支持。?

  • MartinLiebigMartinLiebig 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家,大学教授职位:3287年RM数据科学家

    亲爱的@luc_bartkowski

    如果您对ARIMA操作人员有任何反馈,请在这里发布@tftemme在“抄送”。我们很高兴对这个扩展的任何反馈,这是正在进行的工作。

    欢呼,

    马丁

    - RapidMin乐鱼平台进入er数据科学服务主管
    德国多特蒙德
  • luc_bartkowskiluc_bartkowski 成员职位:46Maven
  • Thomas_OttThomas_Ott RapidMiner认证分析师,RapidMiner认证专家,成员职位:1761年独角兽

    很好@luc_bartkowski

    sgenzer luc_bartkowski
  • luc_bartkowskiluc_bartkowski 成员职位:46Maven

    像支持向量机和神经网络这样的预测算子的好处是它们是多变量的。

    在股票交易方面:移动平均线的振幅和交易量可能有一个关联。

    ARIMA是不变的,但它是唯一能够预测真实未来的算子。

    我要做的是实现多变量未来预测

    为了给多变量预测算子提供真实的多变量数据以及与之相关的所有单变量预测,ARIMA模型的预测输出。我会用真实数据训练这个模型。是的,所以我必须等到未来已经过去,我已经获得了训练的标签。是的,我知道,最终的预测会有滞后。标签数据不能更新于now()。我们都没有真正的未来多变量数据。但我们可以优化预测。

    如果ARIMA中使用的q,d,p发生变化会发生什么?好吧,我猜多变量预测算子将得到改进的数据来训练它的模型,直到现在(),训练数据是未来减去地平线。它是,也将永远是我们想要预测的未来。我们得猜一猜。因此,我们要求ARIMA做出预测,这是ARIMA的最佳猜测。多变量预测算子将使用目标标签对其进行训练,直到现在(),即预测地平线减去地平线。

登录注册置评。