目录
摘要
Abstract
文献阅读
问题引入
研究背景
研究意义
研究目的
实验方法
TimeGAN
数据增强
预测模型的独立性
创新点
实验研究
数据准备
合成数据分析
模型比较
总结
摘要
该文献围绕利用 TimeGAN 提高供热变电站热负荷预测精度展开。结构上,依次阐述研究背景、材料与方法、结果与讨论和结论。特点在于首次将 TimeGAN 应用于供热领域进行数据增强。优势是能生成高质量数据,对异常现象有屏蔽作用。应用于新供热变电站及供热中期和末期数据不足的场景,原因是这些情况下传统方法难以获取足够高质量数据 。效果比较显示,新站初期数据扩充 3 倍时模型误差可降 50%,中期和末期扩充至 15,000 - 30,000 时误差降低 3% - 8%。未来改进方向是确定更精准的最优添加数据量。总体而言,TimeGAN 有效提升了预测精度,为供热负荷预测提供了新途径。
Abstract
This literature focuses on using TimeGAN to improve the accuracy of heat load forecasting in heating substations. Structurally, explain the research background, materials and methods, results and discussions, and conclusions in sequence. The feature is the first application of TimeGAN for data augmentation in the heating field. The advantage is that it can generate high-quality data and has a shielding effect on abnormal phenomena. Applied to new heating substations and scenarios where there is insufficient data during the mid-term and final stages of heating, the reason is that traditional methods are difficult to obtain sufficiently high-quality data in these situations. Comparison of results shows that when the initial data of the new station is expanded by three times, the model error can be reduced by 50%, and when expanded to 15000-30000 in the middle and late stages, the error can be reduced by 3-8%. The future improvement direction is to determine a more accurate optimal amount of added data. Overall, TimeGAN effectively improves prediction accuracy and provides a new approach for heating load forecasting.
文献阅读
title:Data augmentation for improving heating load prediction of heating substation based on TimeGAN
https://www.sciencedirect.com/science/article/abs/pii/S0360544222018205
问题引入
研究背景
准确的供热负荷预测,能够帮助操作人员制定合理的参数,减少能源浪费。其性能高度依赖于训练数据的数量和质量,如新建供热子站和供热末期,无法提供足够的高质量数据用于模型训练,导致模型精度较低。因此,解决数据不足问题对于提高供热负荷预测精度至关重要。
研究意义
通过引入TimeGAN进行数据增强,本文不仅有效解决了新建供热子站和供热末期数据不足的问题,还显著提高了供热负荷预测的精度。
研究目的
首次将TimeGAN应用于供热领域,旨在通过生成高质量的时间序列数据来解决数据不足问题,并提高供热负荷预测模型的精度。具体目标包括:1、仅使用供热初期两天的数据建立高精度预测模型,解决新建供热子站缺乏历史数据的问题;2、提高供热中期和末期的预测精度,尤其是在数据量较少的情况下;3、以及确定TimeGAN与SVR、XGB和RF模型融合后的最佳训练数据量,以优化模型性能。
实验方法
TimeGAN
TimeGAN是一种结合生成对抗网络(GAN)和序列生成模型优点的时间序列生成模型。该模型的主要组件包括嵌入网络、生成器、判别器和有监督网络。
GAN
上述模型主要包含三大部分:生成器、判别器和损失函数
生成器:它的输入是随机噪声向量,然后经过简单的分布,最终得到生成器生成的合成数据
判别器:它的输入主要是真实数据和合成数据,然后同样经过简单的分布,最终对输入的两类数据进行判别
损失函数:它的目的就是训练生成器和判别器,使得生成器能生成更接近真实数据的合成数据,并且判别器能够更准确的辨别两类数据
自动编码器
自动编码器是一种无监督学习模型,主要用于数据的压缩和特征学习。 它包含三部分:编码器、解码器和隐藏层。自编码器的训练目标是最小化重建误差,通常通过某种损失函数(如均方误差)来衡量。
TimeGAN就是结合上述两个框架(GAN+Autoencoder),不仅如此,它相较于GAN的普通对抗损失之外,还增加了一个有监督的损失机制,目的就是为了指导生成器生成更加准确的合成数据,它的构建也是基于自编码器的重建误差。
代码设计
1)TimeGAN的设计
import tensorflow as tf
import numpy as np# 生成器网络
class Generator(tf.keras.Model):def __init__(self, hidden_dim, output_dim):super(Generator, self).__init__()self.dense1 = tf.keras.layers.Dense(hidden_dim, activation='relu')self.dense2 = tf.keras.layers.Dense(hidden_dim, activation='relu')self.dense3 = tf.keras.layers.Dense(output_dim)def call(self, inputs):x = self.dense1(inputs)x = self.dense2(x)return self.dense3(x)# 判别器网络
class Discriminator(tf.keras.Model):def __init__(self, hidden_dim):super(Discriminator, self).__init__()self.dense1 = tf.keras.layers.Dense(hidden_dim, activation='relu')self.dense2 = tf.keras.layers.Dense(hidden_dim, activation='relu')self.dense3 = tf.keras.layers.Dense(1)def call(self, inputs):x = self.dense1(inputs)x = self.dense2(x)return self.dense3(x)# 嵌入网络
class Embedder(tf.keras.Model):def __init__(self, hidden_dim):super(Embedder, self).__init__()self.dense1 = tf.keras.layers.Dense(hidden_dim, activation='relu')self.dense2 = tf.keras.layers.Dense(hidden_dim)def call(self, inputs):x = self.dense1(inputs)return self.dense2(x)# 恢复网络
class Recovery(tf.keras.Model):def __init__(self, hidden_dim, output_dim):super(Recovery, self).__init__()self.dense1 = tf.keras.layers.Dense(hidden_dim, activation='relu')self.dense2 = tf.keras.layers.Dense(output_dim)def call(self, inputs):x = self.dense1(inputs)return self.dense2(x)# 时间鉴别器网络
class Supervisor(tf.keras.Model):def __init__(self, hidden_dim):super(Supervisor, self).__init__()self.dense1 = tf.keras.layers.Dense(hidden_dim, activation='relu')self.dense2 = tf.keras.layers.Dense(hidden_dim)def call(self, inputs):x = self.dense1(inputs)return self.dense2(x)# TimeGAN 模型
class TimeGAN(tf.keras.Model):def __init__(self, hidden_dim, output_dim):super(TimeGAN, self).__init__()self.generator = Generator(hidden_dim, output_dim)self.discriminator = Discriminator(hidden_dim)self.embedder = Embedder(hidden_dim)self.recovery = Recovery(hidden_dim, output_dim)self.supervisor = Supervisor(hidden_dim)def call(self, z):return self.generator(z)
2)模型的训练
# 训练 TimeGAN
def train_timegan(model, data, epochs, batch_size, learning_rate):optimizer = tf.keras.optimizers.Adam(learning_rate)for epoch in range(epochs):for i in range(0, len(data), batch_size):batch = data[i:i + batch_size]z = np.random.normal(size=(len(batch), data.shape[1], data.shape[2]))# 训练嵌入网络和恢复网络with tf.GradientTape() as tape:h = model.embedder(batch)x_tilde = model.recovery(h)e_loss0 = tf.reduce_mean(tf.square(batch - x_tilde))variables = model.embedder.trainable_variables + model.recovery.trainable_variablesgradients = tape.gradient(e_loss0, variables)optimizer.apply_gradients(zip(gradients, variables))# 训练监督器with tf.GradientTape() as tape:h = model.embedder(batch)h_hat_supervised = model.supervisor(h[:, :-1, :])s_loss = tf.reduce_mean(tf.square(h[:, 1:, :] - h_hat_supervised))variables = model.supervisor.trainable_variablesgradients = tape.gradient(s_loss, variables)optimizer.apply_gradients(zip(gradients, variables))# 训练生成器和鉴别器for k in range(2):# 训练生成器with tf.GradientTape() as tape:h_hat = model.generator(z)h_hat_supervised = model.supervisor(h_hat[:, :-1, :])d_fake = model.discriminator(h_hat)g_loss_u = -tf.reduce_mean(d_fake)g_loss_s = tf.reduce_mean(tf.square(h_hat[:, 1:, :] - h_hat_supervised))h = model.embedder(batch)x_tilde = model.recovery(h_hat)g_loss_v = tf.reduce_mean(tf.square(batch - x_tilde))g_loss = g_loss_u + 100 * tf.sqrt(g_loss_s) + 100 * g_loss_vvariables = model.generator.trainable_variables + model.supervisor.trainable_variablesgradients = tape.gradient(g_loss, variables)optimizer.apply_gradients(zip(gradients, variables))# 训练鉴别器with tf.GradientTape() as tape:h = model.embedder(batch)d_real = model.discriminator(h)h_hat = model.generator(z)d_fake = model.discriminator(h_hat)d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_real, labels=tf.ones_like(d_real)))d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_fake, labels=tf.zeros_like(d_fake)))d_loss = d_loss_real + d_loss_fakevariables = model.discriminator.trainable_variablesgradients = tape.gradient(d_loss, variables)optimizer.apply_gradients(zip(gradients, variables))print(f'Epoch {epoch + 1}/{epochs}, E_loss: {e_loss0.numpy()}, S_loss: {s_loss.numpy()}, G_loss: {g_loss.numpy()}, D_loss: {d_loss.numpy()}')
数据增强
数据增强是一种技术,通过对现有数据进行各种变换和处理来生成新的训练样本,从而增加数据集的多样性和数量。用来改善数据缺乏的问题
该文献中使用“基于生成模型”的方法来实现数据的扩增。
下面是使用了“数据增强“的供热负荷和室内温度的变化图:
在整个时间序列的初期,数据量较少,通过生成多个类似于真实数据集的合成数据来增强模型的学习效果;在供热中期,GAN模型生成合成数据,用来补充和丰富数据集;在供热后期,发电机已经比较了解热负荷的不同特性,此时增加数据来达到优化模型的效果。
# 数据增强函数
def data_augmentation(model, original_data, num_samples):z = np.random.normal(size=(num_samples, original_data.shape[1], original_data.shape[2]))generated_data = model(z)augmented_data = np.concatenate([original_data, generated_data.numpy()], axis=0)return augmented_data
预测模型的独立性
上面利用TimeGAN模型解决了数据增强的问题,接下来就要进行机器学习预测模型的评估
SVR
SVR,支持向量回归(Support Vector Regression),是一种基于支持向量机(SVM)的回归方法。它的核心思想是找到一个尽可能平滑的超平面,使得数据点尽可能地被这个超平面所拟合,同时允许一定的误差。
RF
RF模型属于集成学习中的bagging流派。核心思想是通过引入随机性来降低模型的方差,从而避免过拟合。
XGB
XGBoost(eXtreme Gradient Boosting)是一种强大的集成学习算法,广泛应用于分类和回归任务。它通过结合多个弱学习器(通常是决策树)来构建一个强大的预测模型,具有高效性和高准确性的特点。核心思想是通过梯度提升逐步减少预测误差。
性能评估
创新点
首次应用 TimeGAN 解决供热数据问题
开创性地将 TimeGAN 算法应用于供热领域,针对供热数据的时间序列特性,生成高质量的时间序列和多特征数据,填补了该领域数据增强研究的空白。
显著提升新站及不同供热阶段模型精度
仅用供热初期两天的数据,借助 TimeGAN 扩展原始数据集,就能大幅提升模型预测精度,新站模型误差最多可降低 50%。对于供热中期和末期,当数据扩充到 15,000 - 30,000 时,预测误差可降低 3% - 8%。相比现有研究,该方法有效改善了不同供热阶段模型精度较低的问题,提高了模型的实用性和可靠性。
实验研究
数据准备
滑动窗口法是机器学习和数据分析中一种常用的技术,特别是在处理时间序列数据时。它能够让我们从连续的数据流中提取有用的信息,实现数据的局部分析。核心思想是通过在序列数据上定义一个固定大小的窗口,窗口将在数据序列上进行移动。每次移动窗口时,我们可以从窗口中提取特征并执行某种机器学习算法。
合成数据分析
首先选取同样数量的样本数据和合成数据,在供热序列的前期、中期和后期二者的拟合情况
可以看出,在供热初期和末期,合成数据与真实数据的趋势较为一致,尤其是在初期表现最优;但是在供热中期,合成数据的分布和斜率与真实数据相比有较大差异。
针对上述在供热中期差异较大的问题,中期圈内的真实数据未被合成数据所覆盖,有可能是数据异常导致模型并未学习到该圈内的特征。所以单独挑出异常样本分析:
在上图中可以明显的看出,供热负荷和室内温度具有基本一致的变化曲线,这不符合常理,所以模型未能学习到这一异常是有好处的,可能TimeGAN模型对该种异常具有自动屏蔽的特性。
为了进一步检测合成数据的可靠性,选取了一段连续时间内的真实数据和合成数据的”供热负荷“和”室内温度“进行趋势对比:
结果表明,真实数据和合成数据基本能够保持一致起伏,并且两个特征的相关性也是符合常理的。
模型比较
三种预测模型在给其数据集中不断加入合成数据的结果比较如下:
对于上述的所有模型来说,在适量增加合成数据的情况下,模型性能都会提高;在相同数量的合成数据下,XGB和RF模型的性能通常优于SVR模型,这可能与模型的特性和数据集的适应性有关。
上面是利用CV-RMSE来衡量模型的好坏,接下来直观的将真实数据、没有添加合成数据的3种预测模型的预测结果、添加了合成数据的3种预测模型的预测结果进行对比:
初期
合成数据对于提高供热负荷预测的准确性具有重要作用,尤其是在数据不足的供热初期。不同的机器学习模型对合成数据的利用效果不同,但总体上,XGB模型表现最佳。
末期
末期的结果同初期。
总结
本文献创新性地应用了TimeGAN来增强供热负荷预测的数据集,解决了因数据不足导致的预测准确度问题。研究者们利用TimeGAN生成的合成数据,结合真实数据训练了三种机器学习模型:支持向量回归(SVR)、随机森林(RF)和极端梯度提升(XGB)。实验结果表明,TimeGAN生成的数据有效提升了模型预测精度,尤其是在供热初期,且存在一个最优的合成数据添加量。这项研究不仅提高了供热负荷预测的准确性,也为数据增强技术在类似领域的应用提供了新的思路。