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,不断的添加预测即可