Python時間序列LSTM預測系列學習筆記(2)-單變數
阿新 • • 發佈:2018-11-06
本文是對:
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類庫的東西,很簡單,不想手動實現沒關係,看看我新增的註釋就好