PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據

lico9e 2021-11-25 10:43:50
python lstm 短期 方法 序列


配置神經網絡很困難,因為沒有關於如何去做的好的理論。

您必須系統地從動態和客觀結果的角度探索不同的參數配置,以嘗試了解給定預測建模問題的情况。

在本教程中,您將了解如何探索如何針對時間序列預測問題配置 LSTM 網絡參數。

完成本教程後,您將了解:

  • 如何調整和解釋訓練時期數的結果。
  • 如何調整和解釋訓練批次大小的結果。
  • 如何調整和解釋神經元數量的結果。

如何使用 Keras 調整 LSTM 超參數以進行時間序列預測

 

教程概述

本教程分為 6 個部分;他們是:

  1. 洗發水銷售數據集
  2. 實驗測試
  3. 調整時期數
  4. 調整批次大小
  5. 調整神經元的數量
  6. 結果總結

環境

本教程假設您已安裝 Python SciPy 環境。您可以在此示例中使用 Python 2 或 3。

本教程假設您已經安裝了 Keras v2.0 或更高版本以及 TensorFlow 。

本教程還假設您已安裝 scikit-learn、Pandas、NumPy 和 Matplotlib。

洗發水銷售數據集

該數據集描述了 3 年期間每月洗發水的銷售量。

單比特是銷售計數,有 36 個觀察值。

下面的示例加載並創建已加載數據集的圖。


#加載並繪制數據集


# 加載數據集

def paser(x):

return dattme.strptme('190'+x, '%Y-%m')

seres = read_csv('sale.csv', header=0, pare_dats=[0])

# 總結前幾行

print(seres.head())

# 繪制線圖

seres.plot()


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

運行示例將數據集加載為 Pandas 序列並輸出前 5 行。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_時間序列

然後創建該序列的線圖,顯示出明顯的增加趨勢。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_02

洗發水銷售數據集的線圖

接下來,我們將看看實驗中使用的 LSTM 配置和測試工具。

實驗測試

本節介紹本教程中使用的測試工具。

數據拆分

我們將把洗發水銷售數據集分成兩部分:訓練集和測試集。

前兩年的數據將用於訓練數據集,剩餘的一年數據將用於測試集。

將使用訓練數據集開發模型並對測試數據集進行預測。

測試數據集上的持久性預測實現了每月洗發水銷量 136.761 的誤差。這在測試集上提供了可接受的較低性能界限。

模型評估

使用滾動預測場景。

測試數據集的每個時間步將一次走一個。模型將用於對時間步長進行預測,然後將采用測試集中的實際預期值,並將其提供給模型用於下一個時間步長的預測。

這模擬了一個真實世界的場景,其中每個月都會有新的洗發水銷售觀察結果,並用於下個月的預測。

這將通過訓練和測試數據集的結構進行模擬。我們將以一次性方法進行所有預測。

將收集對測試數據集的所有預測,並計算誤差以總結模型的技能。將使用均方根誤差 (RMSE),因為它會懲罰大誤差並產生與預測數據(即每月洗發水銷售量)相同單比特的分數。

數據准備

在我們將 LSTM 模型擬合到數據集之前,我們必須轉換數據。

在擬合模型和進行預測之前,對數據集執行以下三個數據轉換。

  1. 轉換時間序列數據,使其平穩。具體來說,滯後=1 差分以消除數據中的增加趨勢。
  2. 將時間序列轉換為監督學習問題。具體來說,將數據組織成輸入和輸出模式,其中前一個時間步的觀察被用作預測當前時間步的觀察的輸入
  3. 將觀測值轉換為特定的量綱。具體來說,將數據重新縮放到 -1 和 1 之間的值以滿足 LSTM 模型的默認雙曲正切激活函數。

在計算和誤差之前,這些變換在預測中被返回到原始比例。

實驗運行

每個實驗方案將被運行10次。

這樣做的原因是,LSTM網絡的隨機初始條件在每次訓練一個給定的配置時,會導致非常不同的結果。

一個診斷方法將被用來研究模型配置。這就是將創建模型技能隨時間變化的線圖(訓練迭代稱為epochs),並對其進行研究,以深入了解一個給定的配置是如何執行的,以及如何調整它以獲得更好的性能。

在每個曆時結束時,模型將在訓練和測試數據集上進行評估,並保存RMSE分數。

每個場景結束時的訓練和測試RMSE分數將被打印出來,以顯示進度。

訓練和測試的RMSE分數系列在運行結束後被繪制成線圖。訓練得分用藍色錶示,測試得分用柳丁色錶示。

讓我們深入了解一下結果。

 

調整時期

我們將查看調整的第一個 LSTM 參數是訓練時期的數量。

該模型將使用一個批次 4 和單個神經元。我們將探索針對不同訓練時期數訓練此配置的效果。

500 時期epoch 的診斷

代碼注釋得相當好,應該很容易理解。



#能够在服務器上保存圖像

matplotlib.use('Agg')




# 用於加載數據集的日期時間解析函數

def paser(x):

return dateime.strptme('190'+x, '%Y-%m')



# 將一個序列設定為一個監督學習問題



colmns.appnd(df)
df = concat(colns, axis=1)



# 創建一個差分序列

diffene(dtaset, ieral=1):




# 將訓練和測試數據擴展到[-1, 1]。

scae(train, test):

scler = salr.fit(train)

# 轉換訓練集

train = trin.rhape(tain.hpe[0], tran.shpe[1])


# 變換測試


tst_caed = scler.trnfom(test)




# 預測值的逆向縮放

inve_scle(saer, X, yhat):




# 在數據集上評估模型,以轉換後的單比特返回RMSE

evaluate(mdel, rw_data, scald_dataet, caler)
# 分開

X, y = scald_daaset[:,0:-1], saleddaaset[:,-1)

# 重塑

reshaed = X.reshpe(len(X), 1, 1)

# 預測數據集

predict(rshped, bth_ize=tchsize)

# 在預測中反轉數據變換


for i in rage(len(outut)):

yat = output[i,0]

# 反轉比例

yhat = inrtscle(saer, X[i], yhat)

# 反轉差分

yhat = yhat + raaa[i]。

# 存儲預測

pdiis.ppd(yhat)

# 報告性能

rmse = srt(mensuederror pricions) )





# 對訓練數據進行LSTM網絡擬合

fitlstm(tran, tet, raw, caler bath_sie, n_eoch, erns):


# 准備模型

model = Sequential()

moel.ad(LSTM(neons, bh_phpe, stateful)


# 擬合模型


for i in range(nb_epoch):

fit(X, y, epocs=1, bathsze, verose=0, shufle=False)


# 在訓練數據上評估模型


mse.apend(evalaion(mdel, rawtain, trai, scler, 0, bcize))


# 在測試數據上評估模型

rmse.append(evalh_size))



# 運行診斷性實驗
run():

# 載入數據集

read_csv('sale.csv'

# 將數據轉化為平穩的


diffe(raues, 1)

# 將數據轉化為有監督的學習

supd = timespevied(diues, 1)

suplues = supd.vales

# 將數據分成訓練集和測試集

train, test = supues[0:-12], suplues[-12:] 。

# 改變數據的尺度

scar, traaled, tescaled = scale(tain, tst)

# 擬合和評估模型

traed = trainld[2:, :]

# 配置

reas = 10

nbch = 4

nphs = 500

nnens = 1

# 運行診斷性測試

for i in range(ret):

fit(train, tes, rawues, scler, nbth, necs, neons)


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.

注意:考慮到算法或評估程序的隨機性,或數值精度的差异。考慮多次運行該示例並比較平均結果。

運行實驗會在 10 次實驗運行結束時輸出訓練和測試集的 RMSE。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_PYTHON_03

還創建了每個訓練時期之後訓練集和測試集上的一系列 RMSE 分數的線圖。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_參數優化_04

500 個時期的診斷結果

結果清楚地錶明,幾乎所有實驗運行的 RMSE 在訓練時期都有下降趨勢。

它錶明模型正在學習問題並且具有一定的預測能力。事實上,所有最終測試分數都低於在這個問題上實現 136.761 的 RMSE 的簡單持久性模型(樸素預測)的誤差。

結果錶明,更多的訓練時期將產生更熟練的模型。

讓我們嘗試將 epoch 數從 500 加倍到 1000。

1000個時期的診斷

在本節中,我們使用相同的實驗設置並擬合模型超過 1000 個訓練時期。

具體來說, 在 run() 函數中將 n_epochs 參數設置為 1000

nepohs = 1000
  • 1.

注意: 考慮到算法或評估程序的隨機性,或數值精度的差异。考慮多次運行該示例並比較平均結果。

運行該示例會輸出最後一個 epoch 中訓練集和測試集的 RMSE。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_05

還創建了每個時期的測試和訓練 RMSE 分數的線圖。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_參數優化_06

1000 個時期的診斷結果

我們可以看到,模型誤差的下降趨勢確實在繼續,而且似乎在放緩。

訓練和測試用例的線條變得更加水平,但仍普遍呈現下降趨勢,盡管變化率較低。一些測試錯誤的例子顯示了大約 600 個時期可能出現的拐點,並且可能顯示出上昇趨勢。

我們對測試集上持續改進的平均性能感興趣,而且這種情况可能會持續下去。

讓我們嘗試將 epoch 數從 1000 增加一倍到 2000。

2000 時期Epoch 的診斷

在本節中,我們使用相同的實驗設置並擬合模型超過 2000 個訓練時期。

具體來說, 在run() 函數中將 npoch參數設置為 2000  。

nepoch = 2000
  • 1.

注意:考慮到算法或評估程序的隨機性,或數值精度的差异。考慮多次運行該示例並比較平均結果。

運行該示例會輸出最後一個 epoch 中訓練集和測試集的 RMSE。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_LSTM_07

還創建了每個時期的測試和訓練 RMSE 分數的線圖。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_參數優化_08

2000 時期epoch 的診斷結果

正如人們可能已經猜到的那樣,在訓練和測試數據集上的額外 1000 個 epoch 中,誤差的下降趨勢仍在繼續。

值得注意的是,大約一半的案例在運行結束之前一直在减少誤差,而其餘的則顯示出增加趨勢的迹象。

增長的趨勢是過度擬合的標志。這是當模型過度擬合訓練數據集時,其代價是測試數據集上的性能下降。它的例子是在訓練數據集上的持續改進,以及在測試數據集上的拐點和最差技能之後的改進。在測試數據集上,只有不到一半的運行顯示了這種類型的模式的開始。

盡管如此,測試數據集上的最終曆時結果還是非常好。我們可以通過更長的訓練看到進一步的收益。

讓我們嘗試將曆時數翻倍,從2000到4000。

 

4000個時期的診斷

在本節中,我們使用相同的實驗設置並擬合模型超過 4000 個訓練時期。

具體來說, 在run() 函數中將 n_epochs參數設置為 4000  。

nepocs = 4000
  • 1.

注意:考慮到算法或評估程序的隨機性,或數值精度的差异。考慮多次運行該示例並比較平均結果。

運行該示例會輸出最後一個 epoch 中訓練集和測試集的 RMSE。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_09

還創建了每個時期的測試和訓練 RMSE 分數的線圖。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_10

4000 epoch 的診斷結果

即使超過 4000 個 epoch,也有提高性能的總體趨勢。存在一種嚴重過擬合的情况,即測試誤差急劇上昇。

同樣,大多數運行以“良好”(比持久性更好)的最終測試錯誤結束。

結果總結

上面的診斷運行有助於探索模型的動態行為,但缺乏客觀和可比較的平均性能。

我們可以通過重複相同的實驗並計算和比較每個配置的匯總統計來解决這個問題。在這種情况下,完成了 30 次運行,時間值為 500、1000、2000、4000 和 6000。

這個想法是使用大量運行的匯總統計來比較配置,並確切地查看哪些配置的平均性能可能更好。

下面列出了完整的代碼示例。




# 運行一個重複實驗

epernt(rpeas, sris, ochs):

# 將數據轉化為平穩的


dif_vues = diferne(ravaues, 1)

# 將數據轉換為有監督的學習

to_spersed(dif_vles, 1)

# 將數據分成訓練集和測試集

train, test = spervsed[0:-2], suervues[-12:] 。

# 改變數據的尺度
scale(train, test)

# 運行實驗


for r in range(reeats):

# 擬合模型

size = 4

trtried = traled[2:, :]

ltmol = lstm(tamd, bachsie, eohs, 1)

# 預測整個訓練數據集,以建立預測的狀態

trainmd[:, 0].resape(lentran_tmmed), 1, 1)
predict(tain_rsaped, ah_size=ath_ize)

# 預測測試數據集

te_sapd = tstscaled[:,0:-1)

predict(testped, btze=btc_sze)



for i in range(len(outut)):
yhat = output[i,0]
X = te_saled[i, 0:-1] 。

# 反轉比例

yhat = invere(aler, X, yhat)

# 反轉差分

yht = invsefece(raw_aues, yat, len+1-i)

# 報告性能

sqrt(men_sqred_eror(a_vals[-12:], pedins) )


# 改變訓練曆時

echs = [500, 1000, 2000, 4000, 6000] 。

for e in eochs:
exiet(rpats, sries, e)

# 總結結果
boxlot()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.

運行代碼首先輸出 5 個配置中每一個的匯總統計信息。值得注意的是,這包括來自每個結果群體的 RMSE 分數的平均值和標准差。

平均值給出了配置的平均預期性能的概念,而標准差給出了方差的概念。最小和最大 RMSE 分數還給出了可能期望的最佳和最壞情况示例的範圍。

僅查看平均 RMSE 分數,結果錶明配置為 1000 的 epoch 可能更好。結果還錶明,可能需要對 1000 至 2000 之間的值進行進一步分析。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_11

分布也顯示在箱線圖上。這有助於了解分布如何直接比較。

紅線顯示中比特數,方框顯示第 25 個和第 75 個百分比特數,或中比特數 50% 的數據。這種比較還錶明,將 epochs 設置為 1000 的選擇優於測試的替代方案。它還錶明,可以在 2000 或 4000 次迭代時獲得最佳性能,但代價是平均性能更差。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_LSTM_12

總結 Epoch 結果的箱線圖

接下來,我們將看看批次大小的影響。

調整批次大小

批次大小控制更新網絡權重的頻率。

重要的是,在 Keras 中,批量大小必須是測試和訓練數據集大小的一個因素。

在上一節探討訓練 epoch 數的部分中,批大小固定為 4,它分為測試數據集(大小為 12)和測試數據集(大小為 20)。

在本節中,我們將探討改變批大小的影響。我們將訓練 epoch 的數量保持在 1000。

診斷 1000 個時期和批次大小為 4

作為提醒,上一節在第二次實驗中評估了批量大小為4,曆時數為1000的實驗。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_時間序列_13

1000 個時期的診斷結果

診斷 1000 個時期和批次大小為 2

在本節中,我們著眼於將批大小從 4 减半至 2。

這個改動是 對run() 函數中的 n_batch參數進行的 ;例如:

n_batch = 2
  • 1.

運行該示例顯示了與批大小為 4 相同的總體性能趨勢,可能在最後一個時期具有更高的 RMSE。

運行可能會顯示出更早穩定 RMES 的行為,而不是似乎繼續下降趨勢。

下面列出了每次運行最終的 RSME 分數。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_PYTHON_14

 PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_15

還創建了每個時期的測試和訓練 RMSE 分數的線圖。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_PYTHON_16

1000 個時期和批次大小為 2 的診斷結果

讓我們再次嘗試使用批量大小。

診斷 1000 個時期和批次大小為 1

這是在每個訓練模式之後更新網絡。可以與批量學習形成對比,其中權重僅在每個 epoch 結束時更新。

我們可以 在run() 函數中更改 n_batch參數 ;例如:

n_batch = 1
  • 1.

同樣,運行該示例會輸出每次運行的最後一期的 RMSE 分數。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_參數優化_17

還創建了一個每個曆時的測試和訓練RMSE分數的線圖。

該圖錶明,隨著時間的推移,測試RMSE有更多的變化,也許訓練RMSE比大批量的測試RMSE穩定得更快。測試RMSE的變异性增加是意料之中的,因為每次更新對網絡所做的改變都會帶來很少的反饋。

該圖還錶明,如果配置被賦予更多的訓練曆時,也許RMSE的下降趨勢會繼續下去。

 

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_LSTM_18

1000 個時期和批次大小為 1 的診斷結果

結果總結

與訓練時期一樣,我們可以客觀地比較網絡在給定不同批次大小的情况下的性能。

每個配置運行 30 次,並根據最終結果計算匯總統計信息。


# 運行一個重複的實驗


# 將數據轉換為平穩的

raw_vues = sres.values

df_vaues = difence(rvalues, 1)

# 將數據轉換為監督學習


suesr_lus = surior.values

# 將數據分成訓練集和測試集

# 變換數據的尺度

tra_cled,testscld = scale(tain, tet)

# 運行實驗



# 擬合模型

tran_timed = tan_saled[2:, :]

lstmmdl = lstm(tainrmd, ach_e, 1000, 1)

# 預測整個訓練數據集以建立預測狀態


preit(trairehae,bach_ie=bat_size)

# 預測測試數據集

preict(tst_rehapeatc_ze=bathsize)

X = tes_cd[i, 0:-1]

# 反轉縮放

yht = ivetcale(aler, X, yhat)

# 反轉差分

yat = invese_dfence(awvalus, yat, le(tetsald)+1-i)


# 報告錶現

rmse = sqrt(mean_urerror)


# 加載數據集


# 實驗

# 改變訓練批次

批次 = [1, 2, 4]

boxplot()


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.

僅從平均性能來看,結果錶明批量大小為 1 時 RMSE 較低。 正如上一節所述,這可能會隨著更多的訓練時期而得到進一步改善。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_19

還創建了數據的箱線圖,以幫助以圖形方式比較分布。該圖將中值性能顯示為一條紅線,其中批次大小為 4 顯示最大的差异和最低的中值 RMSE。

調整神經網絡是平均性能和該性能的可變性的權衡,理想結果具有低平均誤差和低可變性,這意味著它通常是好的和可重複的。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_20

總結批次大小結果的箱線圖

調整神經元的數量

在本節中,我們將研究改變網絡中神經元數量的影響。

神經元的數量影響網絡的學習能力。一般來說,更多的神經元能够以更長的訓練時間為代價從問題中學習更多的結構。更多的學習能力也會產生潜在的過度擬合訓練數據的問題。

我們將使用 4 和 1000 個訓練時期的批量大小。

1000 個時期和 1 個神經元的診斷

我們將從 1 個神經元開始。

提醒一下,這是從 epochs 實驗中測試的第二個配置。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_參數優化_21

1000 個時期的診斷結果

1000 個時期和 2 個神經元的診斷

我們可以將神經元的數量從 1 增加到 2。這有望提高網絡的學習能力。

我們可以通過更改run() 函數中的n_neurons 變量 來做到這一點 。

n_neurons = 2
  • 1.

運行此配置會輸出每次運行的最後一個時期的 RMSE 分數。

結果錶明,總體錶現不錯,但不是很好。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_PYTHON_22

還創建了每個時期的測試和訓練 RMSE 分數的線圖。

這更能說明問題。它顯示了測試RMSE的快速下降,大約在500-750個時期中,一個拐點顯示了測試RMSE的上昇,幾乎所有的運行都是如此。同時,訓練數據集顯示持續下降到最後一期。

這些都是訓練數據集過擬合的迹象。

 

 

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_23

1000 個時期和 2 個神經元的診斷結果

讓我們看看這種趨勢是否會隨著更多的神經元而繼續。

1000 個時期和 3 個神經元的診斷

本節著眼於將神經元數量增加到 3 的相同配置。

n_neurons = 3
  • 1.

運行此配置會輸出每次運行的最後一個時期的 RMSE 分數。

結果與上一節類似;我們看不到 2 或 3 個神經元的最終 epoch 測試分數之間的一般差异。3 個神經元的最終訓練分數似乎確實較低,這可能錶明過度擬合加速。

訓練數據集中的拐點似乎比 2 個神經元實驗發生得更早,可能在 300-400 期。

這些神經元數量的增加可能受益於减緩學習速度的額外變化。例如使用正則化方法,如 dropout,减少批量大小,减少訓練時期的數量。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_時間序列_24

還創建了每個時期的測試和訓練 RMSE 分數的線圖。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_神經網絡_25

1000 個時期和 3 個神經元的診斷結果

結果總結

同樣,我們可以客觀地比較增加神經元數量同時保持所有其他網絡配置的影響。

在本節中,我們將每個實驗重複 30 次,並將平均測試 RMSE 性能與 1 到 5 的神經元數量進行比較。


# 運行一個重複的實驗


# 將數據轉換為平穩的

ra_lus = sees.values

difvles = difece(rwvlus, 1)

# 將數據轉換為監督學習


sups_ales = supvor.values

# 將數據分成訓練集和測試集


# 變換數據的尺度

trainsld,tet_scld = scale(tain, est)

# 運行實驗

err_scres = list()


# 擬合模型


trntied = tr_aed[2:, :]

lsmel = lstm(tritid, bahze, 1000, eons)

# 預測整個訓練數據集以建立預測狀態

trrehap = ti_rimed[:, 0].rehae(len(train_trimmed), 1, 1)

prdict(trahpe,bahe=achze)

# 預測測試數據集

tet_sape = tetsaled[:,0:-1]
tetrehae = tesespe.reshape(len(tst_ehape), 1, 1)

prect(tes_rhpe,bath_ize=btchsze)


X = ts_cld[i, 0:-1]

# 反轉縮放

yhat = ivertle(scaer, X, yhat)

# 反轉差分

yht = inversefrce(rw_values, hat, len(tet_saed)+1-i)

# 報告錶現

rmse = sqrt(men_sureero(aw_vue[-12:], preiions))



# 加載數據集


# 實驗




# 改變神經元

神經元 = [1, 2, 3, 4, 5]


boxplot()



  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.

運行實驗會輸出每個配置的摘要統計信息。

僅從平均性能來看,結果錶明具有 1 個神經元的網絡配置在 1000 個 epoch 中具有最佳性能,批量大小為 4。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_PYTHON_26

盒須圖顯示了中值測試集性能的明顯趨勢,其中神經元的增加導致測試 RMSE 的相應增加。

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_LSTM_27

總結神經元結果的盒須圖

所有結果的總結

在本教程中,我們在洗發水銷售數據集上完成了相當多的 LSTM 實驗。

一般來說,似乎有狀態的 LSTM 配置了 1 個神經元,批量大小為 4,並且訓練了 1000 個 epochs 可能是一個很好的配置。

結果還錶明,也許這種批量大小為 1 並且適合更多 epoch 的配置可能值得進一步探索。

調整神經網絡是一項艱巨的實證工作,事實證明 LSTM 也不例外。

本教程展示了配置行為隨時間的診斷研究以及測試 RMSE 的客觀研究的好處。

擴展

本節列出了對本教程中執行的實驗進行擴展的一些想法。

如果您探索其中任何一個,請在評論中報告您的結果;我很想看看你想出了什麼。

  • dropout。使用正則化方法(例如循環 LSTM 連接上的 dropout)减慢學習速度。
  • 。通過在每層添加更多層和不同數量的神經元來探索額外的分層學習能力。
  • 正則化。探索如何使用權重正則化(例如 L1 和 L2)來减緩網絡在某些配置上的學習和過度擬合。
  • 優化算法。例如經典梯度下降,以查看加速或减慢學習的特定配置是否會帶來好處。
  • 損失函數
  • 特點和時間步長。探索使用滯後觀察作為輸入特征和特征的輸入時間步長,看看它們作為輸入的存在是否可以提高模型的學習和/或預測能力。
  • 更大的批量。探索大於 4 的批量大小,可能需要進一步處理訓練和測試數據集的大小。
概括

在本教程中,您了解了如何系統地研究 LSTM 網絡的配置以進行時間序列預測。

具體來說,你學到了:

  • 如何設計用於評估模型配置的系統測試工具。
  • 如何隨著時間的推移使用模型診斷以及客觀預測誤差來解釋模型行為。
  • 如何探索和解釋訓練時期數、批量大小和神經元數量的影響。

您對調整 LSTM 或本教程有任何疑問嗎?

在下面的評論中提出您的問題,我們會盡力回答。



PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據_PYTHON_28

 

版权声明
本文为[lico9e]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/11/20211125104047491j.html

  1. Python basic syntax -- Boolean operation, break, continue, pass
  2. Python basic syntax -- loop
  3. Python first experience - efficient office, data analysis, crawler
  4. Modulenotfounderror: no module named 'Django summernote details
  5. Key points for Django to make personal blog website
  6. Path setting of templates in Django settings
  7. Leetcode 1611. Minimum one bit operations to make integers Zero (Python)
  8. Directory C: \ users \ a \ desktop \ Django_ The blog master is registered as the GIT root, but no git repository details are found there
  9. Django. Core. Exceptions. Improveconfigured: application labels aren't unique, duplicates: admin
  10. How to verify that Django has created the project details correctly
  11. How to create a database when using Django to construct a website
  12. The solution of using Django framework to create project in Windows system
  13. Running Python virtual environment on win10 system to execute ll_ Env \ scripts \ activate: unable to load file elaboration scheme
  14. Detailed explanation of constructing virtual environment with Django in Python 3
  15. Python implementation of affine cipher
  16. RC4 Python implementation
  17. Simple: Python_ Automatic body temperature clock
  18. 用python把两个csv中的日期的列提出年,做出新的一列,再把两个csv表格按照新做出的日期这列和ID号合并为一个表。
  19. python中类实例化后,其对象无法被其他模块调用方法
  20. [JSON] - Python creates JSON file format
  21. Utilisez Python pour proposer l'année de la colonne de date dans les deux CSV, faire une nouvelle colonne, puis combiner les deux tableaux CSV en un seul tableau avec la colonne de date et le numéro d'identification.
  22. 关于#python#的问题,请各位专家解答!
  23. ***
  24. ***
  25. 關於#python#的問題,請各比特專家解答!
  26. S'il vous plaît répondre aux questions de Python!
  27. About the import of Python class
  28. Magic Python property decorator: 1 line of code makes Python methods become properties in seconds
  29. Python 音频调整音量(附代码) | Python工具
  30. Python programming ideas [series of articles]
  31. Python crawler programming idea (67): modify nodes using pyquery
  32. Python crawler programming idea (66): using pyquery to obtain node information
  33. Python crawler programming idea (65): find nodes using pyquery
  34. Python crawler programming idea (64): using CSS selectors in pyquery
  35. Python crawler programming idea (63): basic knowledge of pyquery
  36. Python crawler programming idea (62): project practice: capturing cool dog online red song list
  37. Python crawler programming idea (61): project practice: capturing rental information
  38. Python crawler programming idea (60): get CSS selector code through browser
  39. Python爬虫编程思想(85):在Python中使用非关系型数据库
  40. Volume de réglage audio Python (avec Code) | outils Python
  41. Python crawler programming idea (59): get attribute value and text with beautiful soup CSS selector
  42. Python crawler programming idea (58): nested selection nodes with beautiful soup CSS selectors
  43. Python crawler programming idea (57): basic usage of CSS selector in beautiful soup
  44. Python crawler programming idea (56): find method of beautiful soup method selector
  45. Python crawler programming idea (55): find of beautiful soup method selector_ All method
  46. Python crawler programming idea (54): use beautiful soup to select sibling nodes
  47. Python crawler programming idea (53): use beautiful soup to select the parent node
  48. Django3.0 solves the problem of error reporting in reverse parsing
  49. Precautions for Python crawler
  50. Python 3 crawler series (1) -- climbing blind date websites
  51. Python到底是什么?为什么要学Python?
  52. #yyds干货盘点#Pandas数据清洗实用指南
  53. Python打包exe文件无法运行
  54. Two common ways to save files in Python
  55. #yyds幹貨盤點#Pandas數據清洗實用指南
  56. Yyds Dry Inventory pandas Data Cleaning Practical Guide
  57. PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据
  58. Python集成学习:自己编写构建AdaBoost分类模型可视化决策边界及sklearn包调用比较
  59. Python 3 makes a search software
  60. Python 3 simulated microblog login