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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Python 中基于時間序列數據的基本特征工程 > 原文: [https://machinelearningmastery.com/basic-feature-engineering-time-series-data-python/](https://machinelearningmastery.com/basic-feature-engineering-time-series-data-python/) 在我們開始使用機器學習算法之前,必須將時間序列數據重新構建為監督學習數據集。 時間序列中沒有輸入和輸出功能的概念。相反,我們必須選擇要預測的變量,并使用特征工程來構建將用于對未來時間步驟進行預測的所有輸入。 在本教程中,您將了解如何使用 Python 對時間序列數據執行特征工程,以使用機器學習算法對時間序列問題進行建模。 完成本教程后,您將了解: * 特征工程時間序列數據的基本原理和目標。 * 如何開發基于日期時間的基本輸入功能。 * 如何開發更復雜的滯后和滑動窗口匯總統計功能。 讓我們潛入。 * **2017 年 6 月更新**:修正了擴展窗口代碼示例中的拼寫錯誤。 ![Basic Feature Engineering With Time Series Data in Python](https://img.kancloud.cn/ab/24/ab2419746399d1f4308a6916585141fb_640x427.jpg) 基于 Python 時間序列數據的基本特征工程 [JoséMorcilloValenciano](https://www.flickr.com/photos/jamorcillov/6108532064/) 的照片,保留一些權利。 ## 時間序列的特征工程 必須轉換時間序列數據集以將其建模為監督學習問題。 這看起來像是這樣的: ```py time 1, value 1 time 2, value 2 time 3, value 3 ``` 對于看起來像這樣的東西: ```py input 1, output 1 input 2, output 2 input 3, output 3 ``` 這樣我們就可以訓練有監督的學習算法。 輸入變量在機器學習領域也稱為特征,我們面前的任務是從我們的時間序列數據集創建或發明新的輸入特征。理想情況下,我們只需要最有助于學習方法的輸入特征來模擬我們想要預測的輸入( **X** )和輸出( **y** )之間的關系。 在本教程中,我們將介紹可以從時間序列數據集中創建的三類功能: 1. **日期時間特征**:這些是每個觀察的時間步長本身的組成部分。 2. **滯后特征**:這些是先前時間步長的值。 3. **窗口特征**:這些是先前時間步長的固定窗口上的值的摘要。 在我們深入研究從時間序列數據創建輸入要素的方法之前,讓我們首先回顧一下特征工程的目標。 ## 特征工程的目標 [特征工程](http://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/)的目標是在新輸入特征和監督學習算法建模的輸出特征之間提供強大且理想的簡單關系。 實際上,我們正在移動復雜性。 輸入和輸出數據之間的關系存在復雜性。在時間序列的情況下,沒有輸入和輸出變量的概念;我們也必須發明這些并從頭開始構建有監督的學習問題。 我們可以依靠復雜模型的能力來破譯問題的復雜性。如果我們能夠更好地揭示數據中輸入和輸出之間的內在關系,我們可以使這些模型的工作更容易(甚至使用更簡單的模型)。 困難在于我們不知道我們試圖揭示的輸入和輸出之間潛在的固有功能關系。如果我們知道,我們可能不需要機器學習。 相反,我們唯一的反饋是在監督學習數據集上開發的模型的表現或我們創建的問題的“視圖”。實際上,最好的默認策略是使用所有可用知識從時間序列數據集中創建許多優秀的數據集,并使用模型表現(和其他項目要求)來幫助確定您的問題的優秀特性和良好視圖。 為清楚起見,我們將重點關注示例中的單變量(一個變量)時間序列數據集,但這些方法同樣適用于多變量時間序列問題。接下來,讓我們看一下我們將在本教程中使用的數據集。 ## 最低每日溫度數據集 在這篇文章中,我們將使用最低每日溫度數據集。 該數據集描述了澳大利亞墨爾本 10 年(1981-1990)的最低日常溫度。 單位為攝氏度,有 3,650 個觀測值。數據來源被稱為澳大利亞氣象局。 下面是前 5 行數據的示例,包括標題行。 ```py "Date","Temperature" "1981-01-01",20.7 "1981-01-02",17.9 "1981-01-03",18.8 "1981-01-04",14.6 "1981-01-05",15.8 ``` 下面是從數據市場獲取的整個數據集的圖表。 ![Minimum Daily Temperatures](https://img.kancloud.cn/a2/09/a209bd3b69a5ae4c7c140dd5bb73ac1f_713x375.jpg) 最低每日溫度 數據集顯示趨勢增加,可能還有一些季節性組件。 [在此處下載并了解有關數據集的更多信息](https://datamarket.com/data/set/2324/daily-minimum-temperatures-in-melbourne-australia-1981-1990)。 **注意**:下載的文件包含一些問號(“?”)字符,必須先將其刪除才能使用數據集。在文本編輯器中打開文件并刪除“?”字符。同時刪除文件中的任何頁腳信息。 ## 日期時間功能 讓我們從一些我們可以使用的最簡單的功能開始。 這些是每次觀察日期/時間的特征。事實上,這些可以簡單地開始,并進入相當復雜的領域特定領域。 我們可以開始的兩個特征是每個觀察的整數月和日。我們可以想象,有監督的學習算法可能能夠使用這些輸入來幫助梳理出一年中的時間或季節性類型的季節性信息。 我們提出的監督學習問題是預測月和日的每日最低溫度,如下: ```py Month, Day, Temperature Month, Day, Temperature Month, Day, Temperature ``` 我們可以使用 Pandas 來做到這一點。首先,時間序列作為 Pandas _ 系列 _ 加載。然后,我們為轉換后的數據集創建一個新的 Pandas _DataFrame_ 。 接下來,每次添加一列,其中從系列中的每個觀察的時間戳信息中提取月和日信息。 下面是執行此操作的 Python 代碼。 ```py from pandas import Series from pandas import DataFrame series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) dataframe = DataFrame() dataframe['month'] = [series.index[i].month for i in range(len(series))] dataframe['day'] = [series.index[i].day for i in range(len(series))] dataframe['temperature'] = [series[i] for i in range(len(series))] print(dataframe.head(5)) ``` 運行此示例將打印轉換后的數據集的前 5 行。 ```py month day temperature 0 1 1 20.7 1 1 2 17.9 2 1 3 18.8 3 1 4 14.6 4 1 5 15.8 ``` 僅使用月和日信息來預測溫度并不復雜,并且可能導致模型不佳。然而,這些信息與其他工程特征相結合可能最終會產生更好的模型。 您可以枚舉時間戳的所有屬性,并考慮對您的問題可能有用的內容,例如: * 一天的分鐘數。 * 一天中的一小時。 * 營業時間與否。 * 周末與否。 * 一年中的季節。 * 一年中的業務季度。 * 夏令時與否。 * 公共假期與否。 * 閏年與否。 從這些示例中,您可以看到您不限于原始整數值。您也可以使用二進制標記功能,例如觀察是否在公共假日錄制。 在最低溫度數據集的情況下,季節可能更相關。它正在創建這樣的特定于域的功能,這些功能更有可能為您的模型增加價值。 基于日期時間的功能是一個良好的開端,但在以前的時間步驟中包含值通常更有用。這些被稱為滯后值,我們將在下一節中介紹添加這些功能。 ## 滯后特征 滯后特征是時間序列預測問題轉化為監督學習問題的經典方式。 最簡單的方法是在給定前一時間(t-1)的值的情況下預測下一次(t + 1)的值。具有移位值的監督學習問題如下所示: ```py Value(t-1), Value(t+1) Value(t-1), Value(t+1) Value(t-1), Value(t+1) ``` Pandas 庫提供 [shift()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html),以幫助從時間序列數據集創建這些移位或滯后特征。將數據集移動 1 會創建 t-1 列,為第一行添加 NaN(未知)值。沒有移位的時間序列數據集表示 t + 1。 讓我們以一個例子來具體化。溫度數據集的前 3 個值分別為 20.7,17.9 和 18.8。因此,前 3 個觀測值的移位和未移位溫度列表如下: ```py Shifted, Original NaN, 20.7 20.7, 17.9 17.9, 18.8 ``` 我們可以使用 [concat()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html)沿著列軸(_ 軸= 1_ )將移位列連接到一個新的 DataFrame 中。 綜合這些,下面是為我們的日常溫度數據集創建滯后特征的示例。從加載的序列中提取值,并創建這些值的移位和未移位列表。為清楚起見,每列也在 _DataFrame_ 中命名。 ```py from pandas import Series from pandas import DataFrame from pandas import concat series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) temps = DataFrame(series.values) dataframe = concat([temps.shift(1), temps], axis=1) dataframe.columns = ['t-1', 't+1'] print(dataframe.head(5)) ``` 運行該示例將使用滯后功能打印新數據集的前 5 行。 ```py t-1 t+1 0 NaN 20.7 1 20.7 17.9 2 17.9 18.8 3 18.8 14.6 4 14.6 15.8 ``` 您可以看到我們必須丟棄第一行才能使用數據集來訓練監督學習模型,因為它沒有足夠的數據可供使用。 滯后特征的添加稱為滑動窗口方法,在這種情況下窗口寬度為 1.就好像我們在每個觀察的時間序列中滑動焦點,只關注窗口寬度內的內容。 我們可以擴展窗口寬度并包含更多滯后功能。例如,下面的上述情況被修改為包括最后 3 個觀察值以預測下一個時間步的值。 ```py from pandas import Series from pandas import DataFrame from pandas import concat series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) temps = DataFrame(series.values) dataframe = concat([temps.shift(3), temps.shift(2), temps.shift(1), temps], axis=1) dataframe.columns = ['t-3', 't-2', 't-1', 't+1'] print(dataframe.head(5)) ``` 運行此示例將打印新滯后數據集的前 5 行。 ```py t-3 t-2 t-1 t+1 0 NaN NaN NaN 20.7 1 NaN NaN 20.7 17.9 2 NaN 20.7 17.9 18.8 3 20.7 17.9 18.8 14.6 4 17.9 18.8 14.6 15.8 ``` 同樣,您可以看到我們必須丟棄沒有足夠數據來訓練監督模型的前幾行。 滑動窗口方法的一個難點是為您的問題制作窗口的大小。 也許一個好的起點是執行靈敏度分析并嘗試一組不同的窗口寬度,從而創建一組不同的數據集“視圖”,并查看哪些結果表現更好的模型。會有一個收益遞減點。 另外,為什么要停止使用線性窗口?也許您需要上周,上個月和去年的滯后值。同樣,這歸結于特定領域。 在溫度數據集的情況下,來自前一年或前幾年的同一天的滯后值可能是有用的。 我們可以使用窗口做更多事情,而不是包含原始值。在下一節中,我們將介紹包含在窗口中匯總統計信息的功能。 ## 滾動窗口統計 添加原始滯后值之外的步驟是添加前一時間步的值的摘要。 我們可以計算滑動窗口中值的匯總統計數據,并將這些統計數據包含在數據集中。也許最有用的是前幾個值的平均值,也稱為滾動均值。 例如,我們可以計算前兩個值的平均值,并使用它來預測下一個值。對于溫度數據,我們必須等待 3 個時間步,然后才能使用 2 個值來取平均值,然后才能使用該值來預測第 3 個值。 例如: ```py mean(t-2, t-1), t+1 mean(20.7, 17.9), 18.8 19.3, 18.8 ``` Pandas 提供了 [rolling()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html),它在每個時間步都創建了一個帶有值窗口的新數據結構。然后,我們可以在為每個時間步驟收集的值窗口上執行統計函數,例如計算平均值。 首先,必須改變系列。然后可以創建滾動數據集,并在每個窗口上計算兩個值的平均值。 以下是前三個滾動窗口中的值: ```py #, Window Values 1, NaN 2, NaN, 20.7 3, 20.7, 17.9 ``` 這表明我們在第 3 行之前不會有可用的數據。 最后,與上一節一樣,我們可以使用 _concat()_ 函數構建一個只包含新列的新數據集。 下面的示例演示了如何使用窗口大小為 2 的 Pandas 執行此操作。 ```py from pandas import Series from pandas import DataFrame from pandas import concat series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) temps = DataFrame(series.values) shifted = temps.shift(1) window = shifted.rolling(window=2) means = window.mean() dataframe = concat([means, temps], axis=1) dataframe.columns = ['mean(t-2,t-1)', 't+1'] print(dataframe.head(5)) ``` 運行該示例將打印新數據集的前 5 行。我們可以看到前兩行沒用。 * 第一個 NaN 是由系列的轉變創造的。 * 第二個因為 NaN 不能用于計算平均值。 * 最后,第三行顯示了用于預測 18.8 系列中第 3 個值的 19.30(平均值 20.7 和 17.9)的預期值。 ```py mean(t-2,t-1) t+1 0 NaN 20.7 1 NaN 17.9 2 19.30 18.8 3 18.35 14.6 4 16.70 15.8 ``` 我們可以計算更多的統計數據,甚至可以用不同的數學方法計算“窗口”的定義。 下面是另一個示例,顯示窗口寬度為 3,數據集包含更多摘要統計信息,特別是窗口中的最小值,平均值和最大值。 您可以在代碼中看到我們明確指定滑動窗口寬度作為命名變量。這使我們可以在計算系列的正確位移和指定 _rolling()_ 函數的窗口寬度時使用它。 在這種情況下,窗口寬度為 3 表示我們必須將系列向前移動 2 個時間步長。這使得前兩行為 NaN。接下來,我們需要計算每個窗口有 3 個值的窗口統計信息。在我們甚至從窗口中的系列中獲得足夠的數據以開始計算統計數據之前,它需要 3 行。前 5 個窗口中的值如下: ```py #, Window Values 1, NaN 2, NaN, NaN 3, NaN, NaN, 20.7 4, NaN, 20.7, 17.9 5, 20.7, 17.9, 18.8 ``` 這表明我們不會期望至少在第 5 行(數組索引 4)之前可用的數據 ```py from pandas import Series from pandas import DataFrame from pandas import concat series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) temps = DataFrame(series.values) width = 3 shifted = temps.shift(width - 1) window = shifted.rolling(window=width) dataframe = concat([window.min(), window.mean(), window.max(), temps], axis=1) dataframe.columns = ['min', 'mean', 'max', 't+1'] print(dataframe.head(5)) ``` 運行代碼將打印新數據集的前 5 行。 我們可以檢查第 5 行(數組索引 4)上值的正確性。我們可以看到確實 17.9 是最小值,20.7 是[20.7,17.9,18.8]窗口中值的最大值。 ```py min mean max t+1 0 NaN NaN NaN 20.7 1 NaN NaN NaN 17.9 2 NaN NaN NaN 18.8 3 NaN NaN NaN 14.6 4 17.9 19.133333 20.7 15.8 ``` ## 擴展窗口統計 另一種可能有用的窗口包括該系列中的所有先前數據。 這稱為擴展窗口,可以幫助跟蹤可觀察數據的范圍。與 _DataFrame_ 上的 _rolling()_ 函數一樣,Pandas 提供 [expand()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.expanding.html),它收集每個時間步的所有先前值的集合。 可以匯總這些先前數字列表并將其作為新功能包括在內。例如,下面是系列前 5 個步驟的展開窗口中的數字列表: ```py #, Window Values 1, 20.7 2, 20.7, 17.9, 3, 20.7, 17.9, 18.8 4, 20.7, 17.9, 18.8, 14.6 5, 20.7, 17.9, 18.8, 14.6, 15.8 ``` 同樣,您可以看到我們必須轉換系列一次性步驟,以確保我們希望預測的輸出值從這些窗口值中排除。因此輸入窗口如下所示: ```py #, Window Values 1, NaN 2, NaN, 20.7 3, NaN, 20.7, 17.9, 4, NaN, 20.7, 17.9, 18.8 5, NaN, 20.7, 17.9, 18.8, 14.6 ``` 值得慶幸的是,統計計算不包括擴展窗口中的 NaN 值,這意味著不需要進一步修改。 下面是計算每日溫度數據集上展開窗口的最小值,平均值和最大值的示例。 ```py # create expanding window features from pandas import Series from pandas import DataFrame from pandas import concat series = Series.from_csv('daily-minimum-temperatures.csv', header=0) temps = DataFrame(series.values) window = temps.expanding() dataframe = concat([window.min(), window.mean(), window.max(), temps.shift(-1)], axis=1) dataframe.columns = ['min', 'mean', 'max', 't+1'] print(dataframe.head(5)) ``` 運行該示例將打印數據集的前 5 行。 檢查擴展的最小值,平均值和最大值的點顯示具有預期效果的示例。 ```py min mean max t+1 0 20.7 20.700000 20.7 17.9 1 17.9 19.300000 20.7 18.8 2 17.9 19.133333 20.7 14.6 3 14.6 18.000000 20.7 15.8 4 14.6 17.560000 20.7 15.8 ``` ## 摘要 在本教程中,您了解了如何使用特征工程將時間序列數據集轉換為用于機器學習的監督學習數據集。 具體來說,你學到了: * 特征工程時間序列數據的重要性和目標。 * 如何開發基于日期時間和滯后的功能。 * 如何開發滑動和展開窗口摘要統計功能。 **你知道時間序列的更多特征工程方法嗎?** 請在下面的評論中告訴我。 **你有什么問題嗎?** 在下面的評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看