zhouhaoyi / Informer2020

The GitHub repository for the paper "Informer" accepted by AAAI 2021.
Apache License 2.0
5.27k stars 1.1k forks source link

求各位老师解答!我是做锂离子电池寿命预测方向的,如果我的数据总长度是800,参数设置里面的seq,lable和pred设置成96,48,24;数据分割是0.7,0.2,是不是预测20%的数据,每次预测24个点? #562

Closed nixcty closed 11 months ago

Kregion commented 11 months ago

请问你是做循环寿命预测吗?我也是做寿命预测,但是循环寿命的话感觉实际工况下用处不大。。。如果是800数据点的话,应该要做滑动窗口,取窗口大小seq=96,然后label=72, pred=24,这样子吧。

nixcty commented 11 months ago

您好我是做SOH预测的,如果参数设置成96,72,24的话,预测出来的结果绘图只有24个点,可我是想让它从第70%的点开始预测后面的数据,24太少了。

hereistheusername commented 11 months ago
    def __getitem__(self, index):
        s_begin = index
        s_end = s_begin + self.seq_len
        r_begin = s_end - self.label_len 
        r_end = r_begin + self.label_len + self.pred_len

        seq_x = self.data_x[s_begin:s_end]
        seq_y = self.data_y[r_begin:r_end]
        seq_x_mark = self.data_stamp[s_begin:s_end]
        seq_y_mark = self.data_stamp[r_begin:r_end]

        return seq_x, seq_y, seq_x_mark, seq_y_mark

    def __len__(self):
        return len(self.data_x) - self.seq_len- self.pred_len + 1

这里是dataset_custom部分代码:可以看出seq_x就是seq_len在你的数据上划出的一段数据,然后去对照生成长为 $label\_len + pred\_len$ 的seq_y。注意,对于同一个index值,seq_y相对于seq_x晚 $seq\_len - label\_len$ 个时刻。所以,batch 内的一个小项需要在你的数据上取值长度为 $seq\_len + 2 \times label\_len + pred\_len$ 滑动窗口的数据。

无论是(seq, label, pred) = (96, 72, 24) 还是 (96, 48, 24) 在 $800 \times 0.2 = 160$ 的测试数据长度上都取不满一次完整测试数据。后续因为其他原因,你的数据还是补全成满足要求的形状,最后输出一次pred_len的数据。

import numpy as np
t = np.random.rand(6)
t[6: 10] # no out_of_range error
Kregion commented 11 months ago

您好我是做SOH预测的,如果参数设置成96,72,24的话,预测出来的结果绘图只有24个点,可我是想让它从第70%的点开始预测后面的数据,24太少了。

应该可以预测24个点,然后用这24个点和前面48个点组成新的72个点,再预测接下来的24个点。。。这样子吧

hereistheusername commented 11 months ago
    def __getitem__(self, index):
        s_begin = index
        s_end = s_begin + self.seq_len
        r_begin = s_end - self.label_len 
        r_end = r_begin + self.label_len + self.pred_len

        seq_x = self.data_x[s_begin:s_end]
        seq_y = self.data_y[r_begin:r_end]
        seq_x_mark = self.data_stamp[s_begin:s_end]
        seq_y_mark = self.data_stamp[r_begin:r_end]

        return seq_x, seq_y, seq_x_mark, seq_y_mark

    def __len__(self):
        return len(self.data_x) - self.seq_len- self.pred_len + 1

这里是dataset_custom部分代码:可以看出seq_x就是seq_len在你的数据上划出的一段数据,然后去对照生成长为 label_len+pred_len 的seq_y。注意,对于同一个index值,seq_y相对于seq_x晚 seq_len−label_len 个时刻。所以,batch 内的一个小项需要在你的数据上取值长度为 seq_len+2×label_len+pred_len 滑动窗口的数据。

无论是(seq, label, pred) = (96, 72, 24) 还是 (96, 48, 24) 在 800×0.2=160 的测试数据长度上都取不满一次完整测试数据。后续因为其他原因,你的数据还是补全成满足要求的形状,最后输出一次pred_len的数据。

import numpy as np
t = np.random.rand(6)
t[6: 10] # no out_of_range error

更正:batch内一个小项长度为 $seq\_len + pred\_len$。

所以,长度为 160 的 test set,能够生成 160 - (96 + 24) + 1 = 41项数据,然后在这基础上组成 batch。假设你使用batch_size=32,那么test set只会有一个batch(因为源码在设置test的 dataloader 的时候设置drop_last=True)。


测试集的预测结果与真实值会保存在./results/[对应实验文件夹]/[true|pred].npy,可以用来查看实验结果。如果你使用batch_size=32,那么这里面的ndarry应该是( batches, pred_len, features) = (num_sample - (num_sample % batch_size) = 1, 24, n_features)。

至于“预测结果 24 个点”,是不是在启动项目的时候加了'--do_predict'参数。这是out-of-sample prediction,batch_size=1,只用数据的末尾生成 pred_len长度的结果。

nixcty commented 11 months ago

多谢各位老师解惑!感激不尽!