<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 使用 Python 進行時間序列預測的有狀態和無狀態 LSTM > 原文: [https://machinelearningmastery.com/stateful-stateless-lstm-time-series-forecasting-python/](https://machinelearningmastery.com/stateful-stateless-lstm-time-series-forecasting-python/) Keras Python 深度學習庫支持有狀態和無狀態長短期內存(LSTM)網絡。 使用有狀態 LSTM 網絡時,我們可以對 LSTM 網絡的內部狀態何時重置進行細粒度控制。因此,在擬合和使用 LSTM 網絡進行預測影響網絡技能時,了解管理此內部狀態的不同方法非常重要。 在本教程中,您將探索 Keras 中有狀態和無狀態 LSTM 網絡在時間序列預測中的表現。 完成本教程后,您將了解: * 如何比較和對比狀態和無狀態 LSTM 網絡的時間序列預測。 * 無狀態 LSTM 中的批量大小如何與有狀態 LSTM 網絡相關。 * 如何評估和比較有狀態 LSTM 網絡的不同狀態重置方案。 讓我們開始吧。 ![Stateful and Stateless LSTM for Time Series Forecasting with Python](https://img.kancloud.cn/65/83/65837ed405a65bb13ec79beda493c5d0_640x427.jpg) 使用 Python 進行時間序列預測的有狀態和無狀態 LSTM 照片由 [m01229](https://www.flickr.com/photos/39908901@N06/33414952872/) ,保留一些權利。 ## 教程概述 本教程分為 7 個部分。他們是: 1. 洗發水銷售數據集 2. 實驗測試線束 3. A 與 A 測試 4. 有狀態與無國籍 5. 大批量與無狀態無國籍 6. 有狀態重置與無狀態重置 7. 審查結果 ### 環境 本教程假定您已安裝 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 個神經元適合 1000 個時期。 批量大小為 1 是必需的,因為我們將使用前向驗證并對最后 12 個月的測試數據進行一步預測。 批量大小為 1 意味著該模型將使用在線訓練(而不是批量訓練或小批量訓練)。因此,預計模型擬合將具有一些變化。 理想情況下,將使用更多的訓練時期(例如 1500),但這被截斷為 1000 以保持運行時間合理。 使用有效的 ADAM 優化算法和均方誤差損失函數來擬合模型。 ### 實驗運行 每個實驗場景將運行 10 次。 其原因在于,每次訓練給定配置時,LSTM 網絡的隨機初始條件可能導致非常不同的結果。 讓我們深入研究實驗。 ## A 與 A 測試 一個好的第一個實驗是評估我們的測試安全帶的噪音或可靠性。 這可以通過運行相同的實驗兩次并比較結果來評估。在 [A / B 測試](https://en.wikipedia.org/wiki/A/B_testing)的世界中,這通常被稱為 A 對 A 測試,我覺得這個名字很有用。我們的想法是用實驗清除任何明顯的錯誤,并掌握平均值的預期方差。 我們將在網絡上運行兩次有狀態 LSTM 的實驗。 完整的代碼清單如下。 此代碼還為本教程中的所有實驗提供了基礎。我將僅列出已更改的函數,而不是為后續部分中的每個變體重新列出它。 ```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): X, y = train[:, 0:-1], train[:, -1] X = X.reshape(X.shape[0], 1, X.shape[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, 1, len(X)) yhat = model.predict(X, batch_size=batch_size) return yhat[0,0] # run a repeated experiment def experiment(repeats, series): # 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, 1) supervised_values = supervised.values[1:,:] # 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, 1000, 1) # 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 results['results'] = experiment(repeats, series) # summarize results print(results.describe()) # save results results.to_csv('experiment_stateful.csv', index=False) # entry point run() ``` 運行實驗會將結果保存到名為“ _experiment_stateful.csv_ ”的文件中。 再次運行實驗并將實驗寫入的文件名更改為“ _experiment_stateful2.csv_ ”,以便不覆蓋第一次運行的結果。 您現在應該在文件的當前工作目錄中有兩組結果: * _experiment_stateful.csv_ * _experiment_stateful2.csv_ 我們現在可以加載和比較這兩個文件。下面列出了執行此操作的腳本。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_stateful.csv', 'experiment_stateful2.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() ``` 此腳本加載結果文件,并首先計算每次運行的描述性統計信息。 我們可以看到平均結果和標準偏差是相對接近的值(分別約為 103-106 和 7-10)。這是一個好兆頭,但并不完美。預計將實驗的重復次數從 10 增加到 30,100 或甚至 1000 會產生幾乎相同的匯總統計數據。 ```py stateful stateful2 count 10.000000 10.000000 mean 103.142903 106.594624 std 7.109461 10.687509 min 94.052380 91.570179 25% 96.765985 101.015403 50% 104.376252 102.425406 75% 107.753516 115.024920 max 114.958430 125.088436 ``` 比較還創建了一個框和胡須圖來比較兩個分布。 該圖顯示了每個實驗的 10 個測試 RMSE 結果的第 25 個,第 50 個(中位數)和第 75 個百分位數。該框顯示中間 50%的數據,綠線顯示中位數。 該圖顯示雖然描述性統計數據相當接近,但分布確實顯示出一些差異。 然而,分布確實是重疊的,并且不同實驗設置的比較均值和標準偏差是合理的,只要我們不對平均值的適度差異進行狡辯。 ![Box and Whisker Plot of A vs A Experimental Results](https://img.kancloud.cn/ee/d0/eed0e45bfb828202a44d85d76d95af6d_640x480.jpg) 盒子和晶須的 A 與實驗結果 此分析的一個很好的后續步驟是檢查不同樣本量的分布的標準誤差。這將涉及首先創建一個更大的實驗運行池,從中繪制(100 或 1000),并且在比較結果時可以很好地了解重復數的強大數量和平均值的預期誤差。 ## 有狀態與無狀態 LSTM 一個好的第一個實驗是探索 LSTM 中的維持狀態是否增加了不維持狀態的價值。 在本節中,我們將對比: 1. 有狀態 LSTM(上一節的第一個結果)。 2. 具有相同配置的無狀態 LSTM。 3. 無狀態 LSTM 在訓練期間隨機改組。 LSTM 網絡的好處是它們能夠維持狀態并學習序列。 * **期望 1** :期??望有狀態 LSTM 將勝過無狀態 LSTM。 通常執行每批次或時期的輸入模式的混洗以改善訓練期間 MLP 網絡的普遍性。無狀態 LSTM 在訓練期間不會改變輸入模式,因為網絡旨在學習模式序列。我們將測試無狀態 LSTM 是否有改組。 * **期望 2** :期??望沒有改組的無狀態 LSTM 將通過改組跑贏無狀態 LSTM。 代碼更改為上面的有狀態 LSTM 示例以使其無狀態涉及在 LSTM 層中設置 _ 無狀態=假 _ 并使用自動訓練時代訓練而不是手動。結果將寫入名為“ _experiment_stateless.csv_ ”的新文件。更新后的 _fit_lstm()_ 功能如下所示。 ```py # fit an LSTM network to training data def fit_lstm(train, batch_size, nb_epoch, neurons): X, y = train[:, 0:-1], train[:, -1] X = X.reshape(X.shape[0], 1, X.shape[1]) model = Sequential() model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=False)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(X, y, epochs=nb_epoch, batch_size=batch_size, verbose=0, shuffle=False) return model ``` 具有改組實驗的無狀態涉及在 _fit_lstm()_ 函數中調用 fit 時將 _shuffle_ 參數設置為 _True_ 。該實驗的結果寫入文件“ _experiment_stateless_shuffle.csv_ ”。 完整更新的 _fit_lstm()_ 功能如下所示。 ```py # fit an LSTM network to training data def fit_lstm(train, batch_size, nb_epoch, neurons): X, y = train[:, 0:-1], train[:, -1] X = X.reshape(X.shape[0], 1, X.shape[1]) model = Sequential() model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=False)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(X, y, epochs=nb_epoch, batch_size=batch_size, verbose=0, shuffle=True) return model ``` 運行實驗后,您應該有三個結果文件進行比較: * _experiment_stateful.csv_ * _experiment_stateless.csv_ * _experiment_stateless_shuffle.csv_ 我們現在可以加載并比較這些結果。下面列出了比較結果的完整示例。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_stateful.csv', 'experiment_stateless.csv', 'experiment_stateless_shuffle.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() ``` 首先運行該示例計算并打印每個實驗的描述性統計信息。 平均結果表明無狀態 LSTM 配置可能優于有狀態配置。如果強勁,這一發現是非常令人驚訝的,因為它不能滿足增加狀態改善表現的期望。 訓練樣本的改組似乎對無狀態 LSTM 沒有太大影響。如果結果是穩健的,那么對無狀態 LSTM 的改組訓練訂單的期望似乎確實提供了一些好處。 總之,這些發現可能進一步表明所選擇的 LSTM 配置更側重于學習輸入 - 輸出對而不是序列內的依賴性。 僅從這些有限的結果中,人們就會考慮在這個問題上探索無狀態 LSTM。 ```py stateful stateless stateless_shuffle count 10.000000 10.000000 10.000000 mean 103.142903 95.661773 96.206332 std 7.109461 1.924133 2.138610 min 94.052380 94.097259 93.678941 25% 96.765985 94.290720 94.548002 50% 104.376252 95.098050 95.804411 75% 107.753516 96.092609 97.076086 max 114.958430 100.334725 99.870445 ``` 還創建了一個盒子和胡須圖來比較分布。 與無狀態情況相比,有狀態配置的數據傳播顯得更大。當我們查看標準偏差分數時,這也存在于描述性統計中。 這表明無狀態配置可能更穩定。 ![Box and Whisker Plot of Test RMSE of Stateful vs Stateless LSTM Results](https://img.kancloud.cn/e9/7f/e97f56e562266b208b59f1dcc1f53a8b_640x480.jpg) 有狀態與無狀態 LSTM 結果的測試 RMSE 的盒子和晶須圖 ## 大批量無狀態與無狀態無狀態 理解有狀態和無狀態 LSTM 之間差異的關鍵是“當內部狀態被重置時”。 * **無狀態**:在無狀態 LSTM 配置中,內部狀態在每個訓練批次或每個批次進行預測后重置。 * **有狀態**:在有狀態 LSTM 配置中,只有在調用 _reset_state()_ 功能時才會復位內部狀態。 如果這是唯一的區別,則可以使用大批量大小來模擬具有無狀態 LSTM 的有狀態 LSTM。 * **期望 3** :當使用相同的批量大小時,無狀態和有狀態 LSTM 應產生幾乎相同的結果。 我們可以使用 Shampoo Sales 數據集將訓練數據截斷到 12 個月,并將測試數據保留為 12 個月。這將允許無狀態 LSTM 使用 12 的批量大小。如果以一次性方式(一個函數調用)執行訓練和測試,那么“_ 無狀態 _”的內部狀態可能是 LSTM 不會被重置,兩種配置都會產生相同的結果。 我們將使用第一個實驗的有狀態結果作為起點。 _forecast_lstm()_ 功能被修改為在一個步驟中預測一年的觀察。 _ 實驗()_ 功能被修改為將訓練數據集截斷為 12 個月的數據,使用批量大小為 12,并處理從 _forecast_lstm()_ 返回的批量預測功能。下面列出了這些更新的功能。結果將寫入文件“ _experiment_stateful_batch12.csv_ ”。 ```py # make a one-step forecast def forecast_lstm(model, batch_size, X): X = X.reshape(1, 1, len(X)) yhat = model.predict(X, batch_size=batch_size) return yhat[0,0] # run a repeated experiment def experiment(repeats, series): # 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, 1) supervised_values = supervised.values[1:,:] # split data into train and test-sets train, test = supervised_values[-24:-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 batch_size = 12 lstm_model = fit_lstm(train_scaled, batch_size, 1000, 1) # forecast test dataset test_reshaped = test_scaled[:,0:-1] test_reshaped = test_reshaped.reshape(len(test_reshaped), 1, 1) output = lstm_model.predict(test_reshaped, batch_size=batch_size) predictions = list() for i in range(len(output)): yhat = output[i,0] X = test_scaled[i, 0:-1] # 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 ``` 我們將使用前一個實驗中的無狀態 LSTM 配置,將訓練模式混洗作為起點。該實驗使用與上面列出的相同的 _forecast_lstm()_ 和 _experiment()_ 函數。結果寫入文件“ _experiment_stateless_batch12.csv_ ”。 運行此實驗后,您將有兩個結果文件: * _experiment_stateful_batch12.csv_ * _experiment_stateless_batch12.csv_ 我們現在可以比較這些實驗的結果。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_stateful_batch12.csv', 'experiment_stateless_batch12.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() ``` 運行比較腳本首先計算并打印每個實驗的描述性統計信息。 每個實驗的平均結果表明具有相同批次大小的無狀態和有狀態配置之間的等效結果。這證實了我們的期望。 如果這個結果是穩健的,那么它表明在內部狀態重置之后,Keras 中的無狀態和有狀態 LSTM 網絡之間沒有進一步的實現 - 詳細差異。 ```py stateful_batch12 stateless_batch12 count 10.000000 10.000000 mean 97.920126 97.450757 std 6.526297 5.707647 min 92.723660 91.203493 25% 94.215807 93.888928 50% 95.770862 95.640314 75% 99.338368 98.540688 max 114.567780 110.014679 ``` 還創建了一個盒子和胡須圖來比較分布。 該圖證實了描述性統計中的故事,或許只是突出了實驗設計的可變性。 ![Box and Whisker Plot of Test RMSE of Stateful vs Stateless with Large Batch Size LSTM Results](https://img.kancloud.cn/c9/8a/c98af24fead8926ee2579c60729045f8_640x480.jpg) 具有大批量 LSTM 結果的有狀態與無狀態測試 RMSE 的框和晶須圖 ## 有狀態重置與無狀態重置 關于有狀態 LSTM 的另一個問題是對州進行重置的最佳制度。 通常,我們希望在每次呈現序列后重置狀態是個好主意。 * **期望 4** :在每個訓練時期之后重置狀態可以獲得更好的測試表現。 這提出了在進行預測時管理狀態的最佳方法的問題。例如,網絡是否應該首先對訓練數據集進行預測? * **期望 5** :通過對訓練數據集進行預測,LSTM 中的播種狀態可以提高測試表現。 我們還希望不在測試集上的一步預測之間重置 LSTM 狀態是個好主意。 * **期望 6** :在測試集上的一步預測之間不重置狀態會導致更好的測試集表現。 還有一個問題是,重置狀態是否是一個好主意。在本節中,我們嘗試梳理這些問題的答案。 我們將再次使用所有可用數據和批量大小為 1 進行一步預測。 總之,我們將比較以下實驗設置: 沒有種子: * **noseed_1** :在每個訓練時期之后重置狀態而不是在測試期間(來自 _experiment_stateful.csv_ 中的第一個實驗的有狀態結果)。 * **noseed_2** :在每個訓練時期之后和每個一步預測之后復位狀態( _experiment_stateful_reset_test.csv_ )。 * **noseed_3** :訓練后無需重置或進行一步預測( _experiment_stateful_noreset.csv_ )。 播種: * **seed_1** :在每個訓練時期之后重置狀態,在對測試數據集進行一步預測之前對訓練數據集進行一步預測的種子狀態( _experiment_stateful_seed_train.csv_ )。 * **seed_2** :在每個訓練時期后重置狀態,在訓練數據集上進行一步預測的種子狀態,然后對測試數據集進行一步預測,并在訓練和測試集上的每個一步預測后重置狀態( _experiment_stateful_seed_train_resets.csv_ )。 * **seed_3** :在進行一步預測之前訓練數據集上的種子,在預測訓練期間沒有重置( _experiment_stateful_seed_train_no_resets.csv_ )。 來自第一個“A vs A”實驗的有狀態實驗代碼用作基礎。 下面列出了各種重置/不重置和播種/不播種所需的修改。 我們可以通過在每次預測之后在模型上添加對 _reset_states()_ 的調用來更新 _forecast_lstm()_ 函數以在每次測試之后更新。更新的 _forecast_lstm()_ 功能如下所示。 ```py # make a one-step forecast def forecast_lstm(model, batch_size, X): X = X.reshape(1, 1, len(X)) yhat = model.predict(X, batch_size=batch_size) model.reset_states() return yhat[0,0] ``` 我們可以通過刪除對 _reset_states()_ 的調用來更新 _fit_lstm()_ 函數,使其在每個迭代后不復位。完整的功能如下所列。 ```py # fit an LSTM network to training data def fit_lstm(train, batch_size, nb_epoch, neurons): X, y = train[:, 0:-1], train[:, -1] X = X.reshape(X.shape[0], 1, X.shape[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) return model ``` 通過循環訓練數據集并進行一步預測,我們可以在訓練后通過訓練數據集對訓練數據集進行訓練,使 LSTM 狀態成為種子。在對測試數據集進行一步預測之前,可以將其添加到 _run()_ 函數中。更新的 _run()_ 功能如下所示。 ```py # run a repeated experiment def experiment(repeats, series): # 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, 1) supervised_values = supervised.values[1:,:] # 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, 1000, 1) # forecast train dataset for i in range(len(train_scaled)): X, y = train_scaled[i, 0:-1], train_scaled[i, -1] yhat = forecast_lstm(lstm_model, 1, X) # 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 ``` 這結束了為這 6 個實驗創建代碼所需的所有分段修改。 運行這些實驗后,您將獲得以下結果文件: * _experiment_stateful.csv_ * _experiment_stateful_reset_test.csv_ * _experiment_stateful_noreset.csv_ * _experiment_stateful_seed_train.csv_ * _experiment_stateful_seed_train_resets.csv_ * _experiment_stateful_seed_train_no_resets.csv_ 我們現在可以使用下面的腳本比較結果。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_stateful.csv', 'experiment_stateful_reset_test.csv', 'experiment_stateful_noreset.csv', 'experiment_stateful_seed_train.csv', 'experiment_stateful_seed_train_resets.csv', 'experiment_stateful_seed_train_no_resets.csv'] results = DataFrame() for name in filenames: results[name] = read_csv(name, header=0) results.columns = ['noseed_1', 'noseed_2', 'noseed_3', 'seed_1', 'seed_2', 'seed_3'] # describe all results print(results.describe()) # box and whisker plot results.boxplot() pyplot.show() ``` 運行比較會為每組結果打印描述性統計信息。 沒有播種的結果表明在測試數據集上的每次預測之后重置之間可能沒有什么差別。這表明從預測到預測構建的任何狀態都不會增加值,或者此狀態由 Keras API 隱式清除。這是一個令人驚訝的結果。 無種子案例的結果也表明,在訓練期間沒有重置導致平均表現更差,方差更大,而不是在每個時期結束時重置狀態。這證實了期望在每個訓練時期結束時重置狀態是一種很好的做法。 種子實驗的平均結果表明,在對測試數據集進行預測之前,對訓練數據集進行預測的播種 LSTM 狀態是中性的,如果不是導致表現稍差。 在訓練和測試裝置上的每次預測之后重置狀態似乎導致稍微更好的表現,而在訓練或測試期間不重置狀態似乎導致最佳表現。 關于播種的這些結果令人驚訝,但我們應該注意,平均值都在 5 個月洗發水銷售的測試 RMSE 內,并且可能是統計噪聲。 ```py noseed_1 noseed_2 noseed_3 seed_1 seed_2 seed_3 count 10.000000 10.000000 10.000000 10.000000 10.000000 10.000000 mean 103.142903 101.757034 110.441021 105.468200 100.093551 98.766432 std 7.109461 14.584442 24.539690 5.206674 4.157095 11.573366 min 94.052380 91.264712 87.262549 97.683535 95.913385 90.005843 25% 96.765985 93.218929 94.610724 100.974693 96.721924 91.203879 50% 104.376252 96.144883 99.483971 106.036240 98.779770 95.079716 75% 107.753516 105.657586 121.586508 109.829793 103.082791 100.500867 max 114.958430 138.752321 166.527902 112.691046 108.070145 128.261354 ``` 還創建了一個盒子和胡須圖來比較分布。 該情節與描述性統計數據相同。它突出了在沒有播種的情況下無狀態 LSTM 上沒有使用重置時增加的傳播。它還強調了通過對訓練數據集進行預測來實現 LSTM 狀態的實驗的一般緊密傳播。 ![Box and Whisker Plot of Test RMSE of Reset Regimes in Stateful LSTMs](https://img.kancloud.cn/14/4c/144cc25b289be9afbb3f8381dd3ac9fe_640x480.jpg) 有狀態 LSTM 中重置機制測試 RMSE 的盒子和晶須圖 ## 審查結果 在本節中,我們將回顧本教程中的研究結果。 * 具有所選配置的 10 次重復實驗導致測試 RMSE 的平均值和標準偏差在約 3 個月洗發劑銷售中有一些變化。預計會有更多重復收緊。 * 具有相同配置的無狀態 LSTM 可能比有狀態版本在此問題上表現更好。 * 不使用無狀態 LSTM 改變訓練模式可能會導致稍微更好的表現。 * 當使用大批量大小時,可以使用無狀態 LSTM 模擬有狀態 LSTM。 * 使用有狀態 LSTM 進行一步預測時重置狀態可以提高測試集的表現。 * 通過在對測試集進行預測之前對訓練數據集進行預測來在有狀態 LSTM 中播種狀態不會導致測試集上的表現的明顯改善。 * 擬合有狀態 LSTM 并將其播種到訓練數據集上并且在訓練或預測期間不執行任何狀態重置可以導致測試集上的更好表現。 必須指出的是,通過增加每個實驗的重復次數并使用統計顯著性檢驗確認差異是顯著的,這些發現應該更加穩健。 還應注意,這些結果適用于此特定問題,框架的方式以及所選的 LSTM 配置參數,包括拓撲,批量大小和訓練時期。 ## 摘要 在本教程中,您了解了如何使用有狀態與無狀態 LSTM 網絡來研究使用 Keras 在 Python 中進行時間序列預測的影響。 具體來說,你學到了: * 如何比較無狀態與狀態 LSTM 網絡的時間序列預測。 * 如何確認無狀態 LSTM 和具有大批量大小的有狀態 LSTM 的等價性。 * 如何評估在訓練期間重置 LSTM 狀態以及使用 LSTM 網絡進行時間序列預測預測時的影響。 你有任何問題嗎?在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看