时序数据分类介绍
1 课程概览
本课讲解时序预测任务场景的分类。主要分为四大类:单变量单步、单变量多步、多变量单步、多变量多步。重点讲解单变量单步和单变量多步。
2 核心概念与定义
- 单变量:一列特征。
- 多变量:多列特征。
- 单步:预测未来一个时间步。
- 多步:预测未来多个时间步。
- 时间步:如hour0、hour1等,一天24小时就是24个时间步。
- 滚动预测:时间不断增长,预测值变成新的历史数据。
3 算法与模型详解
3.1 四大分类
| 类型 | 特征数 | 预测步数 | 难度 |
|---|---|---|---|
| 单变量单步 | 1 | 1 | 简单 |
| 单变量多步 | 1 | 多 | 中等 |
| 多变量单步 | 多 | 1 | 中等 |
| 多变量多步 | 多 | 多 | 复杂 |
3.2 单变量单步
定义:根据一个特征的历史数据预测该变量未来一个时间步
特点:
- 一列特征
- 预测一个时间步
- 直接建模预测即可
示例:
- 特征:电力负荷
- 预测:下一个小时的电力负荷
建模:使用XGBoost(极限梯度提升树)
3.3 单变量多步
定义:根据一个特征的历史数据预测该变量未来多个时间步
特点:
- 一列特征
- 预测多个时间步(如未来24小时)
解决方案:建模 + 滚动预测
3.4 滚动预测
滚动预测原理:
- 当前时间3点,预测未来24小时(3点到明天下午3点)
- 时间来到4点,3点的数据变成历史数据
- 从4点开始预测未来24小时(4点到明天下午4点)
- 时间不断增长,预测值变成新的历史数据
类比:手机天气预测
- 显示未来24小时天气
- 时间推移,预测窗口滚动
3.5 时间步说明
时间步:
- hour0:0点(一个时间步)
- hour1:1点(下一个时间步)
- hour2:2点
- ...
- hour23:23点
一天24小时:24个时间步
3.6 实际应用
脚本部署:
- 写脚本定时执行
- 部署到服务器
- 定时预测
类比:员工生日关怀
- 每月10号发送祝福邮件
- 脚本定时执行
- 自动拉取当月过生日的员工
4 代码示例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1. 模拟时序数据
print("=== 1. 模拟时序数据 ===")
np.random.seed(42)
# 生成7天数据
dates = pd.date_range('2024-01-01', periods=7*24, freq='h')
power_load = []
for date in dates:
hour = date.hour
dayofweek = date.dayofweek
# 基础负荷
if 0 <= hour < 6:
base_load = 500
elif 6 <= hour < 9:
base_load = 800
elif 9 <= hour < 17:
base_load = 1000
elif 17 <= hour < 21:
base_load = 1200
else:
base_load = 700
# 周末调整
if dayofweek >= 5:
base_load *= 0.8
load = base_load + np.random.normal(0, 50)
power_load.append(max(100, load))
data = pd.DataFrame({
'time': dates,
'power_load': power_load
})
print(f"数据形状: {data.shape}")
print(data.head())
# 2. 单变量单步预测
print("\n=== 2. 单变量单步预测 ===")
def single_variable_single_step(data, train_size=0.8):
"""单变量单步预测"""
print("\n--- 单变量单步 ---")
# 准备数据
X = data[['power_load']].values[:-1] # 特征(历史)
y = data['power_load'].values[1:] # 标签(未来一步)
# 划分训练测试集
split_idx = int(len(X) * train_size)
X_train, X_test = X[:split_idx], X[split_idx:]
y_train, y_test = y[:split_idx], y[split_idx:]
print(f"训练集: {X_train.shape}")
print(f"测试集: {X_test.shape}")
# 使用线性回归模拟(实际用XGBoost)
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
from sklearn.metrics import mean_absolute_error, mean_squared_error
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"MAE: {mae:.4f}")
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
# 可视化
plt.figure(figsize=(12, 6))
plt.plot(y_test, label='真实值', marker='o')
plt.plot(y_pred, label='预测值', marker='x')
plt.xlabel('时间步')
plt.ylabel('电力负荷')
plt.title('单变量单步预测')
plt.legend()
plt.grid(True)
plt.savefig('single_single_step.png', dpi=100)
return model
model_single = single_variable_single_step(data)
# 3. 单变量多步预测(滚动预测)
print("\n=== 3. 单变量多步预测(滚动预测)===")
def single_variable_multi_step(data, n_steps=24):
"""单变量多步预测(滚动预测)"""
print("\n--- 单变量多步(滚动预测)---")
# 准备数据
X = data[['power_load']].values[:-1]
y = data['power_load'].values[1:]
# 训练模型
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
# 滚动预测
print(f"预测未来{n_steps}个时间步")
# 最后一个已知值
last_value = data['power_load'].values[-1]
predictions = []
current_value = last_value
for step in range(n_steps):
# 预测下一个时间步
next_pred = model.predict([[current_value]])[0]
predictions.append(next_pred)
# 更新当前值(滚动)
current_value = next_pred
print(f" 时间步{step+1}: 预测值={next_pred:.2f}")
# 可视化
plt.figure(figsize=(12, 6))
# 历史数据
history = data['power_load'].values[-48:] # 最后48个点
plt.plot(range(len(history)), history, 'b-', label='历史数据')
# 预测数据
future_x = range(len(history)-1, len(history)-1+n_steps)
plt.plot(future_x, predictions, 'r--', label='预测数据', marker='o')
plt.xlabel('时间步')
plt.ylabel('电力负荷')
plt.title('单变量多步预测(滚动预测)')
plt.legend()
plt.grid(True)
plt.savefig('single_multi_step.png', dpi=100)
return predictions
predictions = single_variable_multi_step(data, n_steps=24)
# 4. 多变量单步预测
print("\n=== 4. 多变量单步预测 ===")
def multi_variable_single_step(data, train_size=0.8):
"""多变量单步预测"""
print("\n--- 多变量单步 ---")
# 提取时间特征
data = data.copy()
data['hour'] = data['time'].dt.hour
data['dayofweek'] = data['time'].dt.dayofweek
data['is_weekend'] = data['dayofweek'].isin([5, 6]).astype(int)
# 准备数据
features = ['power_load', 'hour', 'dayofweek', 'is_weekend']
X = data[features].values[:-1]
y = data['power_load'].values[1:]
# 划分训练测试集
split_idx = int(len(X) * train_size)
X_train, X_test = X[:split_idx], X[split_idx:]
y_train, y_test = y[:split_idx], y[split_idx:]
print(f"特征数: {len(features)}")
print(f"训练集: {X_train.shape}")
print(f"测试集: {X_test.shape}")
# 训练
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_test, y_pred)
print(f"MAE: {mae:.4f}")
return model
model_multi = multi_variable_single_step(data)
# 5. 四大分类对比
print("\n=== 5. 四大分类对比 ===")
def compare_categories():
"""四大分类对比"""
print("""
时序预测四大分类:
1. 单变量单步
- 特征: 1列
- 预测: 1个时间步
- 方法: 直接建模预测
- 难度: 简单
2. 单变量多步
- 特征: 1列
- 预测: 多个时间步
- 方法: 建模 + 滚动预测
- 难度: 中等
3. 多变量单步
- 特征: 多列
- 预测: 1个时间步
- 方法: 直接建模预测
- 难度: 中等
4. 多变量多步
- 特征: 多列
- 预测: 多个时间步
- 方法: 建模 + 滚动预测
- 难度: 复杂
""")
compare_categories()
# 6. 滚动预测演示
print("\n=== 6. 滚动预测演示 ===")
def rolling_prediction_demo(data, n_days=3):
"""滚动预测演示"""
print("\n--- 滚动预测演示 ---")
# 训练模型
X = data[['power_load']].values[:-1]
y = data['power_load'].values[1:]
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
# 模拟滚动预测
print("模拟3天滚动预测:")
current_value = data['power_load'].values[-1]
for day in range(n_days):
print(f"\n第{day+1}天:")
daily_predictions = []
for hour in range(24):
next_pred = model.predict([[current_value]])[0]
daily_predictions.append(next_pred)
current_value = next_pred
print(f" 预测24小时")
print(f" 最高负荷: {max(daily_predictions):.2f}")
print(f" 最低负荷: {min(daily_predictions):.2f}")
print(f" 平均负荷: {np.mean(daily_predictions):.2f}")
rolling_prediction_demo(data, n_days=3)
# 7. 完整流程
def time_series_classification():
"""时序数据分类介绍"""
print("=" * 50)
print("时序数据分类介绍")
print("=" * 50)
print("\n1. 四大分类")
print(" 单变量单步、单变量多步")
print(" 多变量单步、多变量多步")
print("\n2. 单变量单步")
print(" 一列特征,预测一个时间步")
print(" 直接建模预测")
print("\n3. 单变量多步")
print(" 一列特征,预测多个时间步")
print(" 建模 + 滚动预测")
print("\n4. 滚动预测")
print(" 时间不断增长")
print(" 预测值变成新的历史数据")
print("\n5. 建模算法")
print(" XGBoost(极限梯度提升树)")
print("\n" + "=" * 50)
print("分类介绍完成!")
print("=" * 50)
time_series_classification()
输出示例:
=== 1. 模拟时序数据 ===
数据形状: (168, 2)
=== 2. 单变量单步预测 ===
--- 单变量单步 ---
训练集: (134, 1)
测试集: (34, 1)
MAE: 45.6789
MSE: 3456.7890
RMSE: 58.9012
=== 3. 单变量多步预测(滚动预测)===
--- 单变量多步(滚动预测)---
预测未来24个时间步
时间步1: 预测值=678.90
时间步2: 预测值=645.23
...
=== 5. 四大分类对比 ===
时序预测四大分类:
1. 单变量单步
2. 单变量多步
3. 多变量单步
4. 多变量多步
5 重难点与易错提醒
- ❗重点:时序预测分四大类。
- ❗重点:单变量单步直接建模预测。
- ❗重点:单变量多步用滚动预测。
- ❗重点:时间步如hour0、hour1等。
- ⚠️易错:混淆单步和多步。
- ⚠️易错:不理解滚动预测原理。
- 💡深入理解:滚动预测是时间推移,预测值变历史数据。
6 课堂问答精选
Q: 什么是时间步?
A: 时间步是时序数据中的最小时间单位:
- hour0:0点(一个时间步)
- hour1:1点(下一个时间步)
- 一天24小时 = 24个时间步
Q: 什么是滚动预测?
A: 滚动预测原理:
- 当前时间3点,预测未来24小时
- 时间来到4点,3点的数据变成历史数据
- 从4点开始预测未来24小时
- 时间不断增长,预测值变成新的历史数据
7 本课小结
- 四大分类:单变量单步、单变量多步、多变量单步、多变量多步。
- 单变量单步:直接建模预测。
- 单变量多步:建模 + 滚动预测。
- 滚动预测:时间推移,预测值变历史。
- 建模:XGBoost。
8 延伸思考与实践
- 实践:运行四大分类示例。
- 预习:时序预测算法介绍。
- 思考:滚动预测的优缺点是什么?