首頁>技術>

在本文中,我們將看到深度混合學習如何應用於時間序列資料,以及它是否與影象資料一樣有效。

在這篇文章中,我將使用Kaggle的太陽黑子資料。如上所述,資料可以很容易地從GitHub專案TimeSeries-Using-TensorFlow下載。我鼓勵大家使用谷歌協作筆記本,因為所需的模組已經安裝好了,基礎設施也準備好了。現在,讓我們開始吧!

下載並載入資料

資料下載使用只需要一個簡單的命令-

!wget — no-check-certificate https://raw.githubusercontent.com/adib0073/TimeSeries-Using-TensorFlow/main/Data/Sunspots.csv -O /tmp/sunspots.csv

下載完成後,我們可以使用pandas將資料載入到資料幀中。

# Loading the data as a pandas dataframe df = pd.read_csv(‘/tmp/sunspots.csv’, index_col=0) df.head()

我們可以瀏覽一下資料,如下圖所示:

現在,我們應該做廣泛的探索性資料分析(EDA)來了解資料的趨勢和季節性。但在本例中,為了簡單起見,我們將對資料進行目視檢查。

準備資料

在這一步中,我們需要對載入的資料進行轉換和處理,以便將其作為輸入傳遞給深度混合學習模型,然後我們可以開始訓練過程。我們可以把時間序列預測看作是一個有序的機器學習迴歸問題,把時間序列資料轉換成一組特徵值和相應的真值或目標值。由於迴歸是一個監督學習問題,我們需要目標值,目標值中滯後的時間序列資料變成這樣的特徵值:

我們將採用視窗或緩衝區方法,其中我們必須考慮適當的視窗大小。然後我們將序列或序列資料的視窗從左到右移動。我們將把視窗框右邊的值作為目標值或真值。因此,每一次時間步,我們都會移動或移動視窗,以獲得新的一行特徵值和目標值對。這樣我們就形成了訓練資料和訓練標籤。以類似的方式,我們形成了測試和驗證資料集,這是機器學習預測模型通常需要的。另外,請記住,對於一個預測模型來說,擁有更寬的觀察視窗和更窄的預測視窗可以得到更好的結果。接下來,對於訓練測試驗證的分割比率,我們必須根據資料的大小計算出來。對於本例,我使用了0.8的分割比率,並且基於資料的季節性,我們將視窗大小設定為60。但是這些變數都是超引數,需要進行一些調整以獲得可能的最佳結果。

程式碼如下:

# Convert the data values to numpy for better and faster processing time_index = np.array(df['Date']) data = np.array(df['Monthly Mean Total Sunspot Number'])   # Certain Hyper-parameters to tune SPLIT_RATIO = 0.8 WINDOW_SIZE = 60 BATCH_SIZE = 32 SHUFFLE_BUFFER = 1000  # Dividing into train-test split split_index = int(SPLIT_RATIO * data.shape[0])   # Train-Test Split train_data = data[:split_index] train_time = time_index[:split_index]  test_data = data[split_index:] test_time = time_index[split_index:]

接下來,我們將準備一個為我們準備訓練和測試資料的資料生成器。

def ts_data_generator(data, window_size, batch_size, shuffle_buffer):  '''  Utility function for time series data generation in batches  '''  ts_data = tf.data.Dataset.from_tensor_slices(data)  ts_data = ts_data.window(window_size + 1, shift=1, drop_remainder=True)  ts_data = ts_data.flat_map(lambda window: window.batch(window_size + 1))  ts_data = ts_data.shuffle(shuffle_buffer).map(lambda window: (window[:-1], window[-1]))  ts_data = ts_data.batch(batch_size).prefetch(1)  return ts_data# Expanding data into tensorstensor_train_data = tf.expand_dims(train_data, axis=-1)tensor_test_data = tf.expand_dims(test_data, axis=-1)tensor_train_dataset = ts_data_generator(tensor_train_data, WINDOW_SIZE, BATCH_SIZE, SHUFFLE_BUFFER)tensor_test_dataset = ts_data_generator(tensor_test_data, WINDOW_SIZE, BATCH_SIZE, SHUFFLE_BUFFER)

現在,我們已經準備好將處理後的資料輸入到模型中。

建立DHL模型和訓練

我們將使用一個簡單版本的深度混合學習架構來解決這個問題。如前所述,我們將使用帶有後期融合技術的深度學習變體。模型架構是這樣的:

這裡我們使用一維CNN的組合模型提取初始序列特徵,然後結合2個LSTM層進行特徵提取部分,最後將其傳遞到傳統DNN全連線層,產生最終輸出。

模型架構的程式碼如下所示:

# DHL Fusion model of 1D CNN and LSTM model = tf.keras.models.Sequential([tf.keras.layers.Conv1D(filters=32, kernel_size=5,strides=1, padding="causal",activation="relu",input_shape=[None, 1]),tf.keras.layers.LSTM(64, return_sequences=True),   tf.keras.layers.LSTM(64, return_sequences=True),   tf.keras.layers.Dense(30, activation="relu"),  tf.keras.layers.Dense(10, activation="relu"),  tf.keras.layers.Dense(1)])

接下來,我們需要選擇其他超引數,如學習速率、最佳化器和損失函式。為了簡單起見,我在這篇文章中不涉及選擇這些值的問題。

optimizer = tf.keras.optimizers.SGD(lr=1e-4, momentum=0.9)model.compile(loss=tf.keras.losses.Huber(),              optimizer=optimizer,              metrics=["mae"])history = model.fit(tensor_train_dataset, epochs=200, validation_data=tensor_test_dataset)
模型評估

接下來我們將看到如何評估我們的模型。但首先,在訓練過程之後,繪製模型損失曲線來看看模型是否真的在學習。

從模型損失曲線,我們確實看到過擬合的明視訊記憶體在。在本文的最後,我將給出一些如何處理這個問題的提示,以使模型更好,但我們可以看到,隨著訓練時間的增加,模型損失在減少,這是一個很好的跡象,表明模型正在學習。

現在,對於模型評估,我們需要選擇一個度量標準。在以後的一篇文章中,我將包括時間序列資料的各種模型評估指標。但在這種情況下,我們將使用MAE作為度量標準。

def model_forecast(model, data, window_size):    ds = tf.data.Dataset.from_tensor_slices(data)    ds = ds.window(window_size, shift=1, drop_remainder=True)    ds = ds.flat_map(lambda w: w.batch(window_size))    ds = ds.batch(32).prefetch(1)    forecast = model.predict(ds)    return forecastrnn_forecast = model_forecast(model, data[..., np.newaxis], WINDOW_SIZE) rnn_forecast = rnn_forecast[split_index - WINDOW_SIZE:-1, -1, 0]# Overall Errorerror = tf.keras.metrics.mean_absolute_error(test_data, rnn_forecast).numpy()print(error)

我們得到的MAE值大約是40。這還不錯,但對這個案子來說有點高了。模型誤差更大的原因是我們看到的初始過擬合。

模型結果視覺化

作為最後一步,讓我們將透過測試資料得到的結果視覺化,並檢查模型是否接近,以預測良好的結果。

從第一張圖可以看出,預測值與實際值的季節變化規律和趨勢是相似的,但峰值沒有實際值高。同時,由於時間序列預測應該是區間預測而不是單點估計,我們將使用錯誤率來形成置信區間或置信帶。我們可以看到誤差帶很寬,這意味著模型的置信度不高,可能會有一些預測誤差。

視覺化的程式碼如下:

plt.figure(figsize=(15, 6))  plt.plot(list(range(split_index,len(data))), test_data, label = 'Test Data') plt.plot(list(range(split_index,len(data))), rnn_forecast, label = 'Predictions') plt.legend() plt.show()  plt.figure(figsize=(15, 6)) # Plotting with Confidence Intervals plt.plot(list(range(split_index,len(data))), rnn_forecast, label = 'Predictions', color = 'k', linestyle = '--')plt.fill_between(range(split_index,len(data)), rnn_forecast - error, rnn_forecast + error, alpha = 0.5, color = 'orange') plt.legend() plt.show()

我們有一個用於時間序列預測的深度混合學習模型,我們使用TensorFlow來形成模型並實現流。

但如果你想知道如何提高結果,我有以下建議:

1. 更改視窗大小(增加或減少)

1. 使用更多的訓練資料(以解決過擬合問題)

1. 使用更多的模型層或隱藏的單元

1. 使用不同的損失函式和學習速率

1. 我們看到損失曲線不是平滑的。如果批處理規模很小,通常會發生這種情況,所以嘗試使用更大的批處理規模。

有時,更簡單的模型可能會得到更好的結果。在我使用TensorFlow的深度學習進行後期時間序列預測時,我只使用了一個簡單的深度神經網路就得到了更好的結果。現在,不同於影象資料,我們看到,在時間序列資料中,深度混合學習並不比傳統的深度學習、機器學習或統計方法好多少。但是,在做了徹底的超引數調優之後,我確信結果會更好!

原始碼地址:github.com/adib0073/TimeSeries-Using-TensorFlow

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 第10天 | 14天搞定Vue3.0,Vue3.0小專案實戰