当前位置: 首页 > news >正文

时间序列中的特征选择:在保持性能的同时加快预测速度

当我们对数据建模时,首先应该建立一个标准基线方案,然后再通过优化对该方案进行修改。在项目的第一部分中,我们必须要投入时间来理解业务需求并进行充分的探索性分析。建立一个原始模型。可以有助于理解数据,采用适当的验证策略,或为引入奇特的想法提供数据的支持。

在这个初步阶段之后,我们可以根据不同的情况选择不同的优化方式,例如改变模型,进行数据的处理,甚至是引入更多的外部数据。

对于每个方案,我们都需要对数据进行处理,建模和验证,这都需要从头开始对模型进行再训练,这时就会浪费很多的时间,如果我们可以通过一些简单而有效的技巧来提高预测的速度。例如,我们都知道特征选择是一种降低预测模型输入的特征维数的技术。特征选择是大多数机器学习管道中的一个重要步骤,主要用于提高性能。当减少特征时,就是降低了模型的复杂性,从而降低了训练和验证的时间。

在这篇文章中,我们展示了特征选择在减少预测推理时间方面的有效性,同时避免了性能的显着下降。tspiral 是一个 Python 包,它提供了各种预测技术。并且它与 scikit-learn 可以完美的集成使用。

为了进行实验,我们模拟了多个时间序列,每个小时的频率和双季节性(每日和每周)。此外我们还加入了一个从一个平滑的随机游走中得到的趋势,这样就引入了一个随机的行为。

这个时序数据的最后一部分是用作测试使用的,我们会记录其中测量预测误差和做出预测所需的时间。对于这个实验模拟了100个独立的时间序列。之所以说“独立”,是因为尽管它们表现出非常相似的行为,但所有的系列并不相互关联。通过这种方式,我们分别对它们进行建模。

我们使用目标的滞后值作为输入来预测时间序列。换句话说,为了预测下一个小时的值,我们使用表格格式重新排列了以前可用的每小时观测值。这样时间序列预测的特征选择就与标准的表格监督任务一样。这样特征选择的算法就可以简单地对滞后的目标特征进行操作。下面是一个使用递归预测进行特征选择的例子。

 from sklearn.linear_model import Ridge
 from sklearn.pipeline import make_pipeline
 from sklearn.feature_selection import SelectFromModel
 from tsprial.forecasting import ForecastingCascade
 
 max_lags = 72
 recursive_model = ForecastingCascade(
     make_pipeline(
         SelectFromModel(
             Ridge(), threshold='median',
             max_features=max_lags,
         ), 
         Ridge()
     ),
     lags=range(1,169),
     use_exog=False
 )
 
 recursive_model.fit(None, y)
 
 selected_lags = recursive_model.estimator_['selectfrommodel'].get_support(indices=True)

我们使用元估计器的重要性权重(线性模型的系数)从训练数据中选择重要特征。这是一种简单而快速的选择特征的方法,因为我们处理后的数据可以使用通常应用于表格回归任务的相同技术来执行。

在直接预测的情况下,需要为每个预测步骤拟合一个单独的估计器。需要为每个预测步骤进行选择。每个估计器会选择不同的重要程度的滞后子集,并汇总结果生成一组独特的有意义的滞后。

 from sklearn.linear_model import Ridge
 from sklearn.pipeline import make_pipeline
 from sklearn.feature_selection import SelectFromModel
 from tsprial.forecasting import ForecastingChain
 
 max_lags = 72
 direct_model = ForecastingChain(
     make_pipeline(
         SelectFromModel(
             Ridge(), threshold='median',
         ), 
         Ridge()
     ),
     n_estimators=168,
     lags=range(1,169),
     use_exog=False,
     n_jobs=-1
 )
 
 direct_model.fit(None, y)
 
 selected_lags = np.argsort(np.asarray([
      est.estimator_['selectfrommodel'].get_support() 
      for est in direct_model.estimators_
 ]).sum(0))[-max_lags:]

结果可以看到,滞后选择与模型性能密切相关。在纯自回归的情况下,如果没有额外的外生变量,滞后目标值是提供良好预测的唯一有价值的信息。

这里采用了三种递归和直接方法。首先,使用过去长达168小时的所有延迟(full)。然后,只使用周期性滞后(dummy)。最后只考虑在训练数据上选择的有意义的滞后(filtered)来拟合我们的模型

可以看到最直接方法是最准确的。而full的方法比dummy的和filter的方法性能更好,在递归的方法中,full和filtered的结果几乎相同。

对于时间来说,dummy方法是最快的方法,这个应该是预料之中的因为它考虑的特征数量很少。出于同样的原因,filtered要比full快。但是令人惊讶的是,filtered的速度是full方法的一半。这可能是一个很好的结果,因为我们可以通过简单的特征选择以更快的方式获得良好的预测。

上面的测试结果和表格都是利用 tspiral 的来进行处理和生成的。它简化了有意义的自回归滞后的识别,并赋予了使用时间序列操作特征选择的可能性。最后我们还通过这个实验发现了如何通过简单地应用适当的滞后选择来减少预测的推理时间。

如果你对本文的结果感兴趣,请查看本文的源代码:

https://avoid.overfit.cn/post/7488218628c84fdb9423484a98bbfa3e

作者:Marco Cerliani

相关文章:

  • 谷粒商城 (九) --------- 前端基础 Vue 篇
  • MySQL锁机制详解-表锁与行锁
  • mysql行锁,表锁,间隙锁
  • 【GEE笔记11】数值Number(常见指令方法4)
  • Linux_进程概念
  • 【PAT乙】2022秋季赛后总结
  • nginx + tomcat 搭建负载均衡、动静分离(tomcat多实例)
  • CSRF(跨站请求伪造)攻击和预防
  • 【都 Java17 了,还不了解 Java 8 ? 】一文带你深入了解 Java 8 新特性
  • 解决国产机SVN连接失败的问题
  • MySQL 存储过程创建指定表结构
  • 我们这样的人
  • < Linux > 进程概念(2)
  • Qt5开发从入门到精通——第四篇十二节(不规则窗体)
  • MySQL 5.7.x--命令行自带帮助文档的使用,超级棒!!!
  • 【个人向】《HTTP图解》阅后小结
  • ➹使用webpack配置多页面应用(MPA)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ECMAScript6(0):ES6简明参考手册
  • leetcode98. Validate Binary Search Tree
  • Next.js之基础概念(二)
  • overflow: hidden IE7无效
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue UI框架库开发介绍
  • Vue学习第二天
  • 闭包,sync使用细节
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 二维平面内的碰撞检测【一】
  • 简单实现一个textarea自适应高度
  • 详解移动APP与web APP的区别
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 正则表达式
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #pragma 指令
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (145)光线追踪距离场柔和阴影
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (笔试题)分解质因式
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • ./configure、make、make install 命令
  • .NET Core Web APi类库如何内嵌运行?
  • .NET MVC第三章、三种传值方式
  • .NET 材料检测系统崩溃分析
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net流程开发平台的一些难点(1)
  • /etc/sudoer文件配置简析
  • :中兴通讯为何成功
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [2010-8-30]