<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 如何利用 Python 處理序列預測問題中的缺失時間步長 > 原文: [https://machinelearningmastery.com/handle-missing-timesteps-sequence-prediction-problems-python/](https://machinelearningmastery.com/handle-missing-timesteps-sequence-prediction-problems-python/) 通常缺少來自序列數據的觀察結果。 數據可能已損壞或不可用,但根據定義,您的數據也可能具有可變長度序列。具有較少時間步長的那些序列可被認為具有缺失值。 在本教程中,您將了解如何使用 Keras 深度學習庫處理 Python 中序列預測問題缺失值的數據。 完成本教程后,您將了解: * 如何刪除包含缺少時間步長的行。 * 如何標記丟失的時間步驟并強制網絡了解其含義。 * 如何屏蔽缺失的時間步長并將其從模型中的計算中排除。 讓我們開始吧。 ![A Gentle Introduction to Linear Algebra](https://img.kancloud.cn/54/67/5467d139976e8d9b25518300ea3cd915_640x427.jpg) 線性代數的溫和介紹 [Steve Corey](https://www.flickr.com/photos/stevecorey/13939447959/) 的照片,保留一些權利。 ## 概觀 本節分為 3 部分;他們是: 1. 回波序列預測問題 2. 處理缺失的序列數據 3. 學習缺少序列值 ### 環境 本教程假定您已安裝 Python SciPy 環境。您可以在此示例中使用 Python 2 或 3。 本教程假設您使用 TensorFlow(v1.1.0 +)或 Theano(v0.9 +)后端安裝了 Keras(v2.0.4 +)。 本教程還假設您安裝了 scikit-learn,Pandas,NumPy 和 Matplotlib。 如果您在設置 Python 環境時需要幫助,請參閱以下帖子: * [如何使用 Anaconda 設置用于機器學習和深度學習的 Python 環境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## 回波序列預測問題 回聲問題是一個人為的序列預測問題,其目標是在固定的先前時間步長處記住和預測觀察,稱為滯后觀察。 例如,最簡單的情況是預測從前一個時間步的觀察結果,即回顯它。例如: ```py Time 1: Input 45 Time 2: Input 23, Output 45 Time 3: Input 73, Output 23 ... ``` 問題是,我們如何處理時間步 1? 我們可以在 Python 中實現回聲序列預測問題。 這涉及兩個步驟:隨機序列的生成和隨機序列到有監督學習問題的轉換。 ### 生成隨機序列 我們可以使用隨機模塊中的 [random()函數](https://docs.python.org/3/library/random.html)生成 0 到 1 之間的隨機值序列。 我們可以將它放在一個名為 generate_sequence()的函數中,該函數將為所需的時間步長生成一系列隨機浮點值。 此功能如下所列。 ```py # generate a sequence of random values def generate_sequence(n_timesteps): return [random() for _ in range(n_timesteps)] ``` ### 框架作為監督學習 在使用神經網絡時,必須將序列框定為監督學習問題。 這意味著序列需要分為輸入和輸出對。 該問題可以被構造為基于當前和先前時間步的函數進行預測。 或者更正式地說: ```py y(t) = f(X(t), X(t-1)) ``` 其中 y(t)是當前時間步長的期望輸出,f()是我們尋求用神經網絡逼近的函數,X(t)和 X(t-1)是當前和之前的觀測值時間步長。 輸出可以等于先前的觀察值,例如,y(t)= X(t-1),但是它可以很容易地是 y(t)= X(t)。我們針對這個問題進行訓練的模型并不知道真正的表述,必須學習這種關系。 這模擬了真實的序列預測問題,其中我們將模型指定為一組固定的順序時間步長的函數,但我們不知道從過去的觀察到期望的輸出值的實際函數關系。 我們可以將這個回聲問題的框架實現為 python 中的監督學習問題。 [Pandas shift()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html)可用于創建序列的移位版本,可用于表示先前時間步的觀測值。這可以與原始序列連接以提供 X(t-1)和 X(t)輸入值。 ```py df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) ``` 然后我們可以將 Pandas DataFrame 中的值作為輸入序列(X),并使用第一列作為輸出序列(y)。 ```py # specify input and output data X, y = values, values[:, 0] ``` 綜上所述,我們可以定義一個函數,它將時間步數作為參數,并返回名為 generate_data()的序列學習的 X,y 數據。 ```py # generate data for the lstm def generate_data(n_timesteps): # generate sequence sequence = generate_sequence(n_timesteps) sequence = array(sequence) # create lag df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) values = df.values # specify input and output data X, y = values, values[:, 0] return X, y ``` ### 序列問題演示 我們可以將 generate_sequence()和 generate_data()代碼綁定到一個工作示例中。 下面列出了完整的示例。 ```py from random import random from numpy import array from pandas import concat from pandas import DataFrame # generate a sequence of random values def generate_sequence(n_timesteps): return [random() for _ in range(n_timesteps)] # generate data for the lstm def generate_data(n_timesteps): # generate sequence sequence = generate_sequence(n_timesteps) sequence = array(sequence) # create lag df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) values = df.values # specify input and output data X, y = values, values[:, 0] return X, y # generate sequence n_timesteps = 10 X, y = generate_data(n_timesteps) # print sequence for i in range(n_timesteps): print(X[i], '=>', y[i]) ``` 運行此示例會生成一個序列,將其轉換為監督表示,并打印每個 X,Y 對。 ```py [ nan 0.18961404] => nan [ 0.18961404 0.25956078] => 0.189614044109 [ 0.25956078 0.30322084] => 0.259560776929 [ 0.30322084 0.72581287] => 0.303220844801 [ 0.72581287 0.02916655] => 0.725812865047 [ 0.02916655 0.88711086] => 0.0291665472554 [ 0.88711086 0.34267107] => 0.88711086298 [ 0.34267107 0.3844453 ] => 0.342671068373 [ 0.3844453 0.89759621] => 0.384445299683 [ 0.89759621 0.95278264] => 0.897596208691 ``` 我們可以看到第一行有 NaN 值。 這是因為我們沒有事先觀察序列中的第一個值。我們必須用一些東西填補這個空間。 但我們無法使用 NaN 輸入擬合模型。 ## 處理缺失的序列數據 處理缺失的序列數據有兩種主要方法。 它們將刪除缺少數據的行,并使用其他值填充缺少的時間步。 有關處理缺失數據的更常用方法,請參閱帖子: * [如何使用 Python 處理丟失的數據](http://machinelearningmastery.com/handle-missing-data-python/) 處理缺失序列數據的最佳方法取決于您的問題和您選擇的網絡配置。我建議探索每種方法,看看哪種方法效果最好。 ### 刪除缺失的序列數據 在我們回顯前一個時間步驟中的觀察的情況下,第一行數據不包含任何有用的信息。 也就是說,在上面的例子中,給定輸入: ```py [ nan 0.18961404] ``` 和輸出: ```py nan ``` 沒有任何有意義的東西可以學習或預測。 這里最好的情況是刪除這一行。 我們可以通過刪除包含 NaN 值的所有行,在序列的制定過程中將其作為監督學習問題。具體來說,可以在將數據拆分為 X 和 y 分量之前調用 [dropna()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html)。 完整示例如下: ```py from random import random from numpy import array from pandas import concat from pandas import DataFrame # generate a sequence of random values def generate_sequence(n_timesteps): return [random() for _ in range(n_timesteps)] # generate data for the lstm def generate_data(n_timesteps): # generate sequence sequence = generate_sequence(n_timesteps) sequence = array(sequence) # create lag df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) # remove rows with missing values df.dropna(inplace=True) values = df.values # specify input and output data X, y = values, values[:, 0] return X, y # generate sequence n_timesteps = 10 X, y = generate_data(n_timesteps) # print sequence for i in range(len(X)): print(X[i], '=>', y[i]) ``` 運行該示例會導致 9 X,y 對而不是 10 對,并刪除第一行。 ```py [ 0.60619475 0.24408238] => 0.606194746194 [ 0.24408238 0.44873712] => 0.244082383195 [ 0.44873712 0.92939547] => 0.448737123424 [ 0.92939547 0.74481645] => 0.929395472523 [ 0.74481645 0.69891311] => 0.744816453809 [ 0.69891311 0.8420314 ] => 0.69891310578 [ 0.8420314 0.58627624] => 0.842031399202 [ 0.58627624 0.48125348] => 0.586276240292 [ 0.48125348 0.75057094] => 0.481253484036 ``` ### 替換缺失的序列數據 在回聲問題被配置為在當前時間步驟回顯觀察的情況下,第一行將包含有意義的信息。 例如,我們可以將 y 的定義從值[:,0]更改為值[:,1]并重新運行演示以生成此問題的示例,如下所示: ```py [ nan 0.50513289] => 0.505132894821 [ 0.50513289 0.22879667] => 0.228796667421 [ 0.22879667 0.66980995] => 0.669809946421 [ 0.66980995 0.10445146] => 0.104451463568 [ 0.10445146 0.70642423] => 0.70642422679 [ 0.70642423 0.10198636] => 0.101986362328 [ 0.10198636 0.49648033] => 0.496480332278 [ 0.49648033 0.06201137] => 0.0620113728356 [ 0.06201137 0.40653087] => 0.406530870804 [ 0.40653087 0.63299264] => 0.632992635565 ``` 我們可以看到第一行給出了輸入: ```py [ nan 0.50513289] ``` 和輸出: ```py 0.505132894821 ``` 這可以從輸入中學到。 問題是,我們仍然需要處理 NaN 值。 我們可以用輸入中不會自然出現的特定值(例如-1)替換所有 NaN 值,而不是刪除具有 NaN 值的行。為此,我們可以使用 [fillna()Pandas 函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html)。 完整示例如下: ```py from random import random from numpy import array from pandas import concat from pandas import DataFrame # generate a sequence of random values def generate_sequence(n_timesteps): return [random() for _ in range(n_timesteps)] # generate data for the lstm def generate_data(n_timesteps): # generate sequence sequence = generate_sequence(n_timesteps) sequence = array(sequence) # create lag df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) # replace missing values with -1 df.fillna(-1, inplace=True) values = df.values # specify input and output data X, y = values, values[:, 1] return X, y # generate sequence n_timesteps = 10 X, y = generate_data(n_timesteps) # print sequence for i in range(len(X)): print(X[i], '=>', y[i]) ``` 運行該示例,我們可以看到第一行的第一列中的 NaN 值被替換為-1 值。 ```py [-1\. 0.94641256] => 0.946412559807 [ 0.94641256 0.11958645] => 0.119586451733 [ 0.11958645 0.50597771] => 0.505977714614 [ 0.50597771 0.92496641] => 0.924966407025 [ 0.92496641 0.15011979] => 0.150119790096 [ 0.15011979 0.69387197] => 0.693871974256 [ 0.69387197 0.9194518 ] => 0.919451802966 [ 0.9194518 0.78690337] => 0.786903370269 [ 0.78690337 0.17017999] => 0.170179993691 [ 0.17017999 0.82286572] => 0.822865722747 ``` ## 學習缺少序列值 在學習具有標記缺失值的序列預測問題時,有兩個主要選項。 該問題可以按原樣建模,我們可以鼓勵模型了解特定值意味著“缺失”。或者,可以屏蔽特殊缺失值并從預測計算中明確排除。 我們將通過兩個輸入來看看這兩個案例的人為“回應當前觀察”問題。 ### 學習缺失的價值觀 我們可以為預測問題開發 LSTM。 輸入由 2 個時間步長和 1 個特征定義。在第一隱藏層中定義具有 5 個存儲器單元的小 LSTM,并且具有線性激活功能的單個輸出層。 使用均方誤差丟失函數和具有默認配置的高效 ADAM 優化算法,網絡將適合。 ```py # define model model = Sequential() model.add(LSTM(5, input_shape=(2, 1))) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') ``` 為了確保模型學習問題的廣義解,即始終將輸入作為輸出返回(y(t)== X(t)),我們將在每個時期生成一個新的隨機序列。該網絡將適合 500 個時期,并且將在每個序列中的每個樣本之后執行更新(batch_size = 1)。 ```py # fit model for i in range(500): X, y = generate_data(n_timesteps) model.fit(X, y, epochs=1, batch_size=1, verbose=2) ``` 一旦擬合,將生成另一個隨機序列,并將來自模型的預測與預期值進行比較。這將提供模型技能的具體概念。 ```py # evaluate model on new data X, y = generate_data(n_timesteps) yhat = model.predict(X) for i in range(len(X)): print('Expected', y[i,0], 'Predicted', yhat[i,0]) ``` 將所有這些結合在一起,下面提供了完整的代碼清單。 ```py from random import random from numpy import array from pandas import concat from pandas import DataFrame from keras.models import Sequential from keras.layers import LSTM from keras.layers import Dense # generate a sequence of random values def generate_sequence(n_timesteps): return [random() for _ in range(n_timesteps)] # generate data for the lstm def generate_data(n_timesteps): # generate sequence sequence = generate_sequence(n_timesteps) sequence = array(sequence) # create lag df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) # replace missing values with -1 df.fillna(-1, inplace=True) values = df.values # specify input and output data X, y = values, values[:, 1] # reshape X = X.reshape(len(X), 2, 1) y = y.reshape(len(y), 1) return X, y n_timesteps = 10 # define model model = Sequential() model.add(LSTM(5, input_shape=(2, 1))) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') # fit model for i in range(500): X, y = generate_data(n_timesteps) model.fit(X, y, epochs=1, batch_size=1, verbose=2) # evaluate model on new data X, y = generate_data(n_timesteps) yhat = model.predict(X) for i in range(len(X)): print('Expected', y[i,0], 'Predicted', yhat[i,0]) ``` 運行該示例將打印每個時期的損失,并在運行結束時比較一個序列的預期輸出與預測輸出。 回顧最終預測,我們可以看到網絡已經了解了問題并預測了“足夠好”的輸出,即使存在缺失值。 ```py ... Epoch 1/1 0s - loss: 1.5992e-04 Epoch 1/1 0s - loss: 1.3409e-04 Epoch 1/1 0s - loss: 1.1581e-04 Epoch 1/1 0s - loss: 2.6176e-04 Epoch 1/1 0s - loss: 8.8303e-05 Expected 0.390784174343 Predicted 0.394238 Expected 0.688580469278 Predicted 0.690463 Expected 0.347155799665 Predicted 0.329972 Expected 0.345075533266 Predicted 0.333037 Expected 0.456591840482 Predicted 0.450145 Expected 0.842125610156 Predicted 0.839923 Expected 0.354087132135 Predicted 0.342418 Expected 0.601406667694 Predicted 0.60228 Expected 0.368929815424 Predicted 0.351224 Expected 0.716420996314 Predicted 0.719275 ``` 您可以進一步嘗試此示例,并將給定序列的 t-1 觀察值的 50%標記為-1,并查看它如何影響模型的技能隨時間的變化。 ### 掩蓋缺失的價值觀 可以從網絡中的所有計算中屏蔽標記的缺失輸入值。 我們可以通過使用 [Masking 層](https://keras.io/layers/core/#masking)作為網絡的第一層來實現。 定義層時,我們可以指定要屏蔽的輸入中的哪個值。如果時間步長的所有要素都包含蒙版值,則整個時間步長將從計算中排除。 這為完全排除行并強制網絡了解標記缺失值的影響提供了一個中間立場。 由于 Masking 層是網絡中的第一個,因此必須指定輸入的預期形狀,如下所示: ```py model.add(Masking(mask_value=-1, input_shape=(2, 1))) ``` 我們可以將所有這些結合起來并重新運行示例。完整的代碼清單如下。 ```py from random import random from numpy import array from pandas import concat from pandas import DataFrame from keras.models import Sequential from keras.layers import LSTM from keras.layers import Dense from keras.layers import Masking # generate a sequence of random values def generate_sequence(n_timesteps): return [random() for _ in range(n_timesteps)] # generate data for the lstm def generate_data(n_timesteps): # generate sequence sequence = generate_sequence(n_timesteps) sequence = array(sequence) # create lag df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) # replace missing values with -1 df.fillna(-1, inplace=True) values = df.values # specify input and output data X, y = values, values[:, 1] # reshape X = X.reshape(len(X), 2, 1) y = y.reshape(len(y), 1) return X, y n_timesteps = 10 # define model model = Sequential() model.add(Masking(mask_value=-1, input_shape=(2, 1))) model.add(LSTM(5)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') # fit model for i in range(500): X, y = generate_data(n_timesteps) model.fit(X, y, epochs=1, batch_size=1, verbose=2) # evaluate model on new data X, y = generate_data(n_timesteps) yhat = model.predict(X) for i in range(len(X)): print('Expected', y[i,0], 'Predicted', yhat[i,0]) ``` 同樣,每個時期打印損失,并將預測與最終序列的預期值進行比較。 同樣,預測看起來足夠小到幾位小數。 ```py ... Epoch 1/1 0s - loss: 1.0252e-04 Epoch 1/1 0s - loss: 6.5545e-05 Epoch 1/1 0s - loss: 3.0831e-05 Epoch 1/1 0s - loss: 1.8548e-04 Epoch 1/1 0s - loss: 7.4286e-05 Expected 0.550889403319 Predicted 0.538004 Expected 0.24252028132 Predicted 0.243288 Expected 0.718869927574 Predicted 0.724669 Expected 0.355185878917 Predicted 0.347479 Expected 0.240554707978 Predicted 0.242719 Expected 0.769765554707 Predicted 0.776608 Expected 0.660782450416 Predicted 0.656321 Expected 0.692962017672 Predicted 0.694851 Expected 0.0485233839401 Predicted 0.0722362 Expected 0.35192019185 Predicted 0.339201 ``` ### 選擇哪種方法? 這些一次性實驗不足以評估在簡單回波序列預測問題上最有效的方法。 他們提供的模板可以用于您自己的問題。 我鼓勵您探索在序列預測問題中處理缺失值的 3 種不同方法。他們是: * 刪除缺少值的行。 * 標記并學習缺失值。 * 掩蓋和學習沒有遺漏的價值觀。 嘗試針對序列預測問題的每種方法,并對看起來效果最好的方法進行加倍研究。 ## 摘要 如果序列具有可變長度,則通常在序列預測問題中具有缺失值。 在本教程中,您了解了如何使用 Keras 處理 Python 中序列預測問題中的缺失數據。 具體來說,你學到了: * 如何刪除包含缺失值的行。 * 如何標記缺失值并強制模型了解其含義。 * 如何屏蔽缺失值以將其從模型中的計算中排除。 您對處理丟失的序列數據有任何疑問嗎? 在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看