wordpress 仿站命令網(wǎng)推拉新app推廣接單平臺
- 時間序列在回歸預(yù)測的領(lǐng)域的重要性,不言而喻,在數(shù)學(xué)建模中使用及其頻繁,但是你真的了解ARIMA、AR、MA么?ACF圖你會看么?? 時間序列數(shù)據(jù)如何構(gòu)造???,我打過不少數(shù)學(xué)建模,但是都沒有弄得很清楚;
- 這篇將詳細(xì)講解了基礎(chǔ)模型—AR的原理.
文章目錄
- 1、自回歸(AR)詳解
- 1、簡要說明
- 2、原理講解
- 3、ACF圖
- 2、案例
- 1、數(shù)據(jù)預(yù)處理
- 1、導(dǎo)入庫
- 2、讀取數(shù)據(jù)且預(yù)處理
- 2、實(shí)現(xiàn)自回歸模型
- 3、模型預(yù)測
- 4、數(shù)據(jù)分析和可視化
- 1、原始數(shù)據(jù)時間序列圖
- 2、訓(xùn)練集和測試集的預(yù)測結(jié)構(gòu)對比圖
- 3、殘差分析
- 4、正相關(guān)(ACF)
- 5、結(jié)果分析
1、自回歸(AR)詳解
1、簡要說明
- 什么是自回歸??
自回歸:通過過去的數(shù)據(jù)預(yù)測當(dāng)下的數(shù)據(jù),是一個時間序列的基礎(chǔ)模型,但是很有效,能夠有效的捕捉數(shù)據(jù)隨著時間的變化趨勢。
- 舉例解釋:
在日常生活中,我們知道一般情況下,當(dāng)下的氣溫和前幾天的溫度是有關(guān)系的,比如說這3天很熱,明天大概率也會很熱,自回歸(AR)就是這樣的模型,通過前幾天的氣溫預(yù)測今天的氣溫,如:
- 今天:20度,記為a,前天:18度,記為b,大前天:22度,記為c,需要預(yù)測明天的氣溫
- 明天氣溫 = k1 * a + k2 * b + k3* c + 隨機(jī)誤差, k1 、 k2 、k3 是權(quán)重,這個可以通過計(jì)算得出。
2、原理講解
自回歸公式(很像多元線性回歸):
? y t = c + ? 1 y t ? 1 + ? 2 y t ? 2 + ? + ? p y t ? p + ? t y_t=c+\phi_1y_{t-1}+\phi_2y_{t-2}+\cdots+\phi_py_{t-p}+\epsilon_t yt?=c+?1?yt?1?+?2?yt?2?+?+?p?yt?p?+?t?
- ? p \phi_p ?p?這是自回歸系數(shù),表示當(dāng)下p個時間點(diǎn)的數(shù)據(jù)對要預(yù)測的yt 這個時間點(diǎn)的重要程度;
- c:常數(shù)項(xiàng),就如我們一元回歸方差,
y = ax + b
中的那個b
; - ? t \epsilon_t ?t?:誤差項(xiàng),用來隨機(jī)生成數(shù)據(jù),模擬波動,讓預(yù)測效果更加貼近實(shí)際;
- p:滯后階數(shù),表示用前p個數(shù)來預(yù)測當(dāng)前的數(shù)據(jù)。
通過自回歸公式,我當(dāng)時一眼一看,這不就是多元線性回歸么?實(shí)際也確實(shí)是,只是他添加類誤差項(xiàng)而已,實(shí)際求解的時候,也是通過最小二乘回歸求解系數(shù)的。
下面是一個用自回歸去探究氣溫的一組案例,需要關(guān)注點(diǎn)有兩個如下:
- 怎么構(gòu)造時間數(shù)據(jù)???
- 怎么利用最小二乘回歸去求解系數(shù)???
3、ACF圖
通過查看數(shù)的ACF圖,在不同用領(lǐng)域有不同的用處,如下:
- 白噪聲過程:時間序列是隨機(jī)的,
沒有
可預(yù)測的結(jié)構(gòu),即數(shù)據(jù)之間沒有關(guān)系。 - 模型擬合良好:模型已經(jīng)
很好地捕捉了
數(shù)據(jù)中的所有相關(guān)信息,殘差是隨機(jī)的。 - 數(shù)據(jù)本身沒有自相關(guān)性:數(shù)據(jù)中的每個觀測值都是
獨(dú)立的
,沒有
時間上的依賴關(guān)系。 - 數(shù)據(jù)預(yù)處理的影響:預(yù)處理
有效地去除了
數(shù)據(jù)中的自相關(guān)性
。
2、案例
數(shù)據(jù):該數(shù)據(jù)描述的是這幾百年的地球平均氣溫,下載地址:kaggle;
目的:大陸平均氣溫?cái)?shù)據(jù)的探究,更加理解AR原理以及數(shù)學(xué)公式。
1、數(shù)據(jù)預(yù)處理
1、導(dǎo)入庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
2、讀取數(shù)據(jù)且預(yù)處理
data_df = pd.read_csv('GlobalTemperatures.csv')
data_df
dt | LandAverageTemperature | LandAverageTemperatureUncertainty | LandMaxTemperature | LandMaxTemperatureUncertainty | LandMinTemperature | LandMinTemperatureUncertainty | LandAndOceanAverageTemperature | LandAndOceanAverageTemperatureUncertainty | |
---|---|---|---|---|---|---|---|---|---|
0 | 1750-01-01 | 3.034 | 3.574 | NaN | NaN | NaN | NaN | NaN | NaN |
1 | 1750-02-01 | 3.083 | 3.702 | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 1750-03-01 | 5.626 | 3.076 | NaN | NaN | NaN | NaN | NaN | NaN |
3 | 1750-04-01 | 8.490 | 2.451 | NaN | NaN | NaN | NaN | NaN | NaN |
4 | 1750-05-01 | 11.573 | 2.072 | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
3187 | 2015-08-01 | 14.755 | 0.072 | 20.699 | 0.110 | 9.005 | 0.170 | 17.589 | 0.057 |
3188 | 2015-09-01 | 12.999 | 0.079 | 18.845 | 0.088 | 7.199 | 0.229 | 17.049 | 0.058 |
3189 | 2015-10-01 | 10.801 | 0.102 | 16.450 | 0.059 | 5.232 | 0.115 | 16.290 | 0.062 |
3190 | 2015-11-01 | 7.433 | 0.119 | 12.892 | 0.093 | 2.157 | 0.106 | 15.252 | 0.063 |
3191 | 2015-12-01 | 5.518 | 0.100 | 10.725 | 0.154 | 0.287 | 0.099 | 14.774 | 0.062 |
3192 rows × 9 columns
# 只保留日期和LanAverageTemperatrue
data_df = data_df[['dt', 'LandAverageTemperature']]
# 查看數(shù)據(jù)信息
data_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3192 entries, 0 to 3191
Data columns (total 2 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 dt 3192 non-null object 1 LandAverageTemperature 3180 non-null float64
dtypes: float64(1), object(1)
memory usage: 50.0+ KB
# 缺失值較少,采用前置填充方法
data_df = data_df.fillna(method='ffill')
# 時間轉(zhuǎn)化為datatime格式
data_df['dt'] = pd.to_datetime(data_df['dt'])
# 按照日期排序,確保日期按照順序
data_df = data_df.sort_values(by='dt')
# 設(shè)置日期索引,方便快速查詢
data_df.set_index('dt', inplace=True)# 為了更方便后面展示,這里選取最近1000條數(shù)據(jù),全部展示,后面繪圖,全都堆到一起
data_df = data_df.tail(1000)
2、實(shí)現(xiàn)自回歸模型
# 深刻理解代碼
def create_lagged_features(data, lag):x = []y = []for i in range(lag, len(data)):x.append(data[i - lag : i])y.append(data[i])return np.array(x), np.array(y)
# 使用 5 階(聯(lián)系數(shù)學(xué)公式) 自回歸模型
lag = 5
# 提取特征值,目標(biāo)值(也就是自變量,因變量)
all_temperature_data = data_df['LandAverageTemperature'].values
# 獲取自變量、因變量
X, Y = create_lagged_features(all_temperature_data, lag)
# 分割數(shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
在實(shí)際應(yīng)用中,我們通常會先添加常數(shù)項(xiàng),然后再計(jì)算回歸系數(shù),因?yàn)檫@樣可以保證模型能夠捕捉到數(shù)據(jù)的全局趨勢。
# 使用最小二乘法擬合 自回歸 模型
def fit_regresiion(x_train, y_train):# 添加常數(shù)項(xiàng), b(結(jié)合公式),添加一項(xiàng),為了適應(yīng)維度x_train = np.c_[np.ones(x_train.shape[0]), x_train]# 計(jì)算回歸系數(shù),結(jié)合公式 np.linalg.inv 求逆beta = np.linalg.inv(x_train.T @ x_train) @ x_train.T @ y_trainreturn beta
# 擬合,得到回歸系數(shù)
beta = fit_regresiion(x_train, y_train)
beta
輸出:
array([ 5.07449781, -0.04255702, -0.22825367, -0.2961153 , 0.06135681,0.93721175])
3、模型預(yù)測
def predict_ar_model(x, beta):# 添加常數(shù)項(xiàng)x = np.c_[np.ones(x.shape[0]), x] # 添加常數(shù)項(xiàng)# 預(yù)測y_pred = x @ beta # 自己相乘,結(jié)合公式return y_pred# 測試集、訓(xùn)練集測試
y_pred_train = predict_ar_model(x_train, beta)
y_predict_test = predict_ar_model(x_test, beta)
4、數(shù)據(jù)分析和可視化
1、原始數(shù)據(jù)時間序列圖
plt.figure(figsize=(10, 6))
plt.plot(data_df.index, data_df['LandAverageTemperature'], color='orange', label='Temperature')
plt.title('Global Land Average Temperature Over Time')
plt.xlabel('Year')
plt.ylabel('Temperature')
plt.legend()
plt.grid(True)
plt.show()
?
?
2、訓(xùn)練集和測試集的預(yù)測結(jié)構(gòu)對比圖
plt.figure(figsize=(10, 6))
plt.plot(y_train, label='Actual Train', color='blue')
plt.plot(y_pred_train, label='Predicr Train', color='red', linestyle='dashed')
plt.title('AR Model')
plt.xlabel('Time')
plt.ylabel('Temperature')
plt.grid(True)
plt.show()plt.figure(figsize=(10, 6))
plt.plot(y_test, label='Actual Test', color='blue')
plt.plot(y_predict_test, label='Predicr Test', color='red', linestyle='dashed')
plt.title('AR Model')
plt.xlabel('Time')
plt.ylabel('Temperature')
plt.grid(True)
plt.show()
?
?
3、殘差分析
殘差圖分析誤差
residual = y_test - y_predict_test # 殘差計(jì)算
plt.figure(figsize=(10, 6))
plt.plot(residual, color='green', label='Residual')
plt.title('Residual of AR on Test Data')
plt.xlabel('Time')
plt.ylabel('Residual')
plt.legend()
plt.grid(True)
plt.show()
?
?
4、正相關(guān)(ACF)
檢查殘差的自相關(guān)性,查看是存在未捕捉時間特征
from statsmodels.graphics.tsaplots import plot_acfplt.figure(figsize=(10, 6))
plot_acf(residual, lags=50) # 展示前50個滯后
plt.title('ACF OF RESIDUAL')
plt.grid(True)
plt.show()
<Figure size 1000x600 with 0 Axes>
- 默認(rèn)置信區(qū)間,顯著性水平是5%
- acf圖中,值接近為0,幾乎全在置信區(qū)間內(nèi),說明殘差數(shù)據(jù)之間沒有關(guān)系,殘差是隨機(jī)的,模型有效的捕捉到了時間特征
5、結(jié)果分析
from sklearn.metrics import mean_squared_error, r2_scoremse = mean_squared_error(y_test, y_predict_test)
r2 = r2_score(y_test, y_predict_test)print('mse: ', mse)
print('r2', r2)
mse: 0.19718326089184698
r2 0.9889418324562267
- 綜上說明模型有效挖掘了天氣的規(guī)律