28 时间序列预测

时间序列预测是机器学习中的一个重要应用领域,尤其是在金融、气象、能源等领域。本文将介绍如何使用Keras框架对时间序列数据进行预测,帮助大家更好地理解时间序列预测的流程与实现方法。

理解时间序列数据

时间序列数据是以时间为索引的一系列数据点,通常用来表示某一现象或事物随时间变化的趋势。在时间序列预测中,我们的目标是根据已知的历史数据来预测未来的值。

典型的时间序列数据可包括股市价格、天气温度等。例如,假设我们有一组股票的日收盘价数据,我们希望根据过去的价格来预测未来几天的价格。

数据准备

在进行时间序列预测之前,我们需要先准备数据。以股票价格为例,我们可以使用 pandas 库读取 CSV 文件中的数据。以下是数据准备的代码示例:

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd

# 读取数据集
data = pd.read_csv('stock_prices.csv')

# 将日期列设置为索引并转换为日期格式
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)

# 选取需要预测的列
prices = data['Close']

数据预处理

在Keras中,处理时间序列数据时通常需要对数据进行规范化、分割为训练集和测试集,并将数据转换为模型可接受的格式。这里我们用 MinMaxScaler 进行规范化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 规范化数据
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_prices = scaler.fit_transform(prices.values.reshape(-1, 1))

# 创建训练集和测试集
train_size = int(len(scaled_prices) * 0.8)
train, test = scaled_prices[0:train_size], scaled_prices[train_size:]

# 创建数据集函数
def create_dataset(data, time_step=1):
X, Y = [], []
for i in range(len(data) - time_step - 1):
X.append(data[i:(i + time_step), 0])
Y.append(data[i + time_step, 0])
return np.array(X), np.array(Y)

# 定义时间步长
time_step = 10
X_train, y_train = create_dataset(train, time_step)
X_test, y_test = create_dataset(test, time_step)

# 将数据形状重塑为 [样本数, 时间步长, 特征数]
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)

构建LSTM模型

Keras框架非常适合实现深度学习模型,特别是对于处理序列数据的 LSTM(长短期记忆)模型。接下来,我们将构建一个LSTM模型,以进行时间序列预测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

# 建立LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(25))
model.add(Dense(1))

# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')

训练模型

模型建立完成后,我们可以开始训练模型。通常情况下,我们会将数据分为训练集和验证集,以便监控过拟合。

1
2
# 训练模型
model.fit(X_train, y_train, batch_size=32, epochs=100, validation_split=0.2)

进行预测

一旦模型训练完成,我们就可以使用 test 数据集进行预测。预测的结果需要进行反规范化,以便与实际值进行比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# 反规范化
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)

# 计算RMSE
import math
from sklearn.metrics import mean_squared_error

train_score = math.sqrt(mean_squared_error(y_train, train_predict[:,0]))
print(f'Train RMSE: {train_score:.2f}')

test_score = math.sqrt(mean_squared_error(y_test, test_predict[:,0]))
print(f'Test RMSE: {test_score:.2f}')

可视化预测结果

最后,我们可以将预测结果进行可视化,使用 matplotlib 库来展示模型的预测效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt

# 可视化
plt.figure(figsize=(12, 6))
plt.plot(prices.index, prices.values, label='真实价格')
# 获取预测索引
train_index = prices.index[:len(train_predict)]
test_index = prices.index[len(train_predict) + (time_step + 1):]

plt.plot(train_index, train_predict, label='训练集预测')
plt.plot(test_index, test_predict, label='测试集预测')
plt.legend()
plt.show()

总结

通过上述案例,我们使用Keras框架成功地实现了时间序列预测。这一过程包括数据准备、模型构建、训练和预测等步骤。LSTM模型有效地捕捉了时间序列数据中的长期依赖关系,实现了对未来值的预测。

在实际项目中,时间序列预测的应用非常广泛,可以根据特定的领域需求调整模型与预处理方法。希望本文能够帮助您更好地理解Keras在时间序列预测中的应用,并激发您在实际项目中的探索与实践。

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论