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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 如何使用 LSTM 網絡中的特征進行時間序列預測 > 原文: [https://machinelearningmastery.com/use-features-lstm-networks-time-series-forecasting/](https://machinelearningmastery.com/use-features-lstm-networks-time-series-forecasting/) Keras 中的長短期記憶(LSTM)網絡支持多種輸入功能。 這就提出了一個問題,即單變量時間序列的滯后觀測是否可以用作 LSTM 的特征,以及這是否會改善預測表現。 在本教程中,我們將研究使用滯后觀察作為 Python 中 LSTM 模型的特征。 完成本教程后,您將了解: * 如何開發測試工具以系統地評估 LSTM 功能以進行時間序列預測。 * 使用不同數量的滯后觀測值作為 LSTM 模型的輸入特征的影響。 * 對 LSTM 模型使用不同數量的滯后觀察和匹配數量的神經元的影響。 讓我們開始吧。 ![How to Use Features in LSTM Networks for Time Series Forecasting](https://img.kancloud.cn/ac/c0/acc0dfa72cef3faae1a33fca94dde5c4_640x424.jpg) 如何使用 LSTM 網絡中的功能進行時間??序列預測 [Tom Hodgkinson](https://www.flickr.com/photos/hodgers/117655250/in/photostream/) 的照片,保留一些權利。 ## 教程概述 本教程分為 4 個部分。他們是: 1. 洗發水銷售數據集 2. 實驗測試線束 3. 使用 Timesteps 的實驗 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 個功能。希望是滯后觀測的附加背景可以改善預測模型的表現。 在訓練模型之前,單變量時間序列被轉換為監督學習問題。指定數量的特征定義用于預測下一次觀察的輸入變量( _X_ )的數量( _y_ )。因此,對于表示中使用的每個要素,必須從數據集的開頭刪除許多行。這是因為沒有先前的觀察結果可用作數據集中第一個值的特征。 下面提供了測試 1 輸入功能的完整代碼清單。 對于 5 個實驗中的每一個, _run()_ 函數中的特征參數從 1 到 5 變化。此外,結果在實驗結束時保存到文件中,并且還必須針對每個不同的實驗運行更改該文件名,例如, _experiment_features_1.csv_ , _experiment_features_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): 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, features): # 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, features) supervised_values = supervised.values[features:,:] # 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 features = 1 results['results'] = experiment(repeats, series, features) # summarize results print(results.describe()) # save results results.to_csv('experiment_features_1.csv', index=False) # entry point run() ``` 針對 5 種不同數量的特征運行 5 個不同的實驗。 如果有足夠的內存和 CPU 資源,可以并行運行它們。這些實驗不需要 GPU 資源,運行應該在幾分鐘到幾十分鐘內完成。 運行實驗后,您應該有 5 個包含結果的文件,如下所示: * _experiment_features_1.csv_ * _experiment_features_2.csv_ * _experiment_features_3.csv_ * _experiment_features_4.csv_ * _experiment_features_5.csv_ 我們可以編寫一些代碼來加載和匯總這些結果。 具體而言,查看每次運行的描述性統計數據并使用方框和胡須圖比較每次運行的結果非常有用。 下面列出了總結結果的代碼。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_features_1.csv', 'experiment_features_2.csv', 'experiment_features_3.csv','experiment_features_4.csv','experiment_features_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 features_1 features_2 features_3 features_4 features_5 count 10.000000 10.000000 10.000000 10.000000 10.000000 mean 104.588249 126.597800 118.268251 107.694178 116.414887 std 10.205840 18.639757 14.359983 8.683271 18.806281 min 89.046814 93.857991 103.900339 93.702085 98.245871 25% 97.850827 120.296634 107.664087 102.992045 105.660897 50% 103.713285 133.582095 116.123790 106.116922 112.950460 75% 111.441655 134.362198 121.794533 111.498255 117.926664 max 122.341580 149.807155 152.412861 123.006088 164.598542 ``` 還創建了比較結果分布的盒子和胡須圖。 該情節與描述性統計數據相同。隨著功能數量的增加,測試 RMSE 似乎躍升了 2 個功能并且趨勢向上。 ![Box and Whisker Plot of Test RMSE vs The Number of Input Features](https://img.kancloud.cn/e3/60/e3602c7f5a48cfed98bd7baddcf048e9_640x480.jpg) 測試 RMSE 的盒子和晶須圖與輸入特征的數量 至少在使用數據集和 LSTM 配置的情況下,沒有觀察到隨著特征的增加而減少的誤差的期望。 這就提出了一個問題,即網絡的容量是否是一個限制因素。我們將在下一節中看到這一點。 ## 特征和神經元的實驗 LSTM 網絡中的神經元(也稱為單元)的數量定義了其學習能力。 在先前的實驗中,可能使用一個神經元限制了網絡的學習能力,使得它不能有效地使用滯后觀察作為特征。 我們可以重復上述實驗,并隨著特征的增加增加 LSTM 中神經元的數量,看看它是否會導致表現的提高。 這可以通過更改實驗函數中的行來實現: ```py lstm_model = fit_lstm(train_scaled, 1, 500, 1, features) ``` 至 ```py lstm_model = fit_lstm(train_scaled, 1, 500, features, features) ``` 此外,我們可以通過在文件名中添加“ __neurons_ ”后綴來保持寫入文件的結果與第一個實驗的結果分開,例如,更改: ```py results.to_csv('experiment_features_1.csv', index=False) ``` 至 ```py results.to_csv('experiment_features_1_neurons.csv', index=False) ``` 用這些變化重復相同的 5 個實驗。 運行這些實驗后,您應該有 5 個結果文件。 * _experiment_features_1_neurons.csv_ * _experiment_features_2_neurons.csv_ * _experiment_features_3_neurons.csv_ * _experiment_features_4_neurons.csv_ * _experiment_features_5_neurons.csv_ 與前一個實驗一樣,我們可以加載結果,計算描述性統計數據,并創建一個盒子和須狀圖。完整的代碼清單如下。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_features_1_neurons.csv', 'experiment_features_2_neurons.csv', 'experiment_features_3_neurons.csv','experiment_features_4_neurons.csv','experiment_features_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 features_1 features_2 features_3 features_4 features_5 count 10.000000 10.000000 10.000000 10.000000 10.000000 mean 106.219189 138.411111 127.687128 154.281694 175.951500 std 16.100488 29.700981 21.411766 30.526294 44.839217 min 91.073598 92.641030 103.503546 94.063639 117.017109 25% 97.263723 125.748973 108.972440 134.805621 142.146601 50% 99.036766 133.639168 128.627349 162.295657 182.406707 75% 110.625302 146.896608 134.012859 176.969980 197.913894 max 146.638148 206.760081 170.899267 188.911768 250.685187 ``` 創建框和胡須圖以比較分布。 隨著神經元數量和輸入特征的增加,擴散和中位表現的趨勢幾乎表明測試 RMSE 呈線性增加。 線性趨勢可能表明增加的網絡容量沒有足夠的時間來擬合數據。也許還需要增加時代數量。 ![Box and Whisker Plot of Test RMSE vs The Number of Neurons and Input Features](https://img.kancloud.cn/41/bc/41bc603cd4a3ef210e4b8a25f8f33d1e_640x480.jpg) 測試 RMSE 的盒子和晶須圖與神經元和輸入特征的數量 ## 特征和神經元的實驗更多時代 在本節中,我們重復上述實驗,以增加具有特征數量的神經元數量,但將訓練時期的數量從 500 增加到 1000。 這可以通過更改實驗函數中的行來實現: ```py lstm_model = fit_lstm(train_scaled, 1, 500, features, features) ``` 至 ```py lstm_model = fit_lstm(train_scaled, 1, 1000, features, features) ``` 此外,我們可以通過在文件名中添加“ _1000_ ”后綴來保持寫入文件的結果與上一次實驗的結果分開,例如,更改: ```py results.to_csv('experiment_features_1_neurons.csv', index=False) ``` 至 ```py results.to_csv('experiment_features_1_neurons1000.csv', index=False) ``` 用這些變化重復相同的 5 個實驗。 運行這些實驗后,您應該有 5 個結果文件。 * _experiment_features_1_neurons1000.csv_ * _experiment_features_2_neurons1000.csv_ * _experiment_features_3_neurons1000.csv_ * _experiment_features_4_neurons1000.csv_ * _experiment_features_5_neurons1000.csv_ 與前一個實驗一樣,我們可以加載結果,計算描述性統計數據,并創建一個盒子和須狀圖。完整的代碼清單如下。 ```py from pandas import DataFrame from pandas import read_csv from matplotlib import pyplot # load results into a dataframe filenames = ['experiment_features_1_neurons1000.csv', 'experiment_features_2_neurons1000.csv', 'experiment_features_3_neurons1000.csv','experiment_features_4_neurons1000.csv','experiment_features_5_neurons1000.csv'] results = DataFrame() for name in filenames: results[name[11:-16]] = read_csv(name, header=0) # describe all results print(results.describe()) # box and whisker plot results.boxplot() pyplot.show() ``` 運行代碼首先打印 5 個實驗中的每一個的描述性統計數據。 結果與前一個實驗的故事非常相似,訓練時期數量減少了一半。平均而言,具有 1 個輸入特征和 1 個神經元的模型優于其他配置。 ```py features_1 features_2 features_3 features_4 features_5 count 10.000000 10.000000 10.000000 10.000000 10.000000 mean 109.262674 158.295172 120.340623 149.741882 201.992209 std 13.850525 32.288109 45.219564 53.121113 82.986691 min 95.927393 111.936394 83.983325 111.017837 78.040385 25% 98.754253 130.875314 95.198556 122.287208 148.840499 50% 103.990988 167.915523 110.256517 129.552084 188.498836 75% 116.055435 180.679252 122.158321 154.283676 234.519359 max 133.270446 204.260072 242.186747 288.907803 335.595974 ``` 還創建了一個盒子和胡須圖來比較分布。在情節中,我們看到了與描述性統計中明確相同的趨勢。 至少在這個問題和選擇的 LSTM 配置中,我們沒有看到增加輸入功能數量的任何明顯好處。 ![Box and Whisker Plot of Test RMSE vs The Number of Neurons and Input Features and 1000 Epochs](https://img.kancloud.cn/3e/ec/3eec1236203db0dcceca9992b6986f5f_640x480.jpg) 測試 RMSE 的盒子和晶須圖與神經元和輸入特征的數量以及 1000 個時期 ## 擴展 本節列出了您可能考慮探索的一些進一步調查的領域。 * **診斷運行圖**。對于給定的實驗,在多次運行的情況下查看訓練和測試 RMSE 的圖可能是有幫助的。這可能有助于梳理過度擬合或過度擬合是否正在發生,反過來又是解決它的方法。 * **增加重復次數**。使用 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>

                              哎呀哎呀视频在线观看