久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

R語言基于遞歸神經網絡RNN的溫度時間序列預測

 拓端數據 2021-02-18

原文鏈接:http:///?p=20335

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

概述

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

我們將介紹以下技術:

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

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

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

溫度預測問題

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

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

下載并解壓縮數據,如下所示:

unzip(
"climate.csv.zip",
exdir = "~/Downloads/climate"
)

我們看一下數據,。

library(tibble)
library(readr)

glimpse(data)

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

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

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

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

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

準備數據

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

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

  • steps = 6 —觀測將在每小時一個數據點進行采樣,。

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

首先,,您需要做兩件事:

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

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

生成器函數是一種特殊類型的函數,,可以反復調用該函數以獲得一系列值,。

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

gen <- sequence_generator(10)
gen()
[1] 10gen()[1] 11

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

生成器函數可以通過返回值NULL來指示完成 。

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

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

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

train_data <- data[1:200000,]
data <- scale(data, center = mean, scale = std)

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

  • data —原始的浮點數據數組,。

  • lookback —是_輸入數據應該_包括多少個_時間_步。

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

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

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

  • batch_size —每批樣品數。

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

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

lookback <- 1440
step <- 6


# 為了查看整個驗證集,,需要從valu gen中提取多少步驟
val_steps <- (300000 - 200001 - lookback) / batch_size

# 為了查看整個測試集,,需要從testu gen中提取多少步驟
test_steps <- (nrow(data) - 300001 - lookback) / batch_size

常識性的非機器學習基準

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

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

mean(abs(preds - targets))

評估循環(huán)。

for (step in 1:val_steps) {

preds <- samples[,dim(samples)[[2]],2]
mae <- mean(abs(preds - targets))
batch_maes <- c(batch_maes, mae)
}
print(mean(batch_maes))

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

celsius_mae <- 0.29 * std[[2]]

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

基本的機器學習方法

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

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

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

history <- model %>% fit_generator(
train_gen,
steps_per_epoch = 500,
epochs = 20,
validation_data = val_gen,
validation_steps = val_steps
)

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

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

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

基準模型

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

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

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

model %>% fit_generator(
train_gen,
steps_per_epoch = 500,
epochs = 20,

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

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

丟棄(dropout)對抗過度擬合

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

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

model_sequential() %>%
layer_gru(units = 32, dropout = 0.2, recurrent_dropout = 0.2,

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

堆疊循環(huán)圖層

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

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

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

model_sequential() %>%
layer_gru(units = 32,
dropout = 0.1,
recurrent_dropout = 0.5,
return_sequences = TRUE,
input_shape = list(NULL, dim(data)[[-1]])) %>%
layer_gru(units = 64, activation = "relu",
dropout = 0.1,
recurrent_dropout = 0.5) %>%

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

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

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

使用雙向RNN

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

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

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

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

# 作為特征考慮的單詞數量
max_features <- 10000



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

# 反轉序列
x_train <- lapply(x_train, rev)
x_test <- lapply(x_test, rev)


model <- keras_model_sequential() %>%
layer_embedding(input_dim = max_features, output_dim = 128) %>%
layer_lstm(units = 32) %>%

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

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

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

model <- keras_model_sequential() %>%
layer_embedding(input_dim = max_features, output_dim = 32) %>%
bidirectional(
layer_lstm(units = 32)


model %>% compile(
optimizer = "rmsprop",
loss = "binary_crossentropy",

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

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

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

model %>% fit_generator(
train_gen,
steps_per_epoch = 500,
epochs = 40,

    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多