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')
# 数据预处理
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)
# 定义模型
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
# 构建和训练模型
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)
# 训练模型
model.fit(X, Y, epochs=10, batch_size=64, verbose=1)
# 进行预测
predicted_values = model.predict(OOT)
以下是代码的详细解释:
-
导入库:代码开始处导入了所需的库,包括数据处理库NumPy和Pandas,以及用于构建LSTM模型的Keras库。
-
读取数据:使用Pandas的
read_csv
函数读取训练数据集train.csv
和测试数据集test.csv
。 -
定义数据预处理函数:
-
preprocess_data
函数用于准备训练和测试数据。 -
数据按
id
列进行分组。 -
对于每个
id
,提取特定列(索引为3的列)的数据作为时间序列。 -
创建多个序列,每个序列长度为
look_back
,默认为100。 -
序列被反转,并且如果序列长度不足100,则用0填充。
-
训练数据集的标签
Y
是序列的一部分,同样进行反转。 -
测试数据集(OOT,Out-Of-Time)也被反转并用0填充以满足序列长度要求。
-
-
定义模型构建函数:
-
build_model
函数用于构建LSTM模型。 -
模型包括一个LSTM层,用于学习时间序列数据的特征,以及一个重复向量层
RepeatVector
,用于复制上一个LSTM层的输出以供下一个LSTM层使用。 -
再次使用LSTM层和时间分布的密集层来预测序列的下一个值。
-
模型使用均方误差作为损失函数,并使用Adam优化器。
-
-
构建和训练模型:
-
设置序列长度
look_back
、特征数n_features
和输出时间单位数n_output
。 -
调用
preprocess_data
函数预处理训练数据。 -
使用
build_model
函数构建模型。 -
使用模型的
fit
方法训练模型,指定迭代次数(epochs)和批量大小(batch_size)。
-
-
进行预测:
-
使用训练好的模型对测试数据集进行预测。
-
这里需要注意注意自行将预测结果转化为提交格式
-