<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 如何在 LSTM 網絡中使用時間序列進行時間序列預測 > 原文: [https://machinelearningmastery.com/use-timesteps-lstm-networks-time-series-forecasting/](https://machinelearningmastery.com/use-timesteps-lstm-networks-time-series-forecasting/) Keras 的長短期記憶(LSTM)網絡支持時間步驟。 這提出了一個問題,即單變量時間序列的滯后觀察是否可以用作 LSTM 的時間步長以及這是否會改善預測表現。 在本教程中,我們將研究使用滯后觀察作為 Python 中 LSTMs 模型的時間步長。 完成本教程后,您將了解: * 如何開發測試工具以系統地評估 LSTM 時間序列的時間序列預測。 * 使用不同數量的滯后觀測值作為 LSTM 模型的輸入時間步長的影響。 * 對 LSTM 模型使用不同數量的滯后觀察和匹配數量的神經元的影響。 讓我們開始吧。 ![How to Use Timesteps in LSTM Networks for Time Series Forecasting](https://img.kancloud.cn/69/e5/69e52756e77f4cf7fa4a8b7746cfe7d8_640x430.jpg) 如何在 LSTM 網絡中使用時間序列進行時間序列預測 照片來自 [YoTuT](https://www.flickr.com/photos/yotut/326537449/) ,保留一些權利。 ## 教程概述 本教程分為 4 個部分。他們是: 1. 洗發水銷售數據集 2. 實驗測試線束 3. 時間步驟的實驗 4. 時間步和神經元的實驗 ### 環境 本教程假定您已安裝 Python SciPy 環境。您可以在此示例中使用 Python 2 或 3。 本教程假設您安裝了 TensorFlow 或 Theano 后端的 Keras v2.0 或更高版本。 本教程還假設您安裝了 scikit-learn,Pandas,NumPy 和 Matplotlib。 如果您在設置 Python 環境時需要幫助,請參閱以下帖子: * [如何使用 Anaconda 設置用于機器學習和深度學習的 Python 環境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## 洗發水銷售數據集 該數據集描述了 3 年期間每月洗發水的銷售數量。 單位是銷售計數,有 36 個觀察。原始數據集歸功于 Makridakis,Wheelwright 和 Hyndman(1998)。 [您可以在此處下載并了解有關數據集的更多信息](https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period)。 下面的示例加載并創建已加載數據集的圖。 ```py # load and plot dataset from pandas import read_csv from pandas import datetime from matplotlib import pyplot # load dataset def parser(x): return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) # summarize first few rows print(series.head()) # line plot series.plot() pyplot.show() ``` 運行該示例將數據集作為 Pandas Series 加載并打印前 5 行。 ```py Month 1901-01-01 266.0 1901-02-01 145.9 1901-03-01 183.1 1901-04-01 119.3 1901-05-01 180.3 Name: Sales, dtype: float64 ``` 然后創建該系列的線圖,顯示明顯的增加趨勢。 ![Line Plot of Shampoo Sales Dataset](https://img.kancloud.cn/11/f1/11f11d2a2ec40c7c0724e4e09f11a4ca_640x480.jpg) 洗發水銷售數據集的線圖 接下來,我們將了解實驗中使用的 LSTM 配置和測試工具。 ## 實驗測試線束 本節介紹本教程中使用的測試工具。 ### 數據拆分 我們將 Shampoo Sales 數據集分為兩部分:訓練和測試集。 前兩年的數據將用于訓練數據集,剩余的一年數據將用于測試集。 將使用訓練數據集開發模型,并對測試數據集進行預測。 測試數據集的持久性預測(樸素預測)實現了每月洗發水銷售 136.761 的錯誤。這在測試集上提供了較低的可接受表現限制。 ### 模型評估 將使用滾動預測場景,也稱為前進模型驗證。 測試數據集的每個時間步驟將一次一個地走。將使用模型對時間步長進行預測,然后將獲取測試集的實際預期值,并使其可用于下一時間步的預測模型。 這模仿了一個真實世界的場景,每個月都會有新的洗發水銷售觀察結果,并用于下個月的預測。 這將通過訓練和測試數據集的結構進行模擬。 將收集關于測試數據集的所有預測,并計算錯誤分數以總結模型的技能。將使用均方根誤差(RMSE),因為它會對大錯誤進行處罰,并產生與預測數據相同的分數,即每月洗發水銷售額。 ### 數據準備 在我們將 LSTM 模型擬合到數據集之前,我們必須轉換數據。 在擬合模型和進行預測之前,對數據集執行以下三個數據變換。 1. **轉換時間序列數據,使其靜止**。具體而言,滯后= 1 差分以消除數據中的增加趨勢。 2. **將時間序列轉換為監督學習問題**。具體而言,將數據組織成輸入和輸出模式,其中前一時間步的觀察被用作在當前時間步長預測觀測的輸入 3. **將觀察結果轉換為具有特定比例**。具體而言,要將數據重新調整為-1 到 1 之間的值,以滿足 LSTM 模型的默認雙曲正切激活函數。 這些變換在預測時反轉,在計算和誤差分數之前將它們恢復到原始比例。 ### LSTM 模型 我們將使用基礎狀態 LSTM 模型,其中 1 個神經元適合 500 個時期。 批量大小為 1 是必需的,因為我們將使用前向驗證并對最后 12 個月的測試數據進行一步預測。 批量大小為 1 意味著該模型將使用在線訓練(而不是批量訓練或小批量訓練)。因此,預計模型擬合將具有一些變化。 理想情況下,將使用更多的訓練時期(例如 1000 或 1500),但這被截斷為 500 以保持運行時間合理。 使用有效的 ADAM 優化算法和均方誤差損失函數來擬合模型。 ### 實驗運行 每個實驗場景將運行 10 次。 其原因在于,每次訓練給定配置時,LSTM 網絡的隨機初始條件可能導致非常不同的結果。 讓我們深入研究實驗。 ## 時間步驟的實驗 我們將進行 5 次實驗,每次實驗將使用不同數量的滯后觀察作為 1 到 5 的時間步長。 使用有狀態 LSTM 時,具有 1 個時間步長的表示將是默認表示。設計使用 2 到 5 個步驟。希望是滯后觀測的附加背景可以改善預測模型的表現。 在訓練模型之前,單變量時間序列被轉換為監督學習問題。指定的時間步數定義了用于預測下一個時間步長( _y_ )的輸入變量( _X_ )的數量。因此,對于表示中使用的每個時間步,必須從數據集的開頭刪除許多行。這是因為沒有先前的觀察結果可用作數據集中第一個值的時間步長。 下面列出了測試 1 個時間步的完整代碼清單。 對于 5 個實驗中的每一個, _run()_ 函數中的時間步長參數從 1 到 5 變化。此外,結果將在實驗結束時保存到文件中,并且還必須針對每個不同的實驗運行更改此文件名;例如: _experiment_timesteps_1.csv_ , _experiment_timesteps_2.csv_ 等。 ```py from pandas import DataFrame from pandas import Series from pandas import concat from pandas import read_csv from pandas import datetime from sklearn.metrics import mean_squared_error from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from math import sqrt import matplotlib import numpy from numpy import concatenate # date-time parsing function for loading the dataset def parser(x): return datetime.strptime('190'+x, '%Y-%m') # frame a sequence as a supervised learning problem def timeseries_to_supervised(data, lag=1): df = DataFrame(data) columns = [df.shift(i) for i in range(1, lag+1)] columns.append(df) df = concat(columns, axis=1) return df # create a differenced series def difference(dataset, interval=1): diff = list() for i in range(interval, len(dataset)): value = dataset[i] - dataset[i - interval] diff.append(value) return Series(diff) # invert differenced value def inverse_difference(history, yhat, interval=1): return yhat + history[-interval] # scale train and test data to [-1, 1] def scale(train, test): # fit scaler scaler = MinMaxScaler(feature_range=(-1, 1)) scaler = scaler.fit(train) # transform train train = train.reshape(train.shape[0], train.shape[1]) train_scaled = scaler.transform(train) # transform test test = test.reshape(test.shape[0], test.shape[1]) test_scaled = scaler.transform(test) return scaler, train_scaled, test_scaled # inverse scaling for a forecasted value def invert_scale(scaler, X, yhat): new_row = [x for x in X] + [yhat] array = numpy.array(new_row) array = array.reshape(1, len(array)) inverted = scaler.inverse_transform(array) return inverted[0, -1] # fit an LSTM network to training data def fit_lstm(train, batch_size, nb_epoch, neurons, timesteps): X, y = train[:, 0:-1], train[:, -1] X = X.reshape(X.shape[0], timesteps, 1) model = Sequential() model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') for i in range(nb_epoch): model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False) model.reset_states() return model # make a one-step forecast def forecast_lstm(model, batch_size, X): X = X.reshape(1, len(X), 1) yhat = model.predict(X, batch_size=batch_size) return yhat[0,0] # run a repeated experiment def experiment(repeats, series, timesteps): # transform data to be stationary raw_values = series.values diff_values = difference(raw_values, 1) # transform data to be supervised learning supervised = timeseries_to_supervised(diff_values, timesteps) supervised_values = supervised.values[timesteps:,:] # split data into train and test-sets train, test = supervised_values[0:-12, :], supervised_values[-12:, :] # transform the scale of the data scaler, train_scaled, test_scaled = scale(train, test) # run experiment error_scores = list() for r in range(repeats): # fit the base model lstm_model = fit_lstm(train_scaled, 1, 500, 1, timesteps) # forecast test dataset predictions = list() for i in range(len(test_scaled)): # predict X, y = test_scaled[i, 0:-1], test_scaled[i, -1] yhat = forecast_lstm(lstm_model, 1, X) # invert scaling yhat = invert_scale(scaler, X, yhat) # invert differencing yhat = inverse_difference(raw_values, yhat, len(test_scaled)+1-i) # store forecast predictions.append(yhat) # report performance rmse = sqrt(mean_squared_error(raw_values[-12:], predictions)) print('%d) Test RMSE: %.3f' % (r+1, rmse)) error_scores.append(rmse) return error_scores # execute the experiment def run(): # load dataset series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) # experiment repeats = 10 results = DataFrame() # run experiment timesteps = 1 results['results'] = experiment(repeats, series, timesteps) # summarize results print(results.describe()) # save results results.to_csv('experiment_timesteps_1.csv', index=False) # entry point run() ``` 針對 5 個不同數量的時間步長運行 5 個不同的實驗。 如果有足夠的內存和 CPU 資源,可以并行運行它們。這些實驗不需要 GPU 資源,實驗應該在幾分鐘到幾十分鐘內完成。 運行實驗后,您應該有 5 個包含結果的文件,如下所示: ```py experiment_timesteps_1.csv experiment_timesteps_2.csv experiment_timesteps_3.csv experiment_timesteps_4.csv experiment_timesteps_5.csv ``` 我們可以編寫一些代碼來加載和匯總這些結果。 具體而言,查看每次運行的描述性統計數據并使用方框和胡須圖比較每次運行的結果非常有用。 下面列出了總結結果的代碼。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_timesteps_1.csv', 'experiment_timesteps_2.csv', 'experiment_timesteps_3.csv','experiment_timesteps_4.csv','experiment_timesteps_5.csv'] results = DataFrame() for name in filenames: results[name[11:-4]] = read_csv(name, header=0) # describe all results print(results.describe()) # box and whisker plot results.boxplot() pyplot.show() ``` 首先運行代碼會為每組結果打印描述性統計信息。 我們可以從單獨的平均表現中看出,使用單個時間步的默認值導致了最佳表現。在查看中位數測試 RMSE(第 50 百分位數)時也會顯示這一點。 ```py timesteps_1 timesteps_2 timesteps_3 timesteps_4 timesteps_5 count 10.000000 10.000000 10.000000 10.000000 10.000000 mean 102.785197 127.308725 136.182907 146.277122 142.631684 std 6.299329 22.171668 7.760161 5.609412 6.611638 min 92.603903 106.124901 124.724903 138.845314 137.359503 25% 98.979692 114.100891 130.719154 141.906083 138.354265 50% 103.904185 114.519986 137.055840 145.865171 141.409855 75% 108.434727 144.328534 139.615541 150.729938 143.604275 max 110.270559 164.880226 150.497130 155.603461 159.948033 ``` 還創建了比較結果分布的盒子和胡須圖。 該情節與描述性統計數據相同。隨著時間步數的增加,存在增加測試 RMSE 的一般趨勢。 ![Box and Whisker Plot of Timesteps vs RMSE](https://img.kancloud.cn/15/bd/15bd350e00a676630830200aac8809e7_640x480.jpg) 時間步長與 RMSE 的盒子和晶須圖 至少在使用數據集和 LSTM 配置的情況下,沒有觀察到隨著時間步長的增加而提高表現的期望。 這就提出了一個問題,即網絡的容量是否是一個限制因素。我們將在下一節中看到這一點。 ## 時間步和神經元的實驗 LSTM 網絡中的神經元(也稱為塊)的數量定義了其學習能力。 在先前的實驗中,可能使用一個神經元限制了網絡的學習能力,使得它不能有效地使用滯后觀察作為時間步長。 我們可以重復上述實驗,并隨著時間步長的增加增加 LSTM 中神經元的數量,看看它是否會導致表現提高。 這可以通過更改實驗函數中的行來實現: ```py lstm_model = fit_lstm(train_scaled, 1, 500, 1, timesteps) ``` 至 ```py lstm_model = fit_lstm(train_scaled, 1, 500, timesteps, timesteps) ``` 此外,我們可以通過在文件名中添加“ __neurons_ ”后綴來保持寫入文件的結果與第一個實驗中創建的結果分開,例如,更改: ```py results.to_csv('experiment_timesteps_1.csv', index=False) ``` 至 ```py results.to_csv('experiment_timesteps_1_neurons.csv', index=False) ``` 用這些變化重復相同的 5 個實驗。 運行這些實驗后,您應該有 5 個結果文件。 ```py experiment_timesteps_1_neurons.csv experiment_timesteps_2_neurons.csv experiment_timesteps_3_neurons.csv experiment_timesteps_4_neurons.csv experiment_timesteps_5_neurons.csv ``` 與前一個實驗一樣,我們可以加載結果,計算描述性統計數據,并創建一個盒子和須狀圖。完整的代碼清單如下。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_timesteps_1_neurons.csv', 'experiment_timesteps_2_neurons.csv', 'experiment_timesteps_3_neurons.csv','experiment_timesteps_4_neurons.csv','experiment_timesteps_5_neurons.csv'] results = DataFrame() for name in filenames: results[name[11:-12]] = read_csv(name, header=0) # describe all results print(results.describe()) # box and whisker plot results.boxplot() pyplot.show() ``` 運行代碼首先打印 5 個實驗中的每一個的描述性統計數據。 結果與使用一個神經元 LSTM 的第一組實驗相似。當神經元數量和時間步數設置為 1 時,平均測試 RMSE 顯得最低。 ```py timesteps_1 timesteps_2 timesteps_3 timesteps_4 timesteps_5 count 10.000000 10.000000 10.000000 10.000000 10.000000 mean 109.484374 133.195856 133.432933 145.843701 149.854229 std 9.663732 36.328757 19.347675 19.389278 30.194324 min 91.803241 91.791014 87.739484 113.808683 103.612424 25% 104.757265 119.269854 127.937277 137.417983 131.278548 50% 108.464050 129.775765 134.076721 147.222168 151.999097 75% 114.265381 132.796259 147.557091 159.518828 164.741625 max 126.581011 226.396127 156.019616 171.570206 208.030615 ``` 創建框和胡須圖以比較分布。 隨著神經元數量和時間步長的增加,擴散和中位表現的趨勢幾乎表明測試 RMSE 呈線性增加。 線性趨勢可能表明網絡容量的增加沒有足夠的時間來擬合數據。也許還需要增加時代數量。 ![Box and Whisker Plot of Timesteps and Neurons vs RMSE](https://img.kancloud.cn/9d/17/9d17e957a5698eb8a1b4e931c1d8292b_640x480.jpg) 時間步和神經元的盒子和晶須圖與 RMSE ## 擴展 本節列出了您可能考慮探索的一些進一步調查的領域。 * **作為特征**。使用滯后觀測作為時間步長也提出了滯后觀測是否可以用作輸入特征的問題。目前尚不清楚 Keras LSTM 實施是否在內部以相同的方式處理時間步驟和特征。 * **診斷運行圖**。對于給定的實驗,在多次運行的情況下查看訓練和測試 RMSE 的圖可能是有幫助的。這可能有助于梳理過度擬合或過度擬合是否正在發生,反過來又是解決它的方法。 * **增加訓練時期**。第二組實驗中 LSTM 中神經元的增加可受益于訓練時期數量的增加。這可以通過一些后續實驗來探索。 * **增加重復次數**。使用 10 次重復導致相對少量的測試 RMSE 結果。將重復增加至 30 或 100(或甚至更高)可能導致更穩定的結果。 你有沒有探索過這些擴展? 在下面的評論中分享您的發現;我很想聽聽你發現了什么。 ## 摘要 在本教程中,您了解了如何使用滯后觀察作為 LSTM 網絡中的輸入時間步驟進行調查。 具體來說,你學到了: * 如何開發一個強大的測試工具來嘗試使用 LSTM 進行輸入表示。 * 如何使用滯后觀測值作為 LSTM 時間序列預測的輸入時間步長。 * 如何隨著時間步長的增加提高網絡的學習能力。 您發現使用滯后觀察作為輸入時間步長的期望并未降低所選問題和 LSTM 配置的測試 RMSE。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看