时间序列模型算法 - Prophet,LSTM(二)
時間序列模型 - Prophet
- 1.時間序列簡介
- 1.1 時間序列 - 平穩性檢驗
- 1.1.1 log法
- 1.1.2 差分法
- 1.2 平穩性的單位根檢驗
- 2.ARIMA
- 3.Prophet
- 3.1 Prophet的優點
- 3.2 安裝Prophet
- 3.3 數據處理
- 3.4 預測
- 4.LSTM
- 4.1 數據處理
- 4.2 訓練預測
1.時間序列簡介
在做時間序列時,首先要知道什么樣的數據可以做時間序列。
滿足時間序列的數據:
時間序列具備平穩性條件,數據有規律的,不是隨機性的,這里的規律就可以是數據有明顯季節性,周期性的變化。
平穩性:
平穩性表示的是數據整體的均值和方差不發生“明顯”變化,在這種現象下,平穩性又分強穩定和弱平穩。
強平穩 vs 弱平穩
強平穩:強平穩的分布不隨時間的改變而改變,存在一些白噪聲
弱平穩:期望與相關系數不變,未來時刻的值,就會依賴過去的信息,存在依賴性
那數據長什么樣子:
如下圖所示,做時間序列模型,數據就只有二個特征,一個是時間,一個就是值。
1.1 時間序列 - 平穩性檢驗
拿到數據后,第一步就是觀察數據是否具備平穩性,如果不具備就需要對數據做處理例如:
以kaggle數據中 航空乘客數據為例:AirPassengers.csv
data = pd.read_csv('AirPassengers.csv')數據集是這樣的:
求時間序列數據均值,方差,我們通常可以以年或者月為單位,求連續幾年,或者連續幾月的均值和方差,這里就需要用到一個函數rolling,函數詳細如下
首先對時間序列數據按時間順序排序,rolling函數對每個數據,選擇其自身數據加上最近前的二個數據,然后對這三個數據進行運算聚合(mean)(std)。
從上圖看,黑色色為方差數據,紅色為均值數據,從數據上看,是不具備平穩性,那我們就需要對數據進行差分或者log處理
1.1.1 log法
data_log = np.log(data.Passengers) moving_avg = data_log.rolling(12).mean() std_dev = data_log.rolling(12).std() plt.legend(loc='best') plt.title('Moving Average') plt.plot(data_log, label='Original') plt.plot(std_dev, color ="black", label = "Standard Deviation") plt.plot(moving_avg, color="red", label = "Mean") plt.legend()1.1.2 差分法
前一時刻減后一時刻,一階差分
data_diff=data['#Passengers'].diff(1) moving_avg = data_diff.rolling(12).mean() std_dev = data_diff.rolling(12).std() plt.legend(loc='best') plt.title('Moving Average') plt.plot(data_diff, label='Original') plt.plot(std_dev, color ="black", label = "Standard Deviation") plt.plot(moving_avg, color="red", label = "Mean") plt.legend()1.2 平穩性的單位根檢驗
ADF是一種常用的單位根檢驗方法,他的原假設為序列具有單位根,即非平穩,對于一個平穩的時序數據,就需要在給定的置信水平上顯著,拒絕原假設
觀察數據平穩性就是觀察它的均值和方差 是否發生明顯變化,來判斷是不是平穩的,是不是適合做時間序列。
也可以使用單位根來檢驗是否平穩性,單位根檢驗更準確些,具體如何參考如下博客內容:單位根解釋
2.ARIMA
ARIMA模型
3.Prophet
Prophet是一種基于加法模型的時間序列數據預測程序,其中非線性趨勢與年度、每周和每日的季節性以及假日效應相匹配。它最適用于具有強烈季節性影響的時間序列和幾個季節的歷史數據。Prophet對缺失數據和趨勢變化非常敏感,通常能很好地處理異常值。
Prophet是Facebook核心數據科學團隊發布的開源軟件。可在PyPI上下載
3.1 Prophet的優點
3.2 安裝Prophet
親測有效
conda install pystan conda install -c conda-forge fbprophet conda install plotly -y3.3 數據處理
Prophet還強制要求輸入列必須命名為ds(時間列)和y(度量列),因此,我們必須重命名數據框中的列。
data = data.rename(columns={'Month': 'ds','AirPassengers': 'y'})3.4 預測
接下來,我們來使用Prophet庫預測時間序列數據的未來值
model = Prophet(interval_width=0.95) model.fit(data)我們可以通過make_future_DataFrame函數來修改我們預測的范圍和預測數據幀。
future_dates = model.make_future_dataframe(periods=36, freq='MS') future_dates.head()模型生成了未來36個月的數據幀時間戳
預測future_dates的數據幀,模型Prophet返回一個包含特征列的大型數據框,其中比較重要的就如下特征:
- ds:預測值的日期戳
- yhat:時間序列預測的值
- yhat_lower:預測值的下限(類似于箱型圖的25%)
- yhat_upper:預測值的上限
繪制的預測結果:
其中觀測值為黑點,藍線就是預測的值,預測的不確定性區間(藍色陰影區域)。
為了反映預測值的數據分布趨勢情況,可以使用函數plot_components繪制圖
model.plot_components(forecast)
從上面二個圖可以得到二個特點,也可以作為模型的預測,可解釋:
增加趨勢變化點,趨勢變化點是時間序列在軌跡上發生突變的日期時間點,默認情況下,Prophet會在最初80%的數據集中添加25個趨勢變化點。
from fbprophet.plot import add_changepoints_to_plot fig = model.plot(forecast) a = add_changepoints_to_plot(fig.gca(), model, forecast)
查看發生轉折點的日期
在一些真實的時間序列數據往往在趨勢中存在一些突變點,這個時候就需要去調整趨勢變化點,相當于正則化處理。
#調整數據趨勢變化點為20個,changepoint_Preor_scale增加到0.01,使趨勢更靈活 pro_change= Prophet(n_changepoints=20,yearly_seasonality=True, changepoint_prior_scale=0.001) forecast = pro_change.fit(df).predict(future_dates) fig= pro_change.plot(forecast); a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)4.LSTM
LSTM(Long Short Term Memory Network)長短時記憶網絡,是一種改進之后的循環神經網絡,可以解決 RNN 無法處理長距離的依賴的問題,模型有很多種如下:
我們模型選擇的是“many to one”,通過過去的連續的時間段的乘客值,來預測未來下一點時間點的乘客值。
4.1 數據處理
data.set_index('Month', inplace=True)#標準化 from sklearn.preprocessing import MinMaxScaler scaler=MinMaxScaler(feature_range=(0,1)) data=scaler.fit_transform(data)train = int(len(data)*0.75) test = len(data)-train train_data,test_data=data[0:train,:],data[train:len(data),:1]我們這里選擇連續4個時間點的數據作為訓練集的X,用這個4個時間點的下個時間點的數據作為訓練集的Y,因此我需要把數據處理成如下的格式:
4.2 訓練預測
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import LSTMmodel=Sequential() model.add(LSTM(50,return_sequences=True,input_shape=(4,1))) model.add(LSTM(50)) model.add(Dense(1)) model.compile(loss='mean_squared_error',optimizer='adam') model.fit(X_train,y_train,validation_data=(X_test,ytest),epochs=100,batch_size=1,verbose=1) train_predict=model.predict(X_train) test_predict=model.predict(X_test)轉化數據
train_predict=scaler.inverse_transform(train_predict) test_predict=scaler.inverse_transform(test_predict)評估
math.sqrt(mean_squared_error(ytest,test_predict)) 452.56696011597353總結
以上是生活随笔為你收集整理的时间序列模型算法 - Prophet,LSTM(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果做不到一个好程序员,建议别满嘴跑火车
- 下一篇: activity部署的坑