时间序列
(长时序列的预测)
窗口滑动
短时预测:prophet(适合预测趋势),arima(短序列预测还算准确,但趋势不准)
长时预测:informer
基本定义:
规律性:长期趋势,季节变动,循环变动,不规则变动
叠加模型:时间序列图的波动保持恒定
乘积模型:序列的季节波动越来越大
三大基本模型:指数平滑模型,自回归模型(AR),滑动平均模型(MA),自回归滑动平均模型(ARMA)
传统方法
模型基本步骤
一.经典
1>时间序列分解
分解为三部分:趋势项,季节项,残差项,相加与乘法,对于乘法可以取对数变成相加项
2>常见分解方法
移动平均法:估计周期长度,以一周期为区间,对一块块数据取均值,得出趋势,然后使用原数据减趋势,求不同块数据的均值,得出周期,计算残差
X11:该方法的鲁棒性强,能处理时间序列中的异常值和数据突变
二.ARIMA
本质是AR+I+MA
要确定差分阶数,保证数据平稳。在确定AR,MA还是ARMA
可以通过网格搜索确定piq最优质,一般以AIC/BIC信息准则为变量
三.Holt模型
没有明显趋势和季节因素的数据可以使用简单指数平滑(一阶holt)
transformer
(QKV计算方法重构输入)
(注意力集中机制
Attention要快,decoder一次输出,堆叠encoder要快)
RNN(递归神经网络)
输入的数据不再是相互独立,后面的数据可能会对前面的产生影响
(时间序列不局限,还可以是文本数据,视频数据)
依旧是滑动窗口(马卡洛夫假设)
LTSM
模型的基本结构
class LSTM(nn.Module):
def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
super().__init__()
self.hidden_layer_size = hidden_layer_size
self.lstm = nn.LSTM(input_size, hidden_layer_size)
self.linear = nn.Linear(hidden_layer_size, output_size)
self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),
torch.zeros(1,1,self.hidden_layer_size)) # (num_layers * num_directions, batch_size, hidden_size)
def forward(self, input_seq):
lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
predictions = self.linear(lstm_out.view(len(input_seq), -1))
return predictions[-1]
- 数据处理可以使用MinMaxScaler缩放,效果更好
- 输入一般两种i形式:一种是以以为向量为每个时间步的输入,一种是以(年月日时分秒)n维向量输入
- 全连接层拼接在LSTM最后一个单元
- 一般仅支持单步预测(滑动窗口)
- 结合teacher-force和no-teacher-force(还不清楚是什么)
个人项目总结
序列平稳化检验(确定d值)
对序列绘图,进行ADF检验,然后可以进行一阶平稳化,二阶平稳化
检验值t大于三个level统计值则是非平稳的
确定p值和d值
1.p值由偏自相关系数PACF图的最大滞后点来判断,q值由自相关系数ACF图的最大之后点判断
2.遍历搜索AIC和BIC最小参数的组合
3.拟合ARIMA模型(p,d,q)
判定方法
残差判定
判断线性以及正态分布情况