DAY 55 序列预测任务介绍
知识点回顾
- 序列预测介绍
- 单步预测
- 多步预测的2种方式
- 序列数据的处理:滑动窗口
- 多输入多输出任务的思路
- 经典机器学习在序列任务上的劣势;以随机森林为例
一、序列预测任务介绍
1.1 序列预测是什么?
我们之前接触到的结构化数据,它本身不具备顺序,我们认为每个样本之间独立无关,样本之间即使调换顺序,仍然不影响模型的训练。
但是日常中很多数据是存在先后关系的,而他们对应的任务是预测下一步的值,我们把这个任务称之为序列预测。
举个例子,比如有过去30天的股票价格,我们希望预测第31天的价格。比如之前的单车预测,有前60天的单车需求数据,希望预测后面20天的销量。或者文本,人的语言是有顺序的,预测下一个单词是这也是序列预测任务。
1.2 序列预测的x-y对
那么如何把之前结构化的数据,转化为序列的样子呢?
答案就是通过滑动窗口这个方式来实现。序列任务也需要有自己的数据对,这样才符合监督学习的训练。把原始数据序列,转化为x-y这样的标签对,实现用前seq_length个时间步预测下一个时间步的监督学习格式。
假设原始数据 data = [10, 20, 30, 40, 50, 60, 70, 80, 90],序列长度 seq_length = 3,这个x-y序列对如下
```python
X = [
[10, 20, 30], # 用前3步预测第4步
[20, 30, 40], # 用2-4步预测第5步
[30, 40, 50], # 用3-5步预测第6步
[40, 50, 60], # 用4-6步预测第7步
[50, 60, 70], # 用5-7步预测第8步
[60, 70, 80] # 用6-8步预测第9步
]
y = [40, 50, 60, 70, 80, 90] # 每个X对应的下一个值
```
其中第一个x-y对是[10, 20, 30]-->[40],第二个x-y对是[20, 30, 40]-->[50],第三个x-y对是[30, 40, 50]-->[60],第四个x-y对是[40, 50, 60]-->[70],第五个x-y对是[50, 60, 70]-->[80],第六个x-y对是[60, 70, 80]-->[90]。这个样本对,和我们之前结构化数据见到的样本-标签对 是一个逻辑。
注意,最后三个值 [70, 80, 90] 不能作为输入(因为没有后续值作为目标),所以生成的样本数为 len(data) - seq_length = 9 - 3 = 6
```python
可以把上述过程理解为一个尺寸为3的窗口在滑动的过程(类似于卷积核滑动),
滑动窗口过程:
[10, 20, 30] → 40
[20, 30, 40] → 50
[30, 40, 50] → 60
[40, 50, 60] → 70
[50, 60, 70] → 80
[60, 70, 80] → 90
```
1.3 序列预测的标准输入
一个标准的序列数据张量通常具有三个维度:[批量大小, 序列长度, 特征维度]
批量大小 (Batch Size):一次性喂给模型多少个独立的样本进行处理
序列长度 (Sequence Length / Timesteps):每个样本的序列长度,即该样本的序列长度是多少
二、基础概念
2.1 准备工作
# 准备工作
import numpy as np
import random
import os
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
# 显示中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 显示负号正常
plt.rcParams['axes.unicode_minus'] = False
import warnings
warnings.filterwarnings("ignore")
# 设置随机种子确保结果可复现,全局随机函数
def set_seed(seed=42, deterministic=True):
"

最低0.47元/天 解锁文章
769

被折叠的 条评论
为什么被折叠?



