Python Day55
Task:
1.序列预测介绍
a.单步预测
b.多步预测的2种方式
2.序列数据的处理:滑动窗口
3.多输入多输出任务的思路
4.经典机器学习在序列任务上的劣势;以随机森林为例
1. 序列预测介绍
序列预测是时间序列分析中的核心任务,旨在根据已知的过去数据,预测未来的数据点。
a. 单步预测
- 定义:预测序列中下一时刻的值,基于当前位置之前的历史数据。
- 应用:金融市场的股票价格预测下一天的股价。
示例:
# 简单的单步预测示例(未来值预测)
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression# 生成示例数据
np.random.seed(0)
data = np.cumsum(np.random.randn(100)) # 累积和,模拟时间序列
X = data[:-1].reshape(-1, 1)
y = data[1:]# 拟合模型
model = LinearRegression()
model.fit(X, y)# 预测下一步
last_value = data[-1].reshape(1, -1)
predicted_next = model.predict(last_value)
print("下一步预测值:", predicted_next[0])
b. 多步预测的两种方式
1. 逐步预测(Recursive):
- 逐步用模型预测下一时刻,然后将预测值作为未来预测的输入。
- 缺点:误差会累积。
# 递归多步预测示例
n_steps = 5
predictions = []
input_val = data[-1].reshape(1, -1)
for _ in range(n_steps):pred = model.predict(input_val)predictions.append(pred[0])input_val = np.array(pred).reshape(1, -1)
print("多步预测(递归):", predictions)
2. 直接多步预测(Multi-Output):
- 训练模型直接输出多个未来值。
- 适合长预测,但模型复杂。
示例(使用多输出回归):
from sklearn.multioutput import MultiOutputRegressor# 创建多输出目标
n_future = 3
X_multi = []
y_multi = []for i in range(len(data) - n_future):X_multi.append(data[i].reshape(1, -1))y_multi.append(data[i+1:i+1+n_future])
X_multi = np.vstack(X_multi)
y_multi = np.vstack(y_multi)multi_model = MultiOutputRegressor(LinearRegression())
multi_model.fit(X_multi, y_multi)# 预测
future_preds = multi_model.predict(data[-1].reshape(1,-1))
print("直接多步预测:", future_preds)
2. 序列数据的处理:滑动窗口
为了使用机器学习模型处理序列数据,通常需要构建具有固定长度的特征窗口。
示例:
def create_sliding_windows(data, window_size):X, y = [], []for i in range(len(data) - window_size):X.append(data[i:i+window_size])y.append(data[i+window_size])return np.array(X), np.array(y)# 创建窗口
window_size = 5
X, y = create_sliding_windows(data, window_size)
print("特征示例:", X[:2])
print("标签示例:", y[:2])
3. 多输入多输出任务的思路
多输入多输出(Multi-Input Multi-Output, MIMO)任务中,模型同时接受多个不同数据源作为输入,并预测多个目标。
示例场景:
- 输入:多个特征(如历史价格、成交量等)
- 输出:未来几天的价格(多输出)
实现方案:
- 增加多个特征作为输入
- 训练多输出模型,比如多输出回归
示例:
from sklearn.multioutput import MultiOutputRegressor
from sklearn.ensemble import RandomForestRegressor# 假设有两个输入特征(如价格和成交量)
# 生成示例数据
np.random.seed(0)
X1 = np.random.randn(100, 1)
X2 = np.random.randn(100, 1)
X_multi_input = np.hstack([X1, X2])# 目标是未来两个时间点的价格
Y_future = np.hstack([data[1:101].reshape(-1,1), data[2:102].reshape(-1,1)])# 训练多输出回归(随机森林)
model = MultiOutputRegressor(RandomForestRegressor(n_estimators=100))
model.fit(X_multi_input[:-2], Y_future[:-2])# 预测
preds = model.predict(X_multi_input[-1].reshape(1, -1))
print("多输入多输出预测:", preds)
4. 经典机器学习在序列任务上的劣势(以随机森林为例)
劣势总结:
- 无法捕获时间依赖性:传统机器学习模型需要提前构造特征(如滑动窗口),而不能本身理解序列的时间关系。
- 对序列的长程依赖表现较差:模型难以捕获长时间跨度的依赖。
- 缺乏序列的动态建模能力:无法自动学习状态转移规律。
- 特征工程复杂:需手动创造特征,否则模型表现不佳。
示例:随机森林在序列预测中的表现(缺乏时间依赖建模)
from sklearn.ensemble import RandomForestRegressor# 利用滑动窗口生成特征
X, y = create_sliding_windows(data, window_size=5)# 训练模型
rf_model = RandomForestRegressor(n_estimators=100)
rf_model.fit(X, y)# 预测下一步
test_input = data[-5:].reshape(1, -1)
predicted_value = rf_model.predict(test_input)
print("随机森林预测值:", predicted_value[0])
总结:对于序列任务,深度学习模型(如RNN、LSTM)更适合捕获时间信息,而传统机器学习模型(如随机森林)仅作为特征预测,需要精心设计特征,且处理长序列依赖能力有限。