最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

拓端tecdat|R語言基于遞歸神經(jīng)網(wǎng)絡RNN的溫度時間序列預測

2021-07-11 10:58 作者:拓端tecdat  | 我要投稿

原文鏈接:http://tecdat.cn/?p=20335?

原文出處:拓端數(shù)據(jù)部落公眾號

在本文中,我們將介紹三種提高循環(huán)神經(jīng)網(wǎng)絡性能和泛化能力的高級技術(shù)。我們演示有關溫度預測問題的三個概念,我們使用建筑物屋頂上的傳感器的時間數(shù)據(jù)序列。

概述

在本文中,我們將介紹三種提高循環(huán)神經(jīng)網(wǎng)絡性能和泛化能力的高級技術(shù)。在最后,您將了解有關將循環(huán)網(wǎng)絡與Keras一起使用的大部分知識。您可以訪問來自建筑物屋頂上的傳感器的時間數(shù)據(jù)序列,例如溫度,氣壓和濕度,這些數(shù)據(jù)點可用于預測最后一個數(shù)據(jù)點之后24小時的溫度。這是一個相當具有挑戰(zhàn)性的問題,它說明了使用時間序列時遇到的許多常見困難。

我們將介紹以下技術(shù):

  • ?刪除層/每層的單位數(shù)(模型) 如L1或L2正則化所述,過度復雜的模型更有可能過度擬合,可以使用刪除來抵抗重復圖層的過擬合。

  • 堆疊循環(huán)層?—這增加了網(wǎng)絡的表示能力(以更高的計算負荷為代價)。

  • 雙向循環(huán)層?—這些層以不同的方式向循環(huán)網(wǎng)絡提供相同的信息,從而提高準確性。

溫度預測問題

在本節(jié)的所有示例中,您將使用生物地球化學研究所的氣象站記錄的?天氣時間序列數(shù)據(jù)集。

在此數(shù)據(jù)集中,幾年中每10分鐘記錄14個不同的量(例如空氣溫度,大氣壓力,濕度,風向等)。原始數(shù)據(jù)可追溯到2003年,但此示例僅限于2009-2016年的數(shù)據(jù)。該數(shù)據(jù)集非常適合學習使用數(shù)字時間序列。您將使用它來構(gòu)建一個模型,該模型將最近的一些數(shù)據(jù)(幾天的數(shù)據(jù)點)作為輸入,并預測未來24小時的氣溫。

下載并解壓縮數(shù)據(jù),如下所示:


  1. unzip(

  2. "climate.csv.zip",

  3. exdir = "~/Downloads/climate"

  4. )

我們看一下數(shù)據(jù)。

  1. library(tibble)

  2. library(readr)


  3. glimpse(data)

這是溫度(攝氏度)隨時間變化的曲線圖。在此圖上,您可以清楚地看到溫度的年度周期。


  1. ggplot(data, aes(x = 1:nrow(data), y = `degC`)) + geom_line()

這是溫度數(shù)據(jù)的前10天變化圖。由于數(shù)據(jù)每10分鐘記錄一次,因此您每天可獲得144個數(shù)據(jù)點。

ggplot(data[1:1440,], aes(y = `degC`)) + geom_line()

如果您根據(jù)過去幾個月的數(shù)據(jù)來嘗試預測下個月的平均溫度,由于數(shù)據(jù)的年度周期性可靠,因此問題很容易解決。但是從幾天的數(shù)據(jù)來看,溫度更加混亂。這個時間序列每天都可以預測嗎?

準備數(shù)據(jù)

問題的確切表達如下:給定的數(shù)據(jù)可以追溯到?lookback?時間步長(一個時間步長為10分鐘)并在每個steps?時間步長處進行采樣?,您可以預測該delay?時間步長中的溫度?嗎?使用以下參數(shù)值:

  • lookback = 1440?—觀察將追溯到10天。

  • steps = 6?—觀測將在每小時一個數(shù)據(jù)點進行采樣。

  • delay = 144?—目標將是未來的24小時。

首先,您需要做兩件事:

  • 將數(shù)據(jù)預處理為神經(jīng)網(wǎng)絡可以使用格式。數(shù)據(jù)已經(jīng)是數(shù)字了,因此您無需進行任何向量化。但是數(shù)據(jù)中的每個時間序列的度量尺度都不同(例如,溫度通常在-20至+30之間,但以毫巴為單位的大氣壓約為1,000)。您將獨立地標準化每個時間序列。

  • 編寫一個生成器函數(shù),該函數(shù)將獲取當前的浮點數(shù)據(jù)數(shù)組,并生成來自最近的過去以及將來的目標溫度的成批數(shù)據(jù)。由于數(shù)據(jù)集中的樣本是高度冗余的(樣本?N?和樣本?N??+ 1將具有大多數(shù)相同的時間步長),因此顯式分配每個樣本會很浪費。相反,您將使用原始數(shù)據(jù)即時生成樣本。



生成器函數(shù)是一種特殊類型的函數(shù),可以反復調(diào)用該函數(shù)以獲得一系列值。

例如,sequence_generator()?下面的函數(shù)返回一個生成器函數(shù),該?函數(shù)產(chǎn)生無限的數(shù)字序列:


  1. gen <- sequence_generator(10)

  2. gen()

[1] 10gen()[1] 11

生成器的當前狀態(tài)value?是在函數(shù)外部定義的?變量。superassignment(<<-)用于從函數(shù)內(nèi)部更新此狀態(tài)。

生成器函數(shù)可以通過返回值NULL來指示完成?。

首先,將先前讀取的R數(shù)據(jù)幀轉(zhuǎn)換為浮點值矩陣(我們丟棄包含文本時間戳記的第一列):

data <- data.matrix(data[,-1])

然后,您可以通過減去每個時間序列的平均值并除以標準差來預處理數(shù)據(jù)。您將使用前200,000個時間步作為訓練數(shù)據(jù),因此僅在這部分數(shù)據(jù)上計算均值和標準差以進行標準化。

  1. train_data <- data[1:200000,]

  2. data <- scale(data, center = mean, scale = std)

您將使用的數(shù)據(jù)生成器的代碼如下。它產(chǎn)生一個list??(samples, targets),其中?samples?是一批輸入數(shù)據(jù),并且?targets?是目標溫度的對應數(shù)組。它采用以下參數(shù):

  • data?—原始的浮點數(shù)據(jù)數(shù)組。

  • lookback?—是輸入數(shù)據(jù)應該包括多少個時間步。

  • delay?—目標應該在未來多少步。

  • min_index?和?max_index?—data?數(shù)組中的索引,?用于定義從中提取時間步長。保留一部分數(shù)據(jù)用于驗證和另一部分用于測試。

  • shuffle?—隨機整理樣本還是按時間順序繪制樣本。

  • batch_size?—每批樣品數(shù)。

  • step?—采樣數(shù)據(jù)的時間段(以時間為單位)。您將其設置為6,以便每小時繪制一個數(shù)據(jù)點。

現(xiàn)在,讓我們使用abstract?generator?函數(shù)實例化三個生成器:一個用于訓練,一個用于驗證以及一個用于測試。每個人都將查看原始數(shù)據(jù)的不同時間段:訓練生成器查看前200,000個時間步,驗證生成器查看隨后的100,000個時間步,而測試生成器查看其余的時間步。

  1. lookback <- 1440

  2. step <- 6



  3. # 為了查看整個驗證集,需要從valu gen中提取多少步驟

  4. val_steps <- (300000 - 200001 - lookback) / batch_size


  5. # 為了查看整個測試集,需要從test\u gen中提取多少步驟

  6. test_steps <- (nrow(data) - 300001 - lookback) / batch_size

常識性的非機器學習基準

在開始使用黑盒深度學習模型解決溫度預測問題之前,讓我們嘗試一種簡單的常識性方法。它將用作健全性檢查,并將建立一個基線,您必須超過它才能證明機器學習模型的有用性。當您要解決尚無已知解決方案的新問題時,此類常識性基準可能會很有用。一個經(jīng)典的例子是不平衡的分類任務,其中某些類比其他類更為常見。如果您的數(shù)據(jù)集包含90%的A類實例和10%的B類實例,則分類任務的常識性方法是在提供新樣本時始終預測“ A”。此類分類器的總體準確度為90%,因此,任何基于學習的方法都應超過90%的分數(shù),以證明其有用性。

在這種情況下,可以安全地假定溫度時間序列是連續(xù)的(明天的溫度可能會接近今天的溫度)。因此,常識性的方法是始終預測從現(xiàn)在開始24小時的溫度將等于現(xiàn)在的溫度。我們使用平均絕對誤差(MAE)指標評估這種方法:

mean(abs(preds - targets))

評估循環(huán)。


  1. for (step in 1:val_steps) {


  2. preds <- samples[,dim(samples)[[2]],2]

  3. mae <- mean(abs(preds - targets))

  4. batch_maes <- c(batch_maes, mae)

  5. }

  6. print(mean(batch_maes))

MAE為0.29。由于溫度數(shù)據(jù)已標準化為以0為中心并且標準偏差為1。它的平均絕對誤差為0.29 x?temperature_std?攝氏度:2.57?C。

celsius_mae <- 0.29 * std[[2]]

那是一個相當大的平均絕對誤差。

基本的機器學習方法

就像在嘗試機器學習方法之前建立常識性基準很有用一樣,在研究復雜且計算量大的模型之前,嘗試簡單的機器學習模型也很有用。

下面的清單顯示了一個全連接的模型,該模型首先將數(shù)據(jù)展平,然后在兩個密集層中運行它。請注意,最后一個致密層上缺少激活函數(shù),這對于回歸問題是很典型的。您將MAE用作損失函數(shù)。由于您評估的數(shù)據(jù)與通常方法完全相同,而且度量標準完全相同,因此結(jié)果可以直接比較。

  1. model_sequential() %>%

  2. layer_flatten(input_shape = c(lookback / step, dim(data)[-1])) %>%


  3. history <- model %>% fit_generator(

  4. train_gen,

  5. steps_per_epoch = 500,

  6. epochs = 20,

  7. validation_data = val_gen,

  8. validation_steps = val_steps

  9. )

讓我們顯示驗證和訓練的損失曲線。

某些驗證損失接近無學習基準,但不可靠。這首先顯示了具有此基準的優(yōu)點:事實證明,要實現(xiàn)這一目標并不容易。您的常識包含很多機器學習模型無法訪問的有價值的信息。

您可能想知道,如果存在一個簡單的,性能良好的模型,為什么您正在訓練的模型找不到并對其進行改進?因為這種簡單的解決方案不是您的訓練設置所需要的。您要在其中尋找解決方案的模型的空間已經(jīng)相當復雜。當您正在尋找具有兩層網(wǎng)絡空間的復雜模型解決方案時,即使在技術(shù)上是假設簡單,性能良好的基準模型也可能無法學習。通常,這是機器學習的一個相當大的局限性:除非對學習算法進行硬編碼來尋找特定類型的簡單模型,

基準模型

第一種全連接的方法效果不好,但這并不意味著機器學習不適用于此問題。先前的方法首先使時間序列平坦化,從而從輸入數(shù)據(jù)中刪除了時間概念。我們將嘗試一個遞歸序列處理模型-它應該非常適合此類序列數(shù)據(jù),因為與第一種方法不同,正是因為它利用了數(shù)據(jù)點的時間順序。

您將使用Chung等人開發(fā)的?GRU層。在2014年。GRU層使用與LSTM相同的原理工作,但是它們有所簡化,因此運行起來更高效。在機器學習中到處都可以看到計算復雜度和效率之間的折衷。

  1. model_sequential() %>%

  2. layer_gru(units = 32, input_shape = list(NULL, dim(data)[[-1]])) %>%

  3. layer_dense(units = 1)


  4. model %>% fit_generator(

  5. train_gen,

  6. steps_per_epoch = 500,

  7. epochs = 20,

結(jié)果如下圖所示。您可以超越基線模型,證明了機器學習的價值以及循環(huán)網(wǎng)絡的優(yōu)越性。

驗證MAE轉(zhuǎn)化為非標準化后的平均絕對誤差為2.35?C。

丟棄(dropout)對抗過度擬合

從訓練和驗證曲線可以明顯看出該模型是過擬合的:訓練和驗證損失在經(jīng)過幾個時期后開始出現(xiàn)較大差異。您已經(jīng)熟悉了應對這種現(xiàn)象的經(jīng)典技術(shù):丟棄(dropout),它隨機將圖層的輸入單元清零,以便打破該圖層所暴露的訓練數(shù)據(jù)中的偶然相關性。但是,如何在循環(huán)網(wǎng)絡中正確應用dropout并不是一個簡單的問題。道在遞歸層之前應用dropout會阻礙學習,而不是幫助進行正則化。2015年,Yarin Gal作為其博士學位論文的一部分??在貝葉斯深度學習中,確定了使用遞歸網(wǎng)絡進行dropout的正確方法:應在每個時間步上應用相同的dropout模式,而不是隨時間步長隨機變化的dropout模式。

Yarin Gal使用Keras進行了研究,并幫助將這種模型直接構(gòu)建到Keras循環(huán)層中。Keras中的每個循環(huán)圖層都有兩個與dropout相關的參數(shù):??dropout,一個浮點數(shù),用于指定圖層輸入單元的dropout率;以及?recurrent_dropout,用于指定循環(huán)單元的dropout率。由于使用丟失dropout進行正則化的網(wǎng)絡始終需要更長的時間才能完全收斂,因此您需要兩倍的時間訓練網(wǎng)絡。

  1. model_sequential() %>%

  2. layer_gru(units = 32, dropout = 0.2, recurrent_dropout = 0.2,

下圖顯示了結(jié)果。在前20個時期中,您不再過度擬合。但是,盡管您的評估分數(shù)較為穩(wěn)定,但您的最佳分數(shù)并沒有比以前低很多。

堆疊循環(huán)圖層

因為您不再需要考慮過度擬合的問題,而是似乎遇到了性能瓶頸,所以您應該考慮增加網(wǎng)絡的容量?;叵胍幌峦ㄓ脵C器學習工作流程的描述:在過擬合成為主要障礙之前,最好增加網(wǎng)絡容量,這通常是個好主意(假設您已經(jīng)采取了基本步驟來減輕過擬合的情況,例如使用丟棄)。只要您的擬合度不會太差,就很可能會出現(xiàn)容量不足的情況。

通常,通過增加層中的單元數(shù)或添加更多層來增加網(wǎng)絡容量。遞歸層堆疊是構(gòu)建功能更強大的遞歸網(wǎng)絡的經(jīng)典方法:例如,當前為Google Translate算法提供動力的是七個大型LSTM層的堆疊。

為了在Keras中將遞歸層堆疊在一起,所有中間層都應返回其完整的輸出序列(3D張量),而不是最后一個時間步的輸出。

  1. model_sequential() %>%

  2. layer_gru(units = 32,

  3. dropout = 0.1,

  4. recurrent_dropout = 0.5,

  5. return_sequences = TRUE,

  6. input_shape = list(NULL, dim(data)[[-1]])) %>%

  7. layer_gru(units = 64, activation = "relu",

  8. dropout = 0.1,

  9. recurrent_dropout = 0.5) %>%

下圖顯示了結(jié)果。您可以看到,添加的圖層確實改善了結(jié)果,盡管效果不明顯。您可以得出兩個結(jié)論:

  • 因為不需要過度擬合的問題,所以可以安全地增加圖層大小以尋求驗證損失的改善。但是,這具有不可忽略的計算成本。

  • 添加層并沒有很大的幫助,因此此時您可能會看到網(wǎng)絡容量增加帶來的收益遞減。

使用雙向RNN

本節(jié)介紹的最后一種技術(shù)稱為?雙向RNN。雙向RNN是常見的RNN變體,在某些任務上可以提供比常規(guī)RNN更高的性能。它在自然語言處理中經(jīng)常使用-您可以將其稱為用于深度語言處理的深度學習“瑞士軍刀”。

RNN特別依賴于順序或時間的:它們按順序處理輸入序列的時間步長,重新排列時間步長可以完全改變RNN從序列中提取的表示形式。這正是它們在序列問題(例如溫度預測問題)上表現(xiàn)良好的原因。雙向RNN利用RNN的序列敏感性:它包含使用兩個常規(guī)RNN(例如?layer_gru?和?layer_lstm?),每個RNN都沿一個方向(按時間順序)處理輸入序列,然后合并它們的表示形式。通過雙向處理序列,雙向RNN可以捕獲被單向RNN忽略的模式。

值得注意的是,本節(jié)中的RNN層已按時間順序處理了序列。訓練與本節(jié)第一個實驗中使用相同的單GRU層網(wǎng)絡,您將獲得如下所示的結(jié)果。

結(jié)果表明在這種情況下,按時間順序進行的處理至關重要。因為:底層的GRU層通常更容易記住最近的過去,自然地,較新的天氣數(shù)據(jù)點比舊數(shù)據(jù)點對問題的預測能力強。因此,該層的時間順序版本必將勝過逆序版本。對于包括自然語言在內(nèi)的許多其他問題,情況并非如此:從直覺上講,單詞在理解句子中的重要性通常并不取決于其在句子中的位置。讓我們在LSTM IMDB示例中嘗試相同的技巧。

  1. # 作為特征考慮的單詞數(shù)量

  2. max_features <- 10000




  3. c(c(x_train, y_train), c(x_test, y_test)) %<-% imdb


  4. # 反轉(zhuǎn)序列

  5. x_train <- lapply(x_train, rev)

  6. x_test <- lapply(x_test, rev)



  7. model <- keras_model_sequential() %>%

  8. layer_embedding(input_dim = max_features, output_dim = 128) %>%

  9. layer_lstm(units = 32) %>%

您獲得的性能幾乎與按時間順序排列的LSTM相同。值得注意的是,在這樣的文本數(shù)據(jù)集上,逆序處理與按時間順序處理一樣有效,這證實了以下假設:盡管單詞順序??在理解語言中確實很重要,?但?您使用的順序并不重要。重要的是,經(jīng)過逆向序列訓練的RNN將學習與原始序列訓練的RNN不同的表達方式。在機器學習中,?不同?的表示?總是值得開發(fā)的:它們提供了一個新的視角來查看您的數(shù)據(jù),捕獲了其他方法遺漏的數(shù)據(jù)方面,因此可以幫助提高任務的性能。

雙向RNN利用此思想來改進按時間順序排列的RNN的性能。

在Keras中實例化雙向RNN。讓我們在IMDB情緒分析任務上嘗試一下。

  1. model <- keras_model_sequential() %>%

  2. layer_embedding(input_dim = max_features, output_dim = 32) %>%

  3. bidirectional(

  4. layer_lstm(units = 32)



  5. model %>% compile(

  6. optimizer = "rmsprop",

  7. loss = "binary_crossentropy",


它的性能比您在上一節(jié)中嘗試過的常規(guī)LSTM稍好,達到了89%以上的驗證精度。它似乎也可以更快地過擬合,這并不奇怪,因為雙向?qū)拥膮?shù)是按時間順序排列的LSTM的兩倍。通過一些正則化,雙向方法可能會在此任務上表現(xiàn)出色。

現(xiàn)在讓我們在溫度預測任務上嘗試相同的方法。

  1. model_sequential() %>%

  2. bidirectional(

  3. layer_gru(units = 32), input_shape = list(NULL, dim(data)[[-1]])


  4. model %>% fit_generator(

  5. train_gen,

  6. steps_per_epoch = 500,

  7. epochs = 40,

這和常規(guī)的layer_gru一樣好?。原因很容易理解:所有預測能力都必須來自網(wǎng)絡中按時間順序排列的部分,因為眾所周知,按時間順序排列的部分在此任務上的表現(xiàn)嚴重不足,在這種情況下,最近的樣本比過去的樣本重要得多。

更進一步

為了提高溫度預測問題的性能,您可以嘗試其他許多方法:

  • 調(diào)整堆疊設置中每個循環(huán)圖層的單位數(shù)。

  • 調(diào)整RMSprop?優(yōu)化器使用的學習率?。

  • 嘗試使用?layer_lstm?代替?layer_gru。

  • 嘗試在循環(huán)層的頂部使用更大的緊密連接的回歸變量:即,更大的密集層,甚至一疊密集層。

  • 不要忘記最終在測試集上運行性能最佳的模型(就驗證MAE而言),否則,您將開發(fā)過度擬合驗證集的結(jié)構(gòu)。

我們可以提供一些準則,建議在給定問題上可能起作用或不起作用的因素,但是最終,每個問題都是唯一的;您必須憑經(jīng)驗評估不同的策略。當前沒有理論可以提前準確地告訴您應該如何最佳地解決問題。您必須迭代。

最受歡迎的見解

1.用于NLP的Python:使用Keras的多標簽文本LSTM神經(jīng)網(wǎng)絡分類

2.Python中利用長短期記憶模型LSTM進行時間序列預測分析 – 預測電力消耗數(shù)據(jù)

3.python在Keras中使用LSTM解決序列問題

4.Python中用PyTorch機器學習分類預測銀行客戶流失模型

5.R語言多元Copula GARCH 模型時間序列預測

6.在r語言中使用GAM(廣義相加模型)進行電力負荷時間序列分析

7.R語言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于預測時間序列數(shù)

8.R語言估計時變VAR模型時間序列的實證研究分析案例

9.用廣義加性模型GAM進行時間序列分析


拓端tecdat|R語言基于遞歸神經(jīng)網(wǎng)絡RNN的溫度時間序列預測的評論 (共 條)

分享到微博請遵守國家法律
云阳县| 佛冈县| 六枝特区| 汉阴县| 红桥区| 新竹市| 黄冈市| 龙井市| 南乐县| 唐河县| 曲周县| 武胜县| 葫芦岛市| 南部县| 翼城县| 台山市| 原平市| 盐边县| 重庆市| 阿勒泰市| 安庆市| 奉新县| 德安县| 通许县| 马龙县| 苏尼特左旗| 临潭县| 锡林浩特市| 眉山市| 石楼县| 逊克县| 南开区| 鱼台县| 来宾市| 左贡县| 略阳县| 轮台县| 岳普湖县| 时尚| 石河子市| 阿拉善盟|