【清华时间序列库】无基础可入:快速跑通自定义数据集(二)

前言

目标人群:针对使用时间序列数据做预测、分类、插值和异常检测等任务的新手

文章目的:帮助新手快速上手清华时间序列库,跑通自定义数据集。

在清华时间序列库(TSLib)系列的第一篇教程中,我们了解了TSLib库的主程序 run.py文件中的大部分内容,而这篇教程则是关于如何使用自己的数据集,通过TSLib库进行训练和预测。

系列教程链接

【清华时间序列库】无基础可入:面向对象编程的TSLib主程序run.py解析(一)

数据集准备

TSLib库支持的数据集格式为csv文件,需要注意以下两点:

  1. 第一列为时间戳,并且第一列列名必须为date
  2. 最后一列为目标变量。
  3. 虽然csv文件中包含空值(缺失值)也能跑通代码,但是还是建议先把csv文件中的缺失值以及异常值处理一下。

以下是一个简单的csv文件示例,其中第一列为时间戳,列名为date,第二列是广告花费,作为预测销量的影响因素,最后一列为目标变量,即销量:

datead_spendsales
2023-01-0150120
2023-01-0270150
2023-01-0340100
2023-01-0460130
2023-01-0580160
2023-01-0655125
2023-01-0765140

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,安装相关的库。

在这里插入图片描述

图1:安装相关的库步骤

主程序代码修改

我们有两种修改方式,一种是直接改默认值,另一种是直接在命令行中输入参数,这种方法会在租服务器跑代码部分进行讲解。接下来先介绍第一种方式。

方法一:直接修改默认值

打开主程序 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的长度即可。

在这里插入图片描述

图2:seq_len、label_len、pred_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_indec_inc_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_modeld_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)

在这里插入图片描述

图3:保存模型地址

(2)预测结果位置

预测结果保存位置为 results文件夹,和模型保存结果一样,内部含有多个子文件夹,由setting变量命名,因此我们可以将保存的模型和预测结果根据文件名称一一对应起来。results文件夹中的文件结构如图4所示。可以看到子文件夹中包含真实值true.npy数据和预测值pred.npy数据。有人可能注意到,子文件夹名称最后一位数字总是从0-4,这是因为我设置的参数itr为5,代表实验5次,代码自动保存了5次的结果。

在这里插入图片描述

图4:预测结果位置

此外,我们会发现在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脚本路径。

在这里插入图片描述

图5:shell脚本

结语

现在大家可以动手尝试一下啦,有什么问题欢迎留言奥。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值