1. 程式人生 > >Python時間序列LSTM預測系列學習筆記(2)-單變數

Python時間序列LSTM預測系列學習筆記(2)-單變數

本文是對:

https://machinelearningmastery.com/time-series-forecasting-long-short-term-memory-network-python/

https://blog.csdn.net/iyangdi/article/details/77853279

兩篇博文的學習筆記,兩個博主筆風都很浪,有些細節一筆帶過,本人以謙遜的態度進行了學習和整理,筆記內容都在程式碼的註釋中。有不清楚的可以去原博主文中檢視。

資料集下載:https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period

後期我會補上我的github

1、時間序列轉監督學習資料

什麼是監督資料,監督資料就是每次連結串列頭砍掉一個,連結串列尾巴上加一個,就好像監督你的一舉一動,這就是監督資料

# coding=utf-8
from pandas import read_csv
from pandas import datetime
from pandas import DataFrame
from pandas import concat


# load data
def parser(x):
    return datetime.strptime(x, '%Y/%m/%d')


series = read_csv("data_set\shampoo-sales.csv", header=0, parse_dates=[0], index_col=0, squeeze=True,
                  date_parser=parser)

'''                     
將資料轉換成有監督資料  
即包含input output      
訓練的目的就是找到訓練資料input和output的關係                                                                           
此處的input是t時間步的資料,output為t+1時間步的資料                                                                     
具體實現就是將整體的時間資料向後滑動一格,和原始資料拼接,就是有監督的資料                                              
'''


#這個函式說了一大堆,簡單說就是把data陣列重新構造成兩兩一組的二維陣列,每個資料對格式是[0,n],[n,n+1],[n+1,n+2],第一組資料用0補全,即為[0,n],這就是所謂的監督學習資料
def timeseries_to_supervised(data, lag=1):  # lag表示的是當前的值只與歷史lag個時間步長的值有關,也就是用lag個數據預測下一個
    df = DataFrame(data)
    colums = [df.shift(i) for i in range(1, lag + 1)]  # 原始資料時間窗向後移動lag步長
    colums.append(df)  # 拼接資料
    df = concat(colums, axis=1)  # 橫向拼接重塑資料,格式:input putput
    df.fillna(0, inplace=True)  # 由於資料整體向後滑動lag後,前面的lag個數據是Na形式,用0來填充
    return df


X = series.values
supervised = timeseries_to_supervised(X, 1)
print(supervised.head())

 

2、時間序列轉換成穩定資料

什麼是穩定資料,就是化整為零,10001,10002,10003.。。變成1,2,3,這就叫穩定資料,消除了一些不必要的資料影響

# coding=utf-8
from pandas import read_csv
from pandas import datetime
from pandas import Series


# load data
def parser(x):
    return datetime.strptime(x, '%Y/%m/%d')


series = read_csv('data_set/shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True,
                  date_parser=parser)

# 所謂的差分,就是相鄰的兩個數相減,求得兩個數之間的差,,一兩個數之間的差作為一個數組,這樣的陣列體現了相鄰兩個數的變化情況
# 所謂的去趨勢也就是一個說法而已,可以忽略
# 做差分,去趨勢,獲得差分序列
def difference(dataset, interval=1):
    diff = list()
    for i in range(interval, len(dataset)):
        value = dataset[i] - dataset[i - interval]  # 當前時間步t的值減去時間步t-interval的值
        diff.append(value)
    return Series(diff)#Series這個方法是把一個數組建立起一個一一對應的索引,參考:https://blog.csdn.net/brucewong0516/article/details/79196902


# 這就是反過來算一遍,拿治最後一個數減去差分的數,就還原回原來的陣列了,總的來說這個例子沒什麼卵用
# 將預測值進行逆處理,得到真實的銷售預測
def inverse_difference(history, yhat, interval=1):  # 歷史資料,預測資料,差分間隔
    return yhat + history[-interval]


# 資料處理

# 將資料轉換成穩定的
differenced = difference(series, 1)
print(differenced.head())

# 逆處理,從差分逆轉得到真實值
inverted = list()
for i in range(len(differenced)):
    value = inverse_difference(series, differenced[i], len(series) - i)
    inverted.append(value)
inverted = Series(inverted)
print(inverted.head())

 

3、觀測值縮放

所謂觀測縮放就是資料的歸一化,雜七雜八的資料全變成[-1,1]區間的資料就行了,便於資料分析

# coding=utf-8
from pandas import read_csv
from pandas import datetime
from pandas import Series
from sklearn.preprocessing import MinMaxScaler


# load data
def parser(x):
    return datetime.strptime(x, '%Y/%m/%d')


series = read_csv('data_set/shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True,
                  date_parser=parser)
print (series.head())

# 所謂縮放,就是把一組陣列中的數字都變成[-1,1]範圍的數字,取陣列中最大的那個陣列,令其為1,最小的數字,令其為-1,
# 剩下的數字根據比例關係,在[-1,1]中給其找一個對應值
# 縮放
X = series.values
X = X.reshape(len(X), 1)  # MinMaxScaler函式需要矩陣作為輸入,所以reshape資料為矩陣,因為是一維陣列,所以生成的是n行1列的一個矩陣
scaler = MinMaxScaler(feature_range=(-1, 1))  # 定義縮放範圍,-1,1是資料縮放的範圍
scaler = scaler.fit(X)  # 呼叫縮放資料的fun
scalered_X = scaler.transform(X)#轉換成一個[-1,1]區間的矩陣
scalered_series = Series(scalered_X[:, 0])#把矩陣序列化成列表
print (scalered_series.head())

# 逆縮放,反著來一遍,轉換回去
inverted_X = scaler.inverse_transform(scalered_X)#把數值為[-1,1]之間的矩陣轉換成正常資料的矩陣
inverted_series = Series(inverted_X[:, 0])#把矩陣轉換成列表
print (inverted_series.head())

 

本屆基本上就是教你如何對資料進行一些簡單的預處理,用的基本是panda類庫的東西,很簡單,不想手動實現沒關係,看看我新增的註釋就好