日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

时间序列模型算法 - Prophet,LSTM(二)

發布時間:2024/3/26 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间序列模型算法 - 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 時間序列 - 平穩性檢驗

拿到數據后,第一步就是觀察數據是否具備平穩性,如果不具備就需要對數據做處理例如:

  • 對數變換:變換的序列必須滿足大于0
  • 平滑法
  • 差分
  • 分解
  • 以kaggle數據中 航空乘客數據為例:AirPassengers.csv

    data = pd.read_csv('AirPassengers.csv')

    數據集是這樣的:

    求時間序列數據均值,方差,我們通常可以以年或者月為單位,求連續幾年,或者連續幾月的均值和方差,這里就需要用到一個函數rolling,函數詳細如下

    data.rolling(3).mean()

    首先對時間序列數據按時間順序排序,rolling函數對每個數據,選擇其自身數據加上最近前的二個數據,然后對這三個數據進行運算聚合(mean)(std)。

    import numpy as np import pandas as pd from datetime import datetime import matplotlib.pylab as plt from matplotlib.pylab import rcParamsfrom statsmodels.tsa.stattools import adfuller from statsmodels.tsa.stattools import acf, pacf from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.tsa.arima_model import ARIMA# Display and Plottingimport seaborn as sns %matplotlib inline rcParams['figure.figsize']=10,6def test_stationarity(timeseries):rolmean = timeseries.rolling(12).mean()rolstd = timeseries.rolling(12).std()plt.plot(timeseries, color='blue',label='Original')plt.plot(rolmean, color='red', label='Rolling Mean')plt.plot(rolstd, color='black', label = 'Rolling Std')plt.legend(loc='best')plt.title('Rolling Mean and Standard Deviation')plt.show(block=False)print("Results of dickey fuller test")adft = adfuller(timeseries,autolag='AIC')output = pd.Series(adft[0:4],index=['Test Statistics','p-value','No. of lags used','Number of observations used'])for key,values in adft[4].items():output['critical value (%s)'%key] = valuesprint(output) test_stationarity(data.Passengers)

    從上圖看,黑色色為方差數據,紅色為均值數據,從數據上看,是不具備平穩性,那我們就需要對數據進行差分或者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的優點

  • 準確快速——Prophet準確快速。Facebook上的許多應用程序都使用它來為規劃和目標設定提供可靠的預測。
  • 全自動-Prophet是全自動的。無需人工操作,我們就能對混亂的數據做出合理的預測。
  • 可調預測——Prophet生成可調預測。它包括許多用戶調整預測的可能性。通過添加領域知識,我們可以使用人類可解釋的參數來改進預測
  • 在R或Python中可用-我們可以在R或Python中實現Prophet過程。
  • 能夠很好地處理季節變化——Prophet能夠適應多個時期的季節性。
  • 對異常值的魯棒性——它對異常值具有魯棒性。它通過刪除異常值來處理異常值。
  • 對缺失數據的魯棒性——Prophet對缺失數據具有彈性
  • 3.2 安裝Prophet

    親測有效

    conda install pystan conda install -c conda-forge fbprophet conda install plotly -y

    3.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:預測值的上限
    forecast = my_model.predict(future_dates) forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head()


    繪制的預測結果

    model.plot(forecast, uncertainty=True)


    其中觀測值為黑點,藍線就是預測的值,預測的不確定性區間(藍色陰影區域)。

    為了反映預測值的數據分布趨勢情況,可以使用函數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)


    查看發生轉折點的日期

    model.changepoints

    在一些真實的時間序列數據往往在趨勢中存在一些突變點,這個時候就需要去調整趨勢變化點,相當于正則化處理。

    #調整數據趨勢變化點為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,因此我需要把數據處理成如下的格式:

    def create_dataset(dataset, time_step=1):dataX, dataY = [], []for i in range(len(dataset)-time_step-1):a = dataset[i:(i+time_step), 0] ###i=0, 0,1,2,3dataX.append(a)dataY.append(dataset[i + time_step, 0])return np.array(dataX), np.array(dataY)time_step = 4 X_train, y_train = create_dataset(train_data, time_step) X_test, ytest = create_dataset(test_data, time_step)X_train =X_train.reshape(X_train.shape[0], 4, 1) X_test = X_test.reshape(X_test.shape[0], 4, 1)

    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(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。