目錄
摘要
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生成的數據有效提升了模型預測精度,尤其是在供熱初期,且存在一個最優的合成數據添加量。這項研究不僅提高了供熱負荷預測的準確性,也為數據增強技術在類似領域的應用提供了新的思路。?