多路时序数据联合训练

当我们需要对多路时序数据进行训练以及预测的时候,其中的一个方法即是对每组时序数据分别创建模型进行独立的训练以及预测;但是在很多实际的场景中,我们希望针对多组时序数据去联合训练一个模型,这样能更好的提升效率以及获得更好的模型效果。针对多时序数据组合训练的需求,PaddleTS提供了从数据导入、数据转换以及模型训练的全流程支持。

1. 多时序数据导入

PaddleTS支持基于原始数据中的 group_id 属性进行自动的数据分组导入,如设备id等属性,相同的 group_id 代表一组时间序列,不同组时间序列时间的时间索引可以重复。

#Build DataFrame with group_id

import pandas as pd
import numpy as np
sample = pd.DataFrame(np.random.randn(200, 3), columns=['a', 'c', 'd'])
sample['id'] = pd.Series([0]*80 + [1]*120, name='id')

#Load TSDatasets by group_id
from paddlets import TSDataset
tsdatasets = TSDataset.load_from_dataframe(
    df=sample,
    group_id='id',
    target_cols='a',
    observed_cov_cols=['c', 'd'],
    #static_cov_cols='id'
)

print(f" The type of tsdatasets is {type(tsdatasets)},\n \
and the length of tsdatasets is {len(tsdatasets)},\n \
the length of first tsdataset target is {len(tsdatasets[0].target)},\n \
the length of second tsdataset target is {len(tsdatasets[1].target)}")
# The type of tsdatasets is <class 'list'>,
# and the length of tsdatasets is 2,
# the length of first tsdataset target is 80,
# the length of second tsdataset target is 120

上述中的 static_cov_cols 是否传递并指定为 group_id 是可选的,如果设置了改选项,` group_id` 将作为静态协变量加入模型的训练。需要注意的是,PaddleTS当前不是所有的模型都支持静态协变量的输入,详情请参考模型部分介绍。

用户也可以分别导入不同组的时序数据去单独构建TSDataset, 然后自己去组成一个List进行后续的联合训练,需要注意的是,联合训练中的所有TSDataset要求数据具有同质性,即columns以及dtypes属性相同。

ts1 = TSDataset.load_from_dataframe(...)
ts2 = TSDataset.load_from_dataframe(...)
#ts1.columns == ts2.columns and ts1.dtypes = ts2.dtypes
tsdatasets = [ts1, ts2]

2. 多时序数据转换

多路时序数据在联合训练之前,如需进行数据转换,如归一化、特征生成等操作,通常也需要对数据进行联合的转换,这样可以保证入模数据的一致性。PaddleTS的Transform模块支持TSDataset数组的传递,并进行多时序的联合转换。

from paddlets.transform import MinMaxScaler
min_max_scaler = MinMaxScaler()
tsdatasets = min_max_scaler.fit_transform(tsdatasets)

3. 多时序联合训练

PaddleTS中目前所有forecasting模型的fit接口都支持TSDataset数组的传递,并进行多时序的联合训练。

from paddlets.models.forecasting import MLPRegressor
mlp = MLPRegressor(in_chunk_len=10, out_chunk_len=2)
mlp.fit(tsdatasets)

for tsdataset in tsdatasets:
    print(mlp.predict(tsdataset))

#           a
#80  0.546383
#81  0.513985
#           a
#200  0.511116
#201  0.590263

4. Pipeline多时序支持

PaddleTS中pipeline同样支持多时序输入的训练输入。

from paddlets import Pipeline
pipeline = Pipeline([
    (MinMaxScaler, {}),
    (MLPRegressor, {"in_chunk_len": 10, "out_chunk_len": 2})
])
pipeline.fit(tsdatasets)

for tsdataset in tsdatasets:
    print(pipeline.predict(tsdataset))

#           a
#80  0.344289
#81  0.255014
#           a
#200  0.272490
#201  0.842059