用Python实现时间序列模型实战——Day 21: 时间序列中的机器学习方法

一、学习内容
1. 基于机器学习的时间序列分析方法

传统的时间序列模型(如 ARIMA、SARIMA、Holt-Winters)通常用于捕捉时间序列中的趋势、季节性和周期性。然而,机器学习模型(如随机森林、支持向量机、神经网络等)近年来逐渐应用于时间序列预测领域,特别是在数据非线性、复杂关系较强的情况下表现优异。

  • 随机森林: 随机森林是一种基于决策树的集成学习方法,它可以通过将时间序列分段成多个特征进行建模,并通过投票或平均的方式得到最终的预测结果。

  • 支持向量机 (SVM): SVM 主要用于分类问题,但也可以用于回归任务(SVR),通过核函数捕捉数据中的非线性关系,适合非线性时间序列建模。

  • 神经网络: 神经网络,特别是长短期记忆网络(LSTM),非常适合处理带有时间依赖性的序列数据,能够捕捉长期的依赖关系。

2. 基于时间序列特征的机器学习模型构建

在时间序列分析中,机器学习方法常通过构建特征(如滞后特征、滚动平均、差分等)来捕捉时间序列中的模式。构建这些特征之后,可以将时间序列问题转化为回归问题,利用机器学习模型进行建模和预测。

二、实战案例

我们将继续使用航空乘客数据集 (Airline Passengers Dataset),该数据集记录了1949年到1960年每月的国际航空乘客人数。

1. 数据预处理
from sklearn.datasets import fetch_california_housing
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.metrics import mean_absolute_error, mean_squared_error
from keras.models import Sequential
from keras.layers import Dense, LSTM
from sklearn.preprocessing import StandardScaler

# 1. 加载加州房价数据集
california_data = fetch_california_housing(as_frame=True)
df = california_data.frame

# 缩减样本数量,避免时间溢出
df = df.head(1000)

# 创建每日时间索引
np.random.seed(42)
dates = pd.date_range(start='2000-01-01', periods=len(df), freq='D')
df['Date'] = dates
df.set_index('Date', inplace=True)

# 使用 'MedHouseVal' 作为目标变量,模拟为时间序列数据
df = df[['MedHouseVal']]

# 绘制时间序列
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['MedHouseVal'], label='Median House Value')
plt.title('California Housing Time Series')
plt.xlabel('Date')
plt.ylabel('Median House Value')
plt.grid(True)
plt.show()

# 生成滞后特征
df['MedHouseVal_lag1'] = df['MedHouseVal'].shift(1)
df['MedHouseVal_lag2'] = df['MedHouseVal'].shift(2)
df = df.dropna()

# 特征与标签
X = df[['MedHouseVal_lag1', 'MedHouseVal_lag2']]
y = df['MedHouseVal']

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

代码解释:

  • 我们加载航空乘客数据集,生成了滞后特征 Passengers_lag1Passengers_lag2,这些滞后值作为特征,用于预测未来的乘客数量。

结果输出:

2. 随机森林模型
# 2. 随机森林模型
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
rf_preds = rf_model.predict(X_test)

# 评估随机森林模型
rf_mae = mean_absolute_error(y_test, rf_preds)
rf_rmse = np.sqrt(mean_squared_error(y_test, rf_preds))
print(f"Random Forest - MAE: {rf_mae}, RMSE: {rf_rmse}")

代码解释:

  • 使用 RandomForestRegressor 构建随机森林模型进行预测。随机森林是一种集成学习方法,能够处理非线性数据并捕捉复杂关系。

结果输出:

Random Forest - MAE: 0.4600290979999999, RMSE: 0.6818681300891571
3. 支持向量机回归 (SVR)
# 3. 支持向量机回归 (SVR)
svr_model = SVR(kernel='rbf', C=100, gamma=0.1)
svr_model.fit(X_train, y_train)
svr_preds = svr_model.predict(X_test)

# 评估 SVM 模型
svr_mae = mean_absolute_error(y_test, svr_preds)
svr_rmse = np.sqrt(mean_squared_error(y_test, svr_preds))
print(f"Support Vector Machine - MAE: {svr_mae}, RMSE: {svr_rmse}")

代码解释:

  • 使用 SVR 构建支持向量回归模型。SVR 使用径向基核函数(RBF)捕捉数据中的非线性关系。

结果输出:

Support Vector Machine - MAE: 0.4503251100990944, RMSE: 0.714578660857706
4. LSTM 模型
# 4. LSTM 模型
# 数据标准化
scaler = StandardScaler()
X_scaled_train = scaler.fit_transform(X_train)
X_scaled_test = scaler.transform(X_test)

# 转换为 3D 输入 [样本, 时间步, 特征]
X_scaled_train = X_scaled_train.reshape((X_scaled_train.shape[0], 1, X_scaled_train.shape[1]))
X_scaled_test = X_scaled_test.reshape((X_scaled_test.shape[0], 1, X_scaled_test.shape[1]))

# 构建 LSTM 模型
lstm_model = Sequential()
lstm_model.add(LSTM(50, activation='relu', input_shape=(1, 2)))
lstm_model.add(Dense(1))
lstm_model.compile(optimizer='adam', loss='mse')

# 训练 LSTM 模型
lstm_model.fit(X_scaled_train, y_train, epochs=50, batch_size=32, verbose=0)

# LSTM 预测
lstm_preds = lstm_model.predict(X_scaled_test)
lstm_preds = lstm_preds.flatten()

代码解释:

  • 使用 LSTM 模型进行建模。我们首先对数据进行了标准化处理,然后将数据转换为 3D 形状以输入 LSTM 网络。LSTM 模型非常适合处理时间序列中的长期依赖关系。
5. 模型评估与比较
# 评估 LSTM 模型
lstm_mae = mean_absolute_error(y_test, lstm_preds)
lstm_rmse = np.sqrt(mean_squared_error(y_test, lstm_preds))
print(f"LSTM - MAE: {lstm_mae}, RMSE: {lstm_rmse}")

代码解释:

  • 使用 MAE 和 RMSE 评估三个模型的预测效果。RMSE 越小,模型的预测精度越高。

结果输出:

7/7 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step
LSTM - MAE: 0.4271997418476105, RMSE: 0.6688279444874563
6. 结果可视化
# 5. 绘制预测结果
plt.figure(figsize=(10, 6))
plt.plot(y_test.index, y_test.values, label='Actual Median House Value')
plt.plot(y_test.index, rf_preds, label='Random Forest Predictions')
plt.plot(y_test.index, svr_preds, label='SVM Predictions')
plt.plot(y_test.index, lstm_preds, label='LSTM Predictions')
plt.title('California Housing Price Forecasting with Machine Learning Models')
plt.xlabel('Date')
plt.ylabel('Median House Value')
plt.legend()
plt.grid(True)
plt.show()

代码解释:

  • 我们将实际的乘客数据与三个模型的预测结果进行对比,展示它们在时间序列预测中的表现。

结果输出:

三、结果分析
1. 随机森林模型
  • 随机森林模型能够较好地拟合数据,但可能在一些复杂的周期性变化中表现略差。
2. 支持向量机回归
  • SVR 模型在捕捉非线性关系上有一定优势,但由于它是基于局部优化的模型,可能在长时间跨度的时间序列中表现不如其他模型。
3. LSTM 模型
  • LSTM 模型非常适合处理时间依赖性较强的数据,它能够捕捉长期依赖关系,因此在这类问题中表现较好。
四、总结

通过本次案例,我们学习了如何使用机器学习模型对时间序列数据进行建模与预测,包括随机森林、支持向量机和 LSTM 模型。通过比较它们与传统时间序列模型的预测效果,可以看出在处理复杂、非线性时间序列数据时,机器学习方法具有较好的表现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值