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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 如何在時間序列預測訓練期間更新 LSTM 網絡 > 原文: [https://machinelearningmastery.com/update-lstm-networks-training-time-series-forecasting/](https://machinelearningmastery.com/update-lstm-networks-training-time-series-forecasting/) 使用神經網絡模型進行時間序列預測的好處是可以在新數據可用時更新權重。 在本教程中,您將了解如何使用新數據更新長期短期記憶(LSTM)循環神經網絡以進行時間序列預測。 完成本教程后,您將了解: * 如何用新數據更新 LSTM 神經網絡。 * 如何開發測試工具來評估不同的更新方案。 * 如何解釋使用新數據更新 LSTM 網絡的結果。 讓我們開始吧。 * **2017 年 4 月更新**:添加了缺少的 update_model()函數。 ![How to Update LSTM Networks During Training for Time Series Forecasting](https://img.kancloud.cn/f1/fa/f1fab05786bcec848a9928fe443f9cb1_640x427.jpg) 如何在時間序列預測訓練期間更新 LSTM 網絡 照片由 [Esteban Alvarez](https://www.flickr.com/photos/alvaretz/8427810143/) ,保留一些權利。 ## 教程概述 本教程分為 9 個部分。他們是: 1. 洗發水銷售數據集 2. 實驗測試線束 3. 實驗:沒有更新 4. 實驗:2 更新時期 5. 實驗:5 更新時期 6. 實驗:10 個更新時期 7. 實驗:20 個更新時期 8. 實驗:50 更新時期 9. 結果比較 ### 環境 本教程假定您已安裝 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 網絡的隨機初始條件可導致非常不同的表現。 讓我們深入研究實驗。 ## 實驗:沒有更新 在第一個實驗中,我們將評估一次訓練的 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) df = df.drop(0) 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 # 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) # 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_fixed.csv', index=False) # entry point run() ``` 運行該示例使用前向驗證存儲在測試數據集上計算的 RMSE 分數。它們存儲在名為 _experiment_fixed.csv_ 的文件中,以供以后分析。打印分數摘要,如下所示。 結果表明,平均表現優于持久性模型,顯示測試 RMSE 為 109.565465,而持久性的洗發水銷售額為 136.761。 ```py results count 10.000000 mean 109.565465 std 14.329646 min 95.357198 25% 99.870983 50% 104.864387 75% 113.553952 max 138.261929 ``` 接下來,我們將開始查看在前向驗證期間對模型進行更新的配置。 ## 實驗:2 更新時期 在本實驗中,我們將模型擬合到所有訓練數據上,然后在前向驗證期間的每個預測之后更新模型。 然后,將用于在測試數據集中引出預測的每個測試模式添加到訓練數據集中,并更新模型。 在這種情況下,該模型在進行下一次預測之前適合額外的 2 個訓練時期。 使用與第一個實驗中使用的相同的代碼清單。代碼清單的更改如下所示。 ```py # Update LSTM model def update_model(model, train, batch_size, updates): X, y = train[:, 0:-1], train[:, -1] X = X.reshape(X.shape[0], 1, X.shape[1]) for i in range(updates): model.fit(X, y, nb_epoch=1, batch_size=batch_size, verbose=0, shuffle=False) model.reset_states() # run a repeated experiment def experiment(repeats, series, updates): # 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 # 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) # forecast test dataset train_copy = numpy.copy(train_scaled) predictions = list() for i in range(len(test_scaled)): # update model if i > 0: update_model(lstm_model, train_copy, 1, updates) # 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) # add to training set train_copy = concatenate((train_copy, test_scaled[i,:].reshape(1, -1))) # 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 updates = 2 results['results'] = experiment(repeats, series, updates) # summarize results print(results.describe()) # save results results.to_csv('experiment_update_2.csv', index=False) # entry point run() ``` 運行實驗將最終測試 RMSE 分數保存在“ _experiment_update_2.csv_ ”中,并打印結果的摘要統計信息,如下所示。 ```py results count 10.000000 mean 99.566270 std 10.511337 min 87.771671 25% 93.925243 50% 97.903038 75% 101.213058 max 124.748746 ``` ## 實驗:5 更新時期 該實驗重復上述更新實驗,并在將每個測試模式添加到訓練數據集之后將模型訓練另外 5 個時期。 運行實驗將最終測試 RMSE 分數保存在“ _experiment_update_5.csv_ ”中,并打印結果的摘要統計信息,如下所示。 ```py results count 10.000000 mean 101.094469 std 9.422711 min 91.642706 25% 94.593701 50% 98.954743 75% 104.998420 max 123.651985 ``` ## 實驗:10 個更新時期 該實驗重復上述更新實驗,并在將每個測試模式添加到訓練數據集之后將模型訓練另外 10 個時期。 運行實驗將最終測試 RMSE 分數保存在“ _experiment_update_10.csv_ ”中,并打印結果的摘要統計信息,如下所示。 ```py results count 10.000000 mean 108.806418 std 21.707665 min 92.161703 25% 94.872009 50% 99.652295 75% 112.607260 max 159.921749 ``` ## 實驗:20 個更新時期 該實驗重復上述更新實驗,并在將每個測試模式添加到訓練數據集之后將模型訓練另外 20 個時期。 運行實驗將最終測試 RMSE 分數保存在“ _experiment_update_20.csv_ ”中,并打印結果的摘要統計信息,如下所示。 ```py results count 10.000000 mean 112.070895 std 16.631902 min 96.822760 25% 101.790705 50% 103.380896 75% 119.479211 max 140.828410 ``` ## 實驗:50 更新時期 該實驗重復上述更新實驗,并在將每個測試模式添加到訓練數據集之后將模型訓練另外 50 個時期。 運行實驗將最終測試 RMSE 分數保存在“ _experiment_update_50.csv_ ”中,并打印結果的摘要統計信息,如下所示。 ```py results count 10.000000 mean 110.721971 std 22.788192 min 93.362982 25% 96.833140 50% 98.411940 75% 123.793652 max 161.463289 ``` ## 結果比較 在本節中,我們比較了之前實驗中保存的結果。 我們加載每個保存的結果,使用描述性統計數據匯總結果,并使用 box 和 whisker 圖比較結果。 完整的代碼清單如下。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_fixed.csv', 'experiment_update_2.csv', 'experiment_update_5.csv', 'experiment_update_10.csv', 'experiment_update_20.csv', 'experiment_update_50.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() ``` 首先運行該示例計算并打印每個實驗結果的描述性統計數據。 如果我們看一下平均表現,我們可以看到固定模型提供了良好的表現基線,但我們發現適度數量的更新時期(20 和 50)平均會產生更差的測試集 RMSE。 我們看到少數更新時期導致更好的整體測試集表現,特別是 2 個時期,接著是 5 個時期。這是令人鼓舞的。 ```py fixed update_2 update_5 update_10 update_20 update_50 count 10.000000 10.000000 10.000000 10.000000 10.000000 10.000000 mean 109.565465 99.566270 101.094469 108.806418 112.070895 110.721971 std 14.329646 10.511337 9.422711 21.707665 16.631902 22.788192 min 95.357198 87.771671 91.642706 92.161703 96.822760 93.362982 25% 99.870983 93.925243 94.593701 94.872009 101.790705 96.833140 50% 104.864387 97.903038 98.954743 99.652295 103.380896 98.411940 75% 113.553952 101.213058 104.998420 112.607260 119.479211 123.793652 max 138.261929 124.748746 123.651985 159.921749 140.828410 161.463289 ``` 還創建了一個盒子和須狀圖,用于比較每個實驗的測試 RMSE 結果的分布。 該圖突出顯示了每個實驗的中位數(綠線)以及中間 50%的數據(框)。該圖描述了與平均表現相同的故事,表明少數訓練時期(2 或 5 個時期)導致最佳的整體測試 RMSE。 該圖顯示測試 RMSE 上升,因為更新次數增加到 20 個時期,然后再次下降 50 個時期。這可能是改進模型(11 * 50 時期)或少量重復(10)的人工制品的重要進一步訓練的標志。 ![Box and Whisker Plots Comparing the Number of Update Epochs](https://img.kancloud.cn/a4/68/a4689d4bda8ed7657bf220c5326369f1_640x480.jpg) Box 和 Whisker Plots 比較更新時期的數量 重要的是要指出這些結果特定于模型配置和此數據集。 雖然這些實驗確實為您自己的預測建模問題執行類似的實驗提供了框架,但很難將這些結果概括為超出此具體示例。 ### 擴展 本節列出了本節中有關實驗擴展的建議。 * **統計顯著性檢驗**。我們可以計算成對統計顯著性檢驗,例如學生 t 檢驗,以查看結果群體中均值之間的差異是否具有統計學意義。 * **更多重復**。我們可以將重復次數從 10 增加到 30,100 或更多,以使結果更加穩健。 * **更多時代**。基礎 LSTM 模型僅適用于 500 個具有在線訓練的時期,并且相信額外的訓練時期將導致更準確的基線模型。減少了時期的數量以減少實驗運行時間。 * **與更多 Epochs** 比較。更新模型的實驗結果應直接與固定模型的實驗進行比較,固定模型使用相同數量的總體時期來查看是否將額外的測試模式添加到訓練數據集中會產生明顯的差異。例如,可以將每個測試模式的 2 個更新時期與針對 500 +(12-1)* 2)或 522 個時期訓練的固定模型進行比較,更新模型 5 與適合 500 +(12-1)的固定模型進行比較)* 5)或 555 個時代,依此類推。 * **全新模型**。在將每個測試模式添加到訓練數據集后,添加一個適合新模型的實驗。這是嘗試過的,但延長的運行時間阻止了在完成本教程之前收集結果。預計這將提供與更新和固定模型的有趣比較點。 你有沒有探索過這些擴展? 在評論中報告您的結果;我很想聽聽你發現了什么。 ## 摘要 在本教程中,您了解了如何更新 LSTM 網絡,因為新數據可用于 Python 中的時間序列預測。 具體來說,你學到了: * 如何設計一套系統的實驗來探索更新 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>

                              哎呀哎呀视频在线观看