tsprial:一种方便快捷时间序列特征选择工具

2022-12-04 16:54:09 浏览数 (1)

在很多时间序列的项目开始,我们常常需要理解业务需求,分析数据特征,以建立第一个基础模型。这作为一个标准基线方案,为后续的优化和提升提供指引。过去,很多初学者对于复杂专业的时间序列特征选择过程无从下手。数据处理,建模和验证,这些过程都需要从业者从头开始进行模型构建,训练和测试。这时就会花费很多的时间。

是否有一些工具可以帮助我们通过一些简单而有效的技巧来提高前期特征选择,或者构建基础模型的速度呢?例如,我们都知道特征选择是一种降低预测模型输入的特征维数的技术。特征的减少降低了模型的复杂性,从而降低了训练和验证的时间。

本篇文章将为大家展示一个工具,tsprial,一个 Python 包,可以帮助大家进行时序特征的选择,在降低预测推理时间的同时能有效避免性能的显著下降。tsprial 也提供了各种预测技术,能与 scikit-learn 完美地集成使用。

下面为大家展示下如何使用 tsprial 进行时间序列特征的高效选择。

我们进行实验,首先构建多个随机行为时间序列。随机加入每个小时的频率和季节性(每日和每周),并对不同的单时序分别加入不同的从平滑随机游走中得到的趋势。构建出来的序列如下图所示:

这里时序数据的最后一部分是用作测试使用,前面的时段进行训练。实验中我们模拟了100个独立的时间序列。之所以说“独立”,是因为尽管它们表现出非常相似的行为,但所有的系列并不相互关联。通过这种方式,我们分别对它们进行建模。

时序预测的目标是预测下一个小时的值,以当前时刻之前的时序数值作为输入。这样时间序列预测的特征选择就与标准的表格监督任务一样。特征选择的算法就可以简单地对滞后的目标特征进行操作。下面展示了一个使用递归预测进行特征选择的例子:

代码语言:javascript复制
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)

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

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

代码语言:javascript复制
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 的功能进行处理和生成的。它简化了识别有意义的自回归滞后特征的过程,并赋予了使用时间序列操作特征选择的可能性。最后通过这个实验我们发现了如何通过简单地应用滞后特征选择来减少预测的推理时间。

0 人点赞