<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 用于時間序列預測的狀態 LSTM 在線學習的不穩定性 > 原文: [https://machinelearningmastery.com/instability-online-learning-stateful-lstm-time-series-forecasting/](https://machinelearningmastery.com/instability-online-learning-stateful-lstm-time-series-forecasting/) 一些神經網絡配置可能導致模型不穩定。 這可能會使用描述性統計信息難以表征和比較同一問題的其他模型配置。 看似不穩定模型的一個很好的例子是使用有狀態長短期記憶(LSTM)模型的在線學習(批量大小為 1)。 在本教程中,您將了解如何使用在線學習標準時間序列預測問題來探索有狀態 LSTM 擬合的結果。 完成本教程后,您將了解: * 如何設計一個強大的測試工具來評估 LSTM 模型的時間序列預測問題。 * 如何分析結果的總體,包括摘要統計,傳播和結果分布。 * 如何分析增加實驗重復次數的影響。 讓我們開始吧。 ![Instability of Online Learning for Stateful LSTM for Time Series Forecasting](https://img.kancloud.cn/89/0e/890ee5ef15f16e6d64b4a0f6759942b8_640x480.jpg) 用于時間序列預測的有狀態 LSTM 在線學習的不穩定性 [Magnus Brath](https://www.flickr.com/photos/magnusbrath/5396568150/) 的照片,保留一些權利。 ## 模型不穩定 當您在同一數據上多次訓練相同的網絡時,您可能會得到截然不同的結果。 這是因為神經網絡是隨機初始化的,并且它們如何適合訓練數據的優化性質可導致網絡內的不同最終權重。在給定相同輸入數據的情況下,這些不同的網絡可以反過來導致變化的預測。 因此,重復在神經網絡上重復任何實驗以找到平均預期表現是很重要的。 有關神經網絡等機器學習算法的隨機性的更多信息,請參閱帖子: * [在機器學習中擁抱隨機性](http://machinelearningmastery.com/randomness-in-machine-learning/) 神經網絡中的批量大小定義了在暴露于訓練數據集的情況下網絡中權重的更新頻率。 批量大小為 1 意味著在每行訓練數據之后更新網絡權重。這稱為在線學習。結果是一個可以快速學習的網絡,但配置可能非常不穩定。 在本教程中,我們將探討用于時間序列預測的有狀態 LSTM 配置的在線學習的不穩定性。 我們將通過查看 LSTM 配置在標準時間序列預測問題上的平均表現來探索這一問題,該問題涉及可變數量的實驗重復。 也就是說,我們將多次在相同數據上重新訓練相同的模型配置,并在保留數據集上查看模型的表現,并查看模型的不穩定性。 ## 教程概述 本教程分為 6 個部分。他們是: 1. 洗發水銷售數據集 2. 實驗測試線束 3. 代碼和收集結果 4. 結果基本情況 5. 重復與測試 RMSE 6. 審查結果 ### 環境 本教程假定您已安裝 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 優化算法和均方誤差損失函數來擬合模型。 ### 實驗運行 每個實驗場景將運行 100 次,并且測試集上的 RMSE 得分將從每次運行結束時記錄。 所有測試 RMSE 分數都寫入文件以供以后分析。 讓我們深入研究實驗。 ## 代碼和收集結果 完整的代碼清單如下。 在現代硬件上運行可能需要幾個小時。 ```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 = 100 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() ``` 運行實驗會在測試數據集中保存擬合模型的 RMSE 分數。 結果保存到文件“ _experiment_stateful.csv_ ”。 下面提供了截斷的結果列表。 自己重新運行實驗可能會給出不同的結果,因為我們沒有為隨機數生成器播種。 ```py ... 116.39769471284067 105.0459745537738 93.57827109861229 128.973001927212 97.02915084460737 198.56877142225886 113.09568645243242 97.84127724751188 124.60413895331735 111.62139008607713 ``` ## 結果基本情況 我們可以從計算 100 個測試 RMSE 分數的整個人口的一些基本統計數據開始。 通常,我們希望機器學習結果具有高斯分布。這允許我們報告模型的平均值和標準偏差,并在對看不見的數據進行預測時指示模型的置信區間。 下面的代碼段會加載結果文件并計算一些描述性統計信息。 ```py from pandas import DataFrame from pandas import read_csv from numpy import mean from numpy import std from matplotlib import pyplot # load results file results = read_csv('experiment_stateful.csv', header=0) # descriptive stats print(results.describe()) # box and whisker plot results.boxplot() pyplot.show() ``` 運行該示例將從結果中打印描述性統計信息。 我們可以看到,平均而言,該配置實現了約 107 個月洗發水銷售的 RMSE,標準偏差約為 17。 我們還可以看到觀察到的最佳測試 RMSE 大約是 90 個銷售,而更差的是不到 200 個,這是相當多的分數。 ```py results count 100.000000 mean 107.051146 std 17.694512 min 90.407323 25% 96.630800 50% 102.603908 75% 111.199574 max 198.568771 ``` 為了更好地了解數據的傳播,還創建了一個盒子和胡須圖。 該圖顯示了中位數(綠線),中間 50%的數據(框)和異常值(點)。我們可以看到數據差異很大,導致 RMSE 評分不佳。 ![Box and Whisker Plot of 100 Test RMSE Scores on the Shampoo Sales Dataset](https://img.kancloud.cn/6c/b6/6cb6568547d3bae03b1abf2b706d909e_640x480.jpg) 在洗發水銷售數據集上的 100 個測試 RMSE 分數的盒子和晶須圖 還創建原始結果值的直方圖。 該圖表示傾斜甚至是指數分布,其質量在 RMSE 為 100 左右,長尾導向 RMSE 為 200。 結果的分布顯然不是高斯分布。這是不幸的,因為平均值和標準偏差不能直接用于估計模型的置信區間(例如 [95%置信度為平均值](https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule)附近標準偏差的 2 倍)。 偏態分布還強調,中位數(第 50 百分位數)將是更好的集中趨勢,而不是使用這些結果的均值。對于異常結果,中位數應該比平均值更穩健。 ![Histogram of Test RMSE Scores on Shampoo Sales Dataset](https://img.kancloud.cn/c8/41/c84157da18125cda1c6b3316a5753cfd_640x480.jpg) 洗發水銷售數據集中測試 RMSE 評分的直方圖 ## 重復與測試 RMSE 我們可以開始研究實驗的摘要統計數據如何隨著重復次數從 1 增加到 100 而改變。 我們可以累積測試 RMSE 分數并計算描述性統計數據。例如,來自一次重復的得分,來自第一次和第二次重復的得分,來自前三次重復的得分,等等至 100 次重復。 我們可以回顧一下中心趨勢如何隨著線圖的重復次數的增加而變化。我們將看看均值和中位數。 一般來說,我們預計隨著實驗重復次數的增加,分布將越來越好地與基礎分布相匹配,包括中心趨勢,如均值。 完整的代碼清單如下。 ```py from pandas import DataFrame from pandas import read_csv from numpy import median from numpy import mean from matplotlib import pyplot import numpy # load results file results = read_csv('experiment_stateful.csv', header=0) values = results.values # collect cumulative stats medians, means = list(), list() for i in range(1,len(values)+1): data = values[0:i, 0] mean_rmse, median_rmse = mean(data), median(data) means.append(mean_rmse) medians.append(median_rmse) print(i, mean_rmse, median_rmse) # line plot of cumulative values line1, = pyplot.plot(medians, label='Median RMSE') line2, = pyplot.plot(means, label='Mean RMSE') pyplot.legend(handles=[line1, line2]) pyplot.show() ``` 隨著重復次數的增加,打印分布的累積大小,平均值和中值。截斷的輸出如下所示。 ```py ... 90 105.759546832 101.477640071 91 105.876449555 102.384620485 92 105.867422653 102.458057114 93 105.735281239 102.384620485 94 105.982491033 102.458057114 95 105.888245347 102.384620485 96 106.853667494 102.458057114 97 106.918018205 102.531493742 98 106.825398399 102.458057114 99 107.004981637 102.531493742 100 107.051145721 102.603907965 ``` 還創建了線圖,顯示隨著重復次數的增加,平均值和中位數如何變化。 結果表明,正如預期的那樣,平均值受異常值結果的影響大于中位數。 我們可以看到中位數在 99-100 附近看起來相當穩定。在情節結束時跳躍到 102,表明在后來的重復中出現了一系列較差的 RMSE 分數。 ![Line Plots of Mean and Median Test RMSE vs Number of Repeats](https://img.kancloud.cn/17/ec/17ece5d61673e7dbc4e23e3521c76d2b_640x480.jpg) 平均值和中值測試 RMSE 與重復次數的線圖 ## 審查結果 我們根據標準時間序列預測問題對有狀態 LSTM 的 100 次重復進行了一些有用的觀察。 特別: * 我們觀察到結果的分布不是高斯分布。它可能是傾斜的高斯分布或具有長尾和異常值的指數分布。 * 我們觀察到結果的分布不隨著重復從 1 增加到 100 而穩定。 觀察結果表明了一些重要的特性: * LSTM 和問題的在線學習的選擇導致相對不穩定的模型。 * 所選擇的重復次數(100)可能不足以表征模型的行為。 這是一個有用的發現,因為從 100 次或更少的實驗重復中對模型做出有力的結論是錯誤的。 在描述您自己的機器學習結果時,這是一個需要考慮的重要注意事項。 這表明該實驗有一些擴展,例如: * 探索重復次數對更穩定模型的影響,例如使用批量或小批量學習的模型。 * 將重復次數增加到數千或更多,以試圖通過在線學習解釋模型的一般不穩定性。 ## 摘要 在本教程中,您了解了如何使用在線學習分析 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>

                              哎呀哎呀视频在线观看