哈喽,我是cos大壮!~
今儿和大家聊聊时间序列模型,自回归~
自回归模型通过过去的数据点来预测当前的值,适用于自相关性强的时间序列。它简单有效,能捕捉数据的动态变化趋势。作为基础模型,AR是时间序列分析和预测的重要工具。
自回归这个词听起来复杂,其实它的意思很直白——就是用过去的数据来预测未来的数据。
文末可取本文PDF版本~
我们可以通过一个简单的例子来解释这个概念~
想象你在记录一天的气温
假设你每天都记录同一个地点的气温,现在你有过去几天的数据。你发现:今天的气温,往往和前几天的气温有关系。如果前几天的气温比较高,那么今天的气温也可能比较高;如果前几天的气温比较低,那么今天的气温也可能比较低。
自回归的做法
自回归模型就是这么工作的。它用之前几天的气温来预测今天的气温。比如,你可以说:“今天的气温 = 昨天的气温 + 前天的气温的一部分 + 大前天的气温的一部分 + 一点点随机波动。”
举个具体的例子:
假设你有这样一组数据:
前天:20°C 昨天:22°C 今天:?
通过一个简单的自回归公式预测:
代入我们已经知道的数据:
这样,我们就用前几天的气温,预测了今天的气温。
有了这个简单的解释之后,咱们好好聊聊自回归的原理和案例。
细节原理
要详细解释自回归(Autoregressive, AR)模型的公式推理,并通过一个完整案例展示其计算过程,我们可以从公式入手,逐步构建模型。我们将通过代码实现并可视化过程,最终生成多个数据分析图形。
自回归(AR)模型公式推导
自回归模型的核心思想是用过去的观测值来预测当前的观测值。其一般形式为:
其中:
是时间 的数据值(例如今天的气温)。 是常数项。 是自回归系数,反映了前 个时间点对当前数据点的影响。 是误差项,表示随机的波动或噪声。 是滞后阶数,表示用前 个数据点来预测当前的数据。
完整案例
我们选择Kaggle上的“全球气温”数据集,并通过该数据集进行AR模型的实现。
具体步骤:
数据准备:从Kaggle获取全球气温数据集,处理时间序列数据。 自回归模型实现:手动实现AR模型,不使用任何高级库。 数据可视化:生成多个图像,帮助理解数据趋势、AR模型拟合情况、残差分析等。 模型预测:通过训练好的AR模型对未来数据进行预测。
代码实现步骤
1. 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
2. 读取数据并进行预处理
# 读取Kaggle的全球气温数据
df = pd.read_csv('GlobalTemperatures.csv') # 假设你已经下载了数据
# 只保留日期和LandAverageTemperature两列
df = df[['dt', 'LandAverageTemperature']].dropna()
# 将日期列转换为datetime格式
df['dt'] = pd.to_datetime(df['dt'])
# 按照日期排序,确保数据是按时间顺序的
df = df.sort_values(by='dt')
# 设置日期为索引
df.set_index('dt', inplace=True)
# 只保留一定时期内的数据,便于计算(例如,取最近1000条数据)
df = df.tail(1000)
3. 手动实现自回归模型
首先,定义一个简单的函数来生成滞后项。
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阶自回归模型
lag = 5
temperature_data = df['LandAverageTemperature'].values
X, y = create_lagged_features(temperature_data, lag)
# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
接着,我们使用线性回归来手动拟合这些滞后项。
# 使用最小二乘法拟合自回归模型
def fit_ar_model(X_train, y_train):
# 添加常数项
X_train = np.c_[np.ones(X_train.shape[0]), X_train] # 在数据中加一列1用于常数项
# 计算回归系数:公式 β = (X'X)^-1 X'y
beta = np.linalg.inv(X_train.T @ X_train) @ (X_train.T @ y_train)
return beta
# 拟合模型,得到回归系数
beta = fit_ar_model(X_train, y_train)
# 打印回归系数
print("AR模型的系数:", beta)
4. 模型预测
我们使用训练好的模型进行预测:
# 使用拟合好的系数进行预测
def predict_ar_model(X, beta):
# 添加常数项
X = np.c_[np.ones(X.shape[0]), X] # 加入常数项
# 预测
y_pred = X @ beta
return y_pred
# 在测试集上进行预测
y_pred_train = predict_ar_model(X_train, beta)
y_pred_test = predict_ar_model(X_test, beta)
5. 数据分析与可视化
接下来,我们绘制4个数据分析图,以解释不同的数据分析过程。
原始数据的时间序列图:展示全球气温的趋势。
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['LandAverageTemperature'], color='orange', label='Temperature')
plt.title('Global Land Average Temperature Over Time')
plt.xlabel('Year')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()
训练集与测试集的预测结果对比图:说明:比较模型预测值与实际值,查看拟合效果。
plt.figure(figsize=(10, 6))
plt.plot(y_train, label='Actual (Train)', color='blue')
plt.plot(y_pred_train, label='Predicted (Train)', color='red', linestyle='dashed')
plt.title('AR Model Prediction on Training Data')
plt.xlabel('Time Steps')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='Actual (Test)', color='blue')
plt.plot(y_pred_test, label='Predicted (Test)', color='red', linestyle='dashed')
plt.title('AR Model Prediction on Test Data')
plt.xlabel('Time Steps')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()
残差分析图:通过残差图分析模型误差的分布情况。
residuals = y_test - y_pred_test
plt.figure(figsize=(10, 6))
plt.plot(residuals, color='green', label='Residuals')
plt.title('Residuals of AR Model Predictions on Test Data')
plt.xlabel('Time Steps')
plt.ylabel('Residual')
plt.legend()
plt.grid(True)
plt.show()
自相关函数图(ACF):展示残差的自相关性,检查是否存在未捕捉的模式。
from statsmodels.graphics.tsaplots import plot_acf
plt.figure(figsize=(10, 6))
plot_acf(residuals, lags=30)
plt.title('ACF of Residuals')
plt.grid(True)
plt.show()
6. 完整代码
完整的自回归模型实现过程:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from statsmodels.graphics.tsaplots import plot_acf
# 数据读取与预处理
df = pd.read_csv('GlobalTemperatures.csv')
df = df[['dt', 'LandAverageTemperature']].dropna()
df['dt'] = pd.to_datetime(df['dt'])
df = df.sort_values(by='dt')
df.set_index('dt', inplace=True)
df = df.tail(1000)
# 滞后项生成函数
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)
# 自回归模型拟合
def fit_ar_model(X_train, y_train):
X_train = np.c_[np.ones(X_train.shape[0]), X_train]
beta = np.linalg.inv(X_train.T @ X_train) @ (X_train.T @ y_train)
return beta
def predict_ar_model(X, beta):
X = np.c_[np.ones(X.shape[0]), X]
y_pred = X @ beta
return y_pred
# 创建滞后特征与数据分割
lag = 5
temperature_data = df['LandAverageTemperature'].values
X, y = create_lagged_features(temperature_data, lag)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
# 拟合AR模型
beta = fit_ar_model(X_train, y_train)
# 训练集与测试集预测
y_pred_train = predict_ar_model(X_train, beta)
y_pred_test = predict_ar_model(X_test, beta)
# 图1: 原始数据时间序列图
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['LandAverageTemperature'], color='orange', label
='Temperature')
plt.title('Global Land Average Temperature Over Time')
plt.xlabel('Year')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()
# 图2: 训练集预测
plt.figure(figsize=(10, 6))
plt.plot(y_train, label='Actual (Train)', color='blue')
plt.plot(y_pred_train, label='Predicted (Train)', color='red', linestyle='dashed')
plt.title('AR Model Prediction on Training Data')
plt.xlabel('Time Steps')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()
# 图3: 测试集预测
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='Actual (Test)', color='blue')
plt.plot(y_pred_test, label='Predicted (Test)', color='red', linestyle='dashed')
plt.title('AR Model Prediction on Test Data')
plt.xlabel('Time Steps')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()
# 图4: 残差分析
residuals = y_test - y_pred_test
plt.figure(figsize=(10, 6))
plt.plot(residuals, color='green', label='Residuals')
plt.title('Residuals of AR Model Predictions on Test Data')
plt.xlabel('Time Steps')
plt.ylabel('Residual')
plt.legend()
plt.grid(True)
plt.show()
# 图5: 自相关函数
plt.figure(figsize=(10, 6))
plot_acf(residuals, lags=30)
plt.title('ACF of Residuals')
plt.grid(True)
plt.show()
以上,我们手动实现了自回归模型,并且通过数据可视化分析了模型的拟合效果和残差的自相关性。
最后
大家有问题可以直接在评论区留言即可~
喜欢本文的朋友可以收藏、点赞、转发起来!
推荐阅读
原创、超强、精华合集 100个超强机器学习算法模型汇总 机器学习全路线 机器学习各个算法的优缺点 7大方面,30个最强数据集 6大部分,20 个机器学习算法全面汇总 铁汁,都到这了,别忘记点赞呀~