74_time_series_tcn 理论代码理解

本文介绍了如何使用TCN模型对新冠疫情每日新增病例数据进行一阶差分处理,通过MinMaxScaler进行数据归一化,并构建时间序列预测模型。关键步骤包括数据截取、差分处理、特征工程和模型构建,以提高预测精度和稳定性。
摘要由CSDN通过智能技术生成

df = df_all.iloc[:, 4:]
daily_cases = df.sum(axis=0)
daily_cases.index = pd.to_datetime(daily_cases.index)
daily_cases.head()

截取数据,并且做相加

daily_cases = daily_cases.diff().fillna(daily_cases[0]).astype(np.int64)
daily_cases.head()

为了提高样本时间序列的平稳性,我们继续取一阶差分。

scaler = MinMaxScaler()
train_data = scaler.fit_transform(np.expand_dims(train_data, axis=1)).astype('float32')
test_data = scaler.transform(np.expand_dims(test_data, axis=1)).astype('float32')

为了提升模型收敛速度与性能,我们使用scikit-learn进行数据归一化。

true_cases = scaler.inverse_transform(
    np.expand_dims(y_test.flatten(), axis=0)
).flatten()

predicted_cases = scaler.inverse_transform(
  np.expand_dims(np.array(preds).flatten(), axis=0)
).flatten()

将归一化的数据转换为原始数据,画出真实值对应的曲线和预测值对应的曲线。

 def _create_sequences(self, data):
        xs = []
        ys = []

        for i in range(len(data) - self.seq_length + 1):
            x = data[i:i + self.seq_length - 1]
            y = data[i + self.seq_length - 1]
            xs.append(x)
            ys.append(y)

前面时间的数据作为输入序列,预测下一个输出,类别语言模型一样,根据前面的词,预测下一个词
前面时 间
面时间 的
类似这样的X和Y而已,因为是数据那就是回归

现在开始组建模型网络,我们采用时间卷积网络TCN作为特征提取器,将提取到的时序信息传送给全连接层获得最终的预测结果。

全连接层有线性和非线性的运算,得到的值就是回归值,和实际值做均方差运算。
在这里插入图片描述

 self.train_data = daily_cases[:-self.test_data_size]
 self.scaler = self.scaler.fit(np.expand_dims(self.train_data, axis=1))

就是类比文本语言模型自监督学习一样,有前面时刻的连续词,预测后面的词
在这里插入图片描述
类似每条数据都是一个样本,由前面的连续样本预测后面的样本,总共558个样本,没个样本的特征维度目前就是1维,就是感染新冠数量差分值
在这里插入图片描述
没个样本只有感染新冠数一个特征,有其他特征直接拼接到后面的维度即可
在这里插入图片描述
有连续的7个样本,没个样本的特征是1维去预测第8个时刻的值
在这里插入图片描述
带空洞卷积的时序卷积,扩大不同的感受野

    def init_weights(self):
        self.conv1.weight.set_value(
            paddle.tensor.normal(0.0, 0.01, self.conv1.weight.shape))
        self.conv2.weight.set_value(
            paddle.tensor.normal(0.0, 0.01, self.conv2.weight.shape))
        if self.downsample is not None:
            self.downsample.weight.set_value(
                paddle.tensor.normal(0.0, 0.01, self.downsample.weight.shape))

卷积层参数初始化
在这里插入图片描述

        self.tcn = TCNEncoder(
            input_size=input_size,
            num_channels=num_channels,
            kernel_size=kernel_size,
            dropout=dropout)

        self.linear = nn.Linear(
            in_features=self.last_num_channel, out_features=next_k)

经过三个循环的不同程度的卷积操作后,得到最终的输出维度为256维,通过全连接层变成1维即可
在这里插入图片描述
最开始的维度就是1维,和输入的原始数据为一个维度是对应的,这里是纯数字,没有语义信息,没有做类似语言模型的向量扩展,而是直接通过卷积扩展向量维度。
在这里插入图片描述
和常规的一样,也是可以batch_size组合起来运算
在这里插入图片描述
前面是batch_size,中间是维度大小,后面是样本长度,由于感受野的扩大,后面的长度会随着有变动
在这里插入图片描述
刚好进行了说明
在这里插入图片描述
计算loss
在这里插入图片描述
要增加维度,第一个更改数据输入
在这里插入图片描述
第二个更改网络结构,输入的特征维度做对应的改变
在这里插入图片描述
在这里插入图片描述
要预测未来N天,更改这个两个地方,循环遍历一个batch_size为1的样本,不断的预测然后添加到test,不断的添加预测即可

要轻松的为自己所用,可定制化的二次开发, 必须要深入进去读源码,DEBUG源码,把数据流的类型,维度,数值变化过程弄清楚,就清晰了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值