<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 中種子狀態用于 Python 中的時間序列預測 > 原文: [https://machinelearningmastery.com/seed-state-lstms-time-series-forecasting-python/](https://machinelearningmastery.com/seed-state-lstms-time-series-forecasting-python/) 長短期記憶網絡(LSTM)是一種強大的循環神經網絡,能夠學習長序列觀察。 LSTM 的承諾是它們可能在時間序列預測中有效,盡管已知該方法難以配置和用于這些目的。 LSTM 的一個關鍵特征是它們保持內部狀態,有助于預測。這提出了在進行預測之前如何最好地使擬合 LSTM 模型的狀態播種的問題。 在本教程中,您將了解如何設計,執行和解釋實驗的結果,以探索是否更好地從訓練數據集中獲取擬合 LSTM 的狀態或不使用先前狀態。 完成本教程后,您將了解: * 關于如何最好地初始化適合 LSTM 狀態以進行預測的未決問題。 * 如何開發一個強大的測試工具來評估 LSTM 模型的單變量時間序列預測問題。 * 如何確定在預測之前是否播種 LSTM 的狀態對于您的時間序列預測問題是一個好主意。 讓我們開始吧。 ![How to Seed State for LSTMs for Time Series Forecasting in Python](https://img.kancloud.cn/bf/0c/bf0ccf4b32e795ec4a802cc1f1d962a1_640x416.jpg) 如何為 LSTM 制作狀態用于 Python 中的時間序列預測 照片由 [Tony Hisgett](https://www.flickr.com/photos/hisgett/6940877193/) ,保留一些權利。 ## 教程概述 本教程分為 5 個部分;他們是: 1. 播種 LSTM 國家 2. 洗發水銷售數據集 3. LSTM 模型和測試線束 4. 代碼清單 5. 實驗結果 ### 環境 本教程假定您已安裝 Python SciPy 環境。您可以在此示例中使用 Python 2 或 3。 您必須安裝帶有 TensorFlow 或 Theano 后端的 Keras(2.0 或更高版本)。 本教程還假設您安裝了 scikit-learn,Pandas,NumPy 和 Matplotlib。 如果您在設置 Python 環境時需要幫助,請參閱以下帖子: * [如何使用 Anaconda 設置用于機器學習和深度學習的 Python 環境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## 播種 LSTM 國家 在 Keras 中使用無狀態 LSTM 時,您可以在清除模型的內部狀態時進行細粒度控制。 這是使用 _model.reset_states()_ 函數實現的。 在訓練有狀態 LSTM 時,重要的是清除訓練時期之間的模型狀態。這使得在時期訓練期間建立的國家與時代中的觀察序列相稱。 鑒于我們有這種細粒度控制,在進行預測之前,是否以及如何初始化 LSTM 的狀態存在一個問題。 選項是: * 在預測之前重置狀態。 * 在預測之前使用訓練數據集初始化狀態。 假設使用訓練數據初始化模型的狀態將是優越的,但這需要通過實驗來確認。 此外,可能有多種方法來種植這種狀態;例如: * 完成訓練時期,包括體重更新。例如,不要在上一個訓練時期結束時重置。 * 完成訓練數據的預測。 通常,認為這兩種方法在某種程度上是等同的。后者預測訓練數據集是首選,因為它不需要對網絡權重進行任何修改,并且可以是保存到文件的不可變網絡的可重復過程。 在本教程中,我們將考慮以下兩者之間的區別: * 使用沒有狀態的擬合 LSTM 預測測試數據集(例如,在重置之后)。 * 在預測了訓練數據集之后,使用狀態 LSTM 預測測試數據集。 接下來,讓我們看一下我們將在本實驗中使用的標準時間序列數據集。 ## 洗發水銷售數據集 該數據集描述了 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 配置和測試工具。 ## LSTM 模型和測試線束 ### 數據拆分 我們將 Shampoo Sales 數據集分為兩部分:訓練和測試集。 前兩年的數據將用于訓練數據集,剩余的一年數據將用于測試集。 將使用訓練數據集開發模型,并對測試數據集進行預測。 ### 模型評估 將使用滾動預測場景,也稱為前進模型驗證。 測試數據集的每個時間步驟將一次一個地走。將使用模型對時間步長進行預測,然后將獲取測試集的實際預期值,并使其可用于下一時間步的預測模型。 這模仿了一個真實世界的場景,每個月都會有新的洗發水銷售觀察結果,并用于下個月的預測。 這將通過訓練和測試數據集的結構進行模擬。我們將以一次性方法進行所有預測。 將收集關于測試數據集的所有預測,并計算錯誤分數以總結模型的技能。將使用均方根誤差(RMSE),因為它會對大錯誤進行處罰,并產生與預測數據相同的分數,即每月洗發水銷售額。 ### 數據準備 在我們將 LSTM 模型擬合到數據集之前,我們必須轉換數據。 在擬合模型和進行預測之前,對數據集執行以下三個數據變換。 1. **轉換時間序列數據,使其靜止**。具體地,_ 滯后= 1_ 差異以消除數據中的增加趨勢。 2. **將時間序列轉換為監督學習問題**。具體而言,將數據組織成輸入和輸出模式,其中前一時間步驟的觀察被用作在當前時間步長預測觀察的輸入。 3. **將觀察結果轉換為具有特定比例**。具體而言,要將數據重新調整為-1 到 1 之間的值,以滿足 LSTM 模型的默認雙曲正切激活函數。 ### LSTM 模型 將使用熟練但未調整的 LSTM 模型配置。 這意味著模型將適合數據并且能夠進行有意義的預測,但不會是數據集的最佳模型。 網絡拓撲由 1 個輸入,4 個單元的隱藏層和 1 個輸出值的輸出層組成。 該模型適用于批量大小為 4 的 3,000 個時期。數據準備后,訓練數據集將減少到 20 個觀測值。這樣,批量大小均勻地分為訓練數據集和測試數據集(需求)。 ### 實驗運行 每個方案將運行 30 次。 這意味著將為每個方案創建和評估 30 個模型。將收集每次運行的 RMSE,提供一組結果,可使用描述性統計數據(如均值和標準差)進行匯總。 這是必需的,因為像 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 # be able to save images on server matplotlib.use('Agg') from matplotlib import pyplot import numpy # 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, seed): # 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 model batch_size = 4 train_trimmed = train_scaled[2:, :] lstm_model = fit_lstm(train_trimmed, batch_size, 3000, 4) # forecast the entire training dataset to build up state for forecasting if seed: train_reshaped = train_trimmed[:, 0].reshape(len(train_trimmed), 1, 1) lstm_model.predict(train_reshaped, batch_size=batch_size) # 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 # load dataset series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) # experiment repeats = 30 results = DataFrame() # with seeding with_seed = experiment(repeats, series, True) results['with-seed'] = with_seed # without seeding without_seed = experiment(repeats, series, False) results['without-seed'] = without_seed # summarize results print(results.describe()) # save boxplot results.boxplot() pyplot.savefig('boxplot.png') ``` ## 實驗結果 運行實驗需要一些時間或 CPU 或 GPU 硬件。 打印每次運行的 RMSE 以了解進度。 在運行結束時,將為每個方案計算和打印摘要統計信息,包括平均值和標準差。 完整輸出如下所示。 ```py 1) Test RMSE: 86.566 2) Test RMSE: 300.874 3) Test RMSE: 169.237 4) Test RMSE: 167.939 5) Test RMSE: 135.416 6) Test RMSE: 291.746 7) Test RMSE: 220.729 8) Test RMSE: 222.815 9) Test RMSE: 236.043 10) Test RMSE: 134.183 11) Test RMSE: 145.320 12) Test RMSE: 142.771 13) Test RMSE: 239.289 14) Test RMSE: 218.629 15) Test RMSE: 208.855 16) Test RMSE: 187.421 17) Test RMSE: 141.151 18) Test RMSE: 174.379 19) Test RMSE: 241.310 20) Test RMSE: 226.963 21) Test RMSE: 126.777 22) Test RMSE: 197.340 23) Test RMSE: 149.662 24) Test RMSE: 235.681 25) Test RMSE: 200.320 26) Test RMSE: 92.396 27) Test RMSE: 169.573 28) Test RMSE: 219.894 29) Test RMSE: 168.048 30) Test RMSE: 141.638 1) Test RMSE: 85.470 2) Test RMSE: 151.935 3) Test RMSE: 102.314 4) Test RMSE: 215.588 5) Test RMSE: 172.948 6) Test RMSE: 114.746 7) Test RMSE: 205.958 8) Test RMSE: 89.335 9) Test RMSE: 183.635 10) Test RMSE: 173.400 11) Test RMSE: 116.645 12) Test RMSE: 133.473 13) Test RMSE: 155.044 14) Test RMSE: 153.582 15) Test RMSE: 146.693 16) Test RMSE: 95.455 17) Test RMSE: 104.970 18) Test RMSE: 127.700 19) Test RMSE: 189.728 20) Test RMSE: 127.756 21) Test RMSE: 102.795 22) Test RMSE: 189.742 23) Test RMSE: 144.621 24) Test RMSE: 132.053 25) Test RMSE: 238.034 26) Test RMSE: 139.800 27) Test RMSE: 202.881 28) Test RMSE: 172.278 29) Test RMSE: 125.565 30) Test RMSE: 103.868 with-seed without-seed count 30.000000 30.000000 mean 186.432143 146.600505 std 52.559598 40.554595 min 86.565993 85.469737 25% 143.408162 115.221000 50% 180.899814 142.210265 75% 222.293194 173.287017 max 300.873841 238.034137 ``` 還會創建一個框和胡須圖并將其保存到文件中,如下所示。 ![Box and Whisker Plot of LSTM with and Without Seed of State](https://img.kancloud.cn/99/ac/99ac594a1067ccd5fa26b985f8a3a325_640x480.jpg) 含有和不含種子的 LSTM 的盒子和晶須圖 結果令人驚訝。 他們建議通過在預測測試數據集之前不播種 LSTM 的狀態來獲得更好的結果。 這可以通過每月洗發水銷售額 146.600505 的平均誤差較低來看出,而播種的平均誤差為 186.432143。分布的盒子和須狀圖更加清晰。 也許所選擇的模型配置導致模型太小而不依賴于序列和內部狀態以在預測之前受益于播種。也許需要更大的實驗。 ### 擴展 令人驚訝的結果為進一步的實驗打開了大門。 * 評估在最后一個訓練時期結束后清除與不清除狀態的影響。 * 評估一次預測訓練和測試集的效果,一次評估一個時間步。 * 評估在每個迭代結束時重置和不重置 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>

                              哎呀哎呀视频在线观看