突破最强时间序列模型,自回归!!

文摘   2024-10-04 09:26   山西  

哈喽,我是cos大壮!~

今儿和大家聊聊时间序列模型,自回归~

自回归模型通过过去的数据点来预测当前的值,适用于自相关性强的时间序列。它简单有效,能捕捉数据的动态变化趋势。作为基础模型,AR是时间序列分析和预测的重要工具。

自回归这个词听起来复杂,其实它的意思很直白——就是用过去的数据来预测未来的数据。

老规矩如果大家伙觉得近期文章还不错!欢迎大家点个赞、转个发,文末赠送《机器学习学习小册》

文末可取本文PDF版本~

我们可以通过一个简单的例子来解释这个概念~

想象你在记录一天的气温

假设你每天都记录同一个地点的气温,现在你有过去几天的数据。你发现:今天的气温,往往和前几天的气温有关系。如果前几天的气温比较高,那么今天的气温也可能比较高;如果前几天的气温比较低,那么今天的气温也可能比较低。

自回归的做法

自回归模型就是这么工作的。它用之前几天的气温来预测今天的气温。比如,你可以说:“今天的气温 = 昨天的气温 + 前天的气温的一部分 + 大前天的气温的一部分 + 一点点随机波动。”

举个具体的例子:

假设你有这样一组数据:

  • 前天:20°C
  • 昨天:22°C
  • 今天:?

通过一个简单的自回归公式预测:

代入我们已经知道的数据:

这样,我们就用前几天的气温,预测了今天的气温。

有了这个简单的解释之后,咱们好好聊聊自回归的原理和案例。

细节原理

要详细解释自回归(Autoregressive, AR)模型的公式推理,并通过一个完整案例展示其计算过程,我们可以从公式入手,逐步构建模型。我们将通过代码实现并可视化过程,最终生成多个数据分析图形。

自回归(AR)模型公式推导

自回归模型的核心思想是用过去的观测值来预测当前的观测值。其一般形式为:

其中:

  •  是时间  的数据值(例如今天的气温)。
  •  是常数项。
  •  是自回归系数,反映了前  个时间点对当前数据点的影响。
  •  是误差项,表示随机的波动或噪声。
  •  是滞后阶数,表示用前  个数据点来预测当前的数据。

完整案例

我们选择Kaggle上的“全球气温”数据集,并通过该数据集进行AR模型的实现。

具体步骤:

  1. 数据准备:从Kaggle获取全球气温数据集,处理时间序列数据。
  2. 自回归模型实现:手动实现AR模型,不使用任何高级库。
  3. 数据可视化:生成多个图像,帮助理解数据趋势、AR模型拟合情况、残差分析等。
  4. 模型预测:通过训练好的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个数据分析图,以解释不同的数据分析过程。

  1. 原始数据的时间序列图:展示全球气温的趋势。
plt.figure(figsize=(106))
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()


  1. 训练集与测试集的预测结果对比图:说明:比较模型预测值与实际值,查看拟合效果。
plt.figure(figsize=(106))
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=(106))
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()


  1. 残差分析图:通过残差图分析模型误差的分布情况。
residuals = y_test - y_pred_test
plt.figure(figsize=(106))
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()

  1. 自相关函数图(ACF):展示残差的自相关性,检查是否存在未捕捉的模式。
from statsmodels.graphics.tsaplots import plot_acf

plt.figure(figsize=(106))
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=(106))
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=(106))
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=(106))
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=(106))
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=(106))
plot_acf(residuals, lags=30)
plt.title('ACF of Residuals')
plt.grid(True)
plt.show()

以上,我们手动实现了自回归模型,并且通过数据可视化分析了模型的拟合效果和残差的自相关性。

最后

大家有问题可以直接在评论区留言即可~

喜欢本文的朋友可收藏、点赞、转发起来!

需要本文PDF的同学,扫码备注「基础算法」即可~ 
关注本号,带来更多算法干货实例,提升工作学习效率!
最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结
100个超强算法模型,大家如果觉得有用,可以点击查看~

推荐阅读

原创、超强、精华合集
100个超强机器学习算法模型汇总
机器学习全路线
机器学习各个算法的优缺点
7大方面,30个最强数据集
6大部分,20 个机器学习算法全面汇总
铁汁,都到这了,别忘记点赞呀~

深夜努力写Python
Python、机器学习算法
 最新文章