在Datawhale机器学习夏令营最后一个task中,提及了深度学习的方案解决问题。
该代码使用Keras构建了一个LSTM模型,用于时间序列数据的预测,具体代码及分析如下:
Step1:导入库与加载数据
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, RepeatVector, TimeDistributed
from keras.optimizers import Adam
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
(1)导入numpy、pandas、
keras等库。
(2)读取训练数据和测试数据的 CSV 文件,将它们分别存储在 train
和 test
变量中。
Step2:定义数据预处理函数
# 数据预处理
def preprocess_data(df, look_back=100):
# 将数据按照id进行分组
grouped = df.groupby('id')
datasets = {}
for id, group in grouped:
datasets[id] = group.values
# 准备训练数据集
X, Y = [], []
for id, data in datasets.items():
for i in range(10, 15): # 每个id构建5个序列
a = data[i:(i + look_back), 3]
a = np.append(a, np.array([0]*(100-len(a))))
X.append(a[::-1])
Y.append(data[i-10:i, 3][::-1])
# 准备测试数据集
OOT = []
for id, data in datasets.items():
a = data[:100, 3]
a = np.append(a, np.array([0]*(100-len(a))))
OOT.append(a[::-1])
return np.array(X, dtype=np.float64), np.array(Y, dtype=np.float64), np.array(OOT, dtype=np.float64)
(1)将数据按照 id
列进行分组。
(2)将每个分组的数据保存到 datasets
字典中,键为 id
,值为对应的数据数组。
(3)准备训练数据集 X
和目标值 Y。
(4)对于每个 id
,从第10行到第15行生成5个序列。
(5)取数据的第3列作为特征,并对序列进行反转([::-1]),如果序列长度不足 look_back
,则用0填充。
(6)准备测试数据集 OOT
。
(7)对于每个 id
,取前100行的数据。
(8)将数据序列反转,并用0填充不足部分。
(9)返回预处理后的训练数据 X
,目标值 Y
,以及测试数据 OOT
。
Step3:定义模型用于构建LSTM模型
def build_model(look_back, n_features, n_output):
model = Sequential()
model.add(LSTM(50, input_shape=(look_back, n_features)))
model.add(RepeatVector(n_output))
model.add(LSTM(50, return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer=Adam(0.001))
return model
(1)第一层LSTM有50个单元,输入形状为 (look_back, n_features)
,即 look_back
个时间步,每个时间步有 n_features
个特征。
(2)RepeatVector
将输出重复 n_output
次。
(3)第二层LSTM有50个单元,返回完整序列。
(4)TimeDistributed
包装 Dense
层,将输出转换为一个值。
(5)使用 mean_squared_error
作为损失函数,Adam
作为优化器。
Step4:预处理数据并构建模型
look_back = 100 # 序列长度
n_features = 1 # 假设每个时间点只有一个特征
n_output = 10 # 预测未来10个时间单位的值
# 预处理数据
X, Y, OOT = preprocess_data(train, look_back=look_back)
# 构建模型
model = build_model(look_back, n_features, n_output)
(1)设置序列长度 look_back
、特征数量 n_features
和输出长度 n_output
。
(2)调用数据预处理函数,生成训练集 X
和目标值 Y
,以及测试数据 OOT
。
(3)构建LSTM模型。
Step5:训练模型并进行预测
model.fit(X, Y, epochs=10, batch_size=64, verbose=1)
predicted_values = model.predict(OOT)
(1)使用预处理后的训练数据 X
和 Y
训练模型。训练10个周期,批次大小为64,显示训练过程信息。这里可以通过 keras
的 EarlyStopping控制早停,防止过拟合。
(2)使用训练好的模型对测试数据 OOT
进行预测。生成预测值 predicted_values
。