前言
目标人群:针对使用时间序列数据做预测、分类、插值和异常检测等任务的新手
文章目的:帮助新手快速上手清华时间序列库,跑通自定义数据集。
在清华时间序列库(TSLib)系列的第一篇教程中,我们了解了TSLib库的主程序 run.py文件中的大部分内容,而这篇教程则是关于如何使用自己的数据集,通过TSLib库进行训练和预测。
系列教程链接
【清华时间序列库】无基础可入:面向对象编程的TSLib主程序run.py解析(一)
数据集准备
TSLib库支持的数据集格式为csv文件,需要注意以下两点:
- 第一列为时间戳,并且第一列列名必须为date。
- 最后一列为目标变量。
- 虽然csv文件中包含空值(缺失值)也能跑通代码,但是还是建议先把csv文件中的缺失值以及异常值处理一下。
以下是一个简单的csv文件示例,其中第一列为时间戳,列名为date,第二列是广告花费,作为预测销量的影响因素,最后一列为目标变量,即销量:
date | ad_spend | sales |
---|---|---|
2023-01-01 | 50 | 120 |
2023-01-02 | 70 | 150 |
2023-01-03 | 40 | 100 |
2023-01-04 | 60 | 130 |
2023-01-05 | 80 | 160 |
2023-01-06 | 55 | 125 |
2023-01-07 | 65 | 140 |
python环境配置准备
如第一篇教程所说,有一些TSLib用到的库,我们需要提前安装好。可以直接通过requirement.txt配置好这些。
配置流程如图1所示:
step 1:打开VS code面板栏。
step 2:打开终端窗口。
step 3:检查是否在时间序列库主文件夹下(如果不是则选择上方的file -> open folder,选择TSLib文件夹奥)。检查requirements.txt文件是否存在。
step 4:在终端中输入pip install -r requirements.txt
,安装相关的库。
主程序代码修改
我们有两种修改方式,一种是直接改默认值,另一种是直接在命令行中输入参数,这种方法会在租服务器跑代码部分进行讲解。接下来先介绍第一种方式。
方法一:直接修改默认值
打开主程序 run.py文件,我们来梳理一下需要调整的参数。
p.s. 不需要调整的参数则不会设计奥,其含义可以参考前一篇教程。
(1)基础配置
首先task_name参数,这个参数决定了我们使用TSLib库中的哪个任务,这里主要讲解long_term_forecast,即长序列预测。因为它可以一次进行多步预测,类似于多输入多输出的模型结构。如果default='long_term_forecast'
则不需要更改,如果不是,则改成default='long_term_forecast'
。
其次是model_id,如果我们需要跑很多模型,最好做一下标识,这个改成任意字符串都行,只要自己看得懂,知道代表哪个模型即可。
最后是model参数,这个参数有哪些选择可见清华时间序列库教程(一)奥,这里我们使用Autoformer,所以改成default='Autoformer'
。
# basic config
parser.add_argument('--task_name', type=str, required=False, default='long_term_forecast',
help='task name, options:[long_term_forecast, short_term_forecast, imputation, classification, anomaly_detection]')
parser.add_argument('--model_id', type=str, required=False, default='test', help='model id')
parser.add_argument('--model', type=str, required=False, default='Autoformer',
help='model name, options: [Autoformer, Transformer, TimesNet]')
(2)数据配置
data参数:由于我们使用自己的数据集,所以这里需要改成default='custom'
。
root_path参数:这个参数是数据集所在的文件夹路径,由于我们使用vs code打开了主文件夹,因此不需要更改,默认是default='./'
即可。
data_path参数:由于我将csv数据集文件放在了和run.py文件同一个路径之下,并且我的csv数据集命名为model_inputs.csv。因此修改参数的默认值default='model_inputs.csv'
。如果将数据放在其他路径则更改为其他路径即可,但是需要注意,读取数据时是root_path + data_path
,所以data_path不能是绝对路径,而是root_path之下的相对路径。
features参数:如果csv数据集中只有时间戳和目标变量,则选择S;如果有其他变量作为特征,但是只需要预测目标变量,则选择MS;如果有多个变量,并且所有变量都需要进行预测,则选择M。如上文的csv文件示例,我们有时间戳、广告花费和销量,其中广告花费作为特征,销量作为目标变量,所以选择MS。default='MS'
。
target参数:这个参数需要填写我们预测的目标变量的列名,如上文的csv文件示例,sales是目标变量列名,所以改成default='sales'
。
parser.add_argument('--data', type=str, required=False, default='custom', help='dataset type')
parser.add_argument('--root_path', type=str, default='./', help='root path of the data file')
parser.add_argument('--data_path', type=str, default='model_inputs.csv', help='data file')
parser.add_argument('--features', type=str, default='MS',
help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')
parser.add_argument('--target', type=str, default='sales', help='target feature in S or MS task')
(3)预测任务配置
回顾一下上一篇教程中说过的seq_len、pred_len和label_len的含义,如图2所示。
将seq_len设置成自己希望一个样本中一次性输入多少历史数据(类似于滞后阶数的概念);将pred_len设置成希望预测的步长,例如设置成24,则会有24个预测值,分别代表未来1步、2步…到24步;而label_len则是辅助预测的部分,不要超过seq_len的长度即可。
parser.add_argument('--seq_len', type=int, default=96, help='input sequence length')
parser.add_argument('--label_len', type=int, default=48, help='start token length')
parser.add_argument('--pred_len', type=int, default=24, help='prediction sequence length')
(4)模型配置
enc_in、dec_in、c_out:这三个参数都需要设置成除时间戳之外的数据集的变量数量。如上文的csv文件示例,我们有时间戳、广告花费和销量,除去时间戳有两个变量,所以将他们的default都设置成2 default='model_inputs.csv'
。
# model define
parser.add_argument('--enc_in', type=int, default=2, help='encoder input size')
parser.add_argument('--dec_in', type=int, default=2, help='decoder input size')
parser.add_argument('--c_out', type=int, default=2, help='output size')
此外,还需要注意的是,我们能看到d_model和d_ff这两个参数设置得都比较大,这会导致我们需要比较大的内存(cpu跑)或 显存(gpu跑)。如果内存/显存不够,可以尝试将这两个参数调小,或者租显存大的服务器跑代码,本文后面会将如何租服务器跑代码奥。
parser.add_argument('--d_model', type=int, default=512, help='dimension of model')
parser.add_argument('--d_ff', type=int, default=2048, help='dimension of fcn')
在已上都修改好了之后,则可以直接运行run.py文件跑代码啦。
运行报错
如果在运行过程中出现错误 ModuleNotFoundError,类似ModuleNotFoundError: No module named 'xxx'
。则在百度搜一下如何安装xxx包,复制命令安装即可。为什么要搜一下呢,是因为虽然普遍安装包的命令是pip install xxx
,但是有的包安装时的包名不一样,所以需要注意。
结果解读
(1)模型结果保存位置
模型结果保存在文件夹checkpoints下,以主程序 run.py文件中的setting变量命名。如下代码所示,可以看到文件名称第一部分是任务类型,然后是model_id(自己设置的实验id),接着是模型名称、数据集类型等等之前所设置的参数。实例如图3所示。checkpoints文件夹中有很多子文件夹,每个子文件夹的命名里有多个我们自己设置的参数,并且内部包含checkpoints.pth文件,这个.pth文件则保存了预测模型的参数。
setting = '{}_{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_expand{}_dc{}_fc{}_eb{}_dt{}_{}_{}'.format(
args.task_name,
args.model_id,
args.model,
args.data,
args.features,
args.seq_len,
args.label_len,
args.pred_len,
args.d_model,
args.n_heads,
args.e_layers,
args.d_layers,
args.d_ff,
args.expand,
args.d_conv,
args.factor,
args.embed,
args.distil,
args.des, ii)
(2)预测结果位置
预测结果保存位置为 results文件夹,和模型保存结果一样,内部含有多个子文件夹,由setting变量命名,因此我们可以将保存的模型和预测结果根据文件名称一一对应起来。results文件夹中的文件结构如图4所示。可以看到子文件夹中包含真实值true.npy数据和预测值pred.npy数据。有人可能注意到,子文件夹名称最后一位数字总是从0-4,这是因为我设置的参数itr为5,代表实验5次,代码自动保存了5次的结果。
此外,我们会发现在test_results文件夹中会有一些图片。打开图片是部分时间序列的真实值和预测值的折线图。但是这个我们可以不用太在意,后面可以自己画所有的预测值和真实值的图。
(3)预测结果解读
首先自己创建一个.py文件,用来读取并查看预测值的形状。.npy文件都要实验numpy加载数据奥。代码如下所示:
import numpy as np
csv_path = "long_term_forecast_test_DLinear_custom_ftMS_sl96_ll48_pl96_dm32_nh8_el2_dl1_df32_expand2_dc4_fc3_ebtimeF_dtTrue_test_0"
preds = np.load(csv_path + "\\pred.npy")
true = np.load(csv_path + "\\true.npy")
print(preds.shape)
然后我们会发现数据是一个三维的(preds和true形状一致),例如我的数据形状是(2000, 96, 1),其中2000代表测试集样本数量(其中每个样本代表每个时间点),96代表在每一个测试集时间点上向未来预测了96步,1代表预测的变量数量。因此,我们得到了2000 * 96 个预测值。
假设我们要未来1步预测的结果,则只需要提取preds[:,0,0]
即可,其中:
代表所有样本,0代表第一个时间点,0代表第一个变量。同理,true[:,0,0]
代表真实值。这样我们可以得到测试集预测值结果的一维数组。如果未来2步预测值,则提取preds[:,1,0]
和preds[:,1,0]
即可。
以下提供一个简陋的可视化代码,可以画出一步预测的折线图结果。
plt.plot(preds[:,0,0],label='preds')
plt.plot(true[:,0,0],label='true')
plt.legend()
plt.show()
方法二:命令行输入参数
如前文所说,我们还有第二种方法改代码,就是直接在命令行指定参数,这样不管默认值 default 是多少,都只会使用命令行指定的参数。这一部分小编将结合 租服务器+使用shell批量跑模型 场景来阐述。
(1) 租服务器 和 配置环境
如果对租服务器不太了解可以参考小编之前的文章【小白练手教程】低成本练手部署多模态大语言模型 通义千问(附代码),只需要看租服务器和配置环境部分即可。注意配置环境的命令如方法一中所示奥,即在终端中输入pip install -r requirements.txt
。
(2) 使用shell批量跑模型
因为租服务器都是使用linux系统,所以需要使用shell脚本批量跑模型。如图5所示,在TSLib中的scripts文件夹中有许多shell脚本,随便打开一个,可以看到我们需要配置的参数的命令行设置。一个shell脚本中可以有多个命令,意味着我们跑一个脚本,可以跑多次参数不同的run.py文件。
那么shell脚本准备好之后如何跑呢?只需要在终端terminal中输入命令sh ./run.sh
即可。其中run.sh是shell脚本文件名,./run.sh是shell脚本路径。
结语
现在大家可以动手尝试一下啦,有什么问题欢迎留言奥。