1. 程式人生 > 其它 >如何將時間序列預測轉換為監督學習問題

如何將時間序列預測轉換為監督學習問題

技術標籤:python

時間序列轉化為監督學習

時間序列預測可以被認為是監督學習問題。只需要對資料進行轉換,重新構建時間序列資料,使其轉變為監督學習即可。

1、時間序列與監督學習

時間序列是按時間索引排序的數字序列,可視為有序值的列表或列。比如下面這個例子:

0 1 2 3 4 5 6 7 8 9   #時間序列

監督學習是具有輸入變數(X)和輸出變數(Y)的的問題,並且可以使用演算法來學習x到y的對映函式y = f(x)。演算法的目標是很好地近似真實的對映關係,以便有新的輸入資料 (X) 時,可以預測該資料的輸出變數 (y)。

X 1 2 3 4 5 6 7 8  #監督學習
y 2 3 4 5 6 7 8 9

2、利用Pandas的shift()函式

Pandas中的shift()函式可以有效的將一個時間序列問題轉換為監督學習問題。

我們可以將模擬時間序列資料集定義為 10 個數字序列,在這種情況下,DataFrame 中的單個列如下所示:

from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
print(df)

輸出結果:
``在這裡插入圖片描述
將序列向前移動一個時間步,便可以得到一個監督學習問題。如下所示:

from pandas import
DataFrame df = DataFrame() df['t'] = [x for x in range(10)] df['t-1'] = df['t'].shift(1) print(df)

輸出結果:
在這裡插入圖片描述
我們可以看到第二列可以作為輸入 (X),第一列作為輸出值 (y),即輸入值 0可用於預測輸出值1,輸入1可以預測2,以此類推(由於 NaN 值,必須丟棄第一行。)
當然shift()函式也可以接收負數。

from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
df['t-1'] = df[
't'].shift(-1) print(df)

在這裡插入圖片描述

3、series_to_supervised() 功能

定義一個名為series_to_supervised()的函式,該函式採用單變數或多變數時間序列。這個函式的引數解釋如下:
data: 列表或 2D NumPy 陣列的觀測值序列,也就是需要轉換為監督學習的時間序列資料。必填。
n_in: 作為輸入的滯後觀測值數 (X)。值可能介於 1到len(data)之間。預設值為 1。
n_out: 作為輸出的觀測值數 (y)。值可能介於0到len(data) 之間。預設值為 1。
dropnan: 布林型,是否刪除具有 NaN 值的行,預設值為 True。
函式返回單個值:
return: 轉換後的監督學習資料。
其中data和return很好理解。對於n_in和n_out通俗點說,n_in表示用過去幾個時間步的資料來進行預測,拿最開始的例子,我們對一個簡單的0,1,2,3,4,5,6,7,8,9時間序列,可以用0預測1,這時n_in就是1,也可以用[0,1]來預測2,這時n_in就是2,同理[0,1,2]來預測3,這時n_in就是3。 對於n_out如果用0預測1,那麼n_out就是1,如果用0預測1以及第二步的2,那麼n_out就是2。如果還不明白的話可以看下面的程式碼的執行結果,自行體會。

def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    n_vars = 1 if type(data) is list else data.shape[1]
    df = pd.DataFrame(data)
    cols, names = list(), list()
    # input sequence (t-n, ... t-1)
    for i in range(n_in, 0, -1):
        cols.append(df.shift(i))
        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
    # forecast sequence (t, t+1, ... t+n)
    for i in range(0, n_out):
        cols.append(df.shift(-i))
        if i == 0:
            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
        else:
            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
    # put it all together
    agg = pd.concat(cols, axis=1)
    agg.columns = names
    # drop rows with NaN values
    if dropnan:
        agg.dropna(inplace=True)
    return agg

4、單變數時間序列

呼叫這個函式看看結果

values = [x for x in range(10)]
data = series_to_supervised(values)
print(data)

在這裡插入圖片描述
我們可以看到觀測值名為"var1",輸入觀測值被命名為 var1(t-1), 輸出時間步子名為var1(t)。並且具有 NaN 值的行已從 DataFrame 中自動刪除。我們可以用任意數字長度輸入序列()重複此示例。這可以通過指定輸入序列的長度作為引數來完成;例如:

values = [x for x in range(10)]
data = series_to_supervised(values,3)
print(data)

在這裡插入圖片描述

5、多變數時間序列

當然也可以多變數預測,即多變數時間序列。在多變數時間序列中,我們可能對多種不同的度量值有觀察,並且有興趣預測其中一種或多種。例如在一個PM2.5預測問題中,我們的時間序列不僅包括PM2.5濃度,還包括溫度,風速等時間序列,我們希望通過PM2.5濃度、溫度、風速等的時間序列資料來預測未來一段時間的PM2.5濃度。這就是一個多變數時間序列。

raw = DataFrame()
raw['PM2.5'] = [x for x in range(10)]
raw['TEM'] = [x for x in range(50, 60)]
raw['SO2'] = [x for x in range(60, 70)]
values = raw.values
data = series_to_supervised(values)
print(data)

在這裡插入圖片描述

6、總結

通過本教程可以學到:
如何開發將時間序列資料集轉換為監督學習資料集的函式。
如何轉換機器學習的單變數時間序列資料。
如何轉換機器學習的多變數時間序列資料。
多練習多體會,眼睛會不等於手會。