毕业设计做视频网站设计,东明县网站建设,网站建设问卷,福建亨立建设集团有限公司网站单特征#xff1a;数据集中只包含2列#xff0c;时间列价格列#xff0c;仅利用价格来预测价格 
目录 
一、数据集 
二、任务目标 
三、代码实现 
1、从本地路径中读取数据文件 
2、数据归一化 
3、创建配置类#xff0c;将LSTM的各个超参数声明为变量#xff0c;便于后续…单特征数据集中只包含2列时间列价格列仅利用价格来预测价格 
目录 
一、数据集 
二、任务目标 
三、代码实现 
1、从本地路径中读取数据文件 
2、数据归一化 
3、创建配置类将LSTM的各个超参数声明为变量便于后续使用 
4、创建时间序列数据 
5、划分数据集 
6、定义LSTM网络 
1创建顺序模型实例 
2添加LSTM层 
3添加全连接层 
7、编译LSTM模型 
8、训练模型 
9、模型预测 
10、数据反归一化 
11、绘制图像 
12、完整版代码 一、数据集 
自建数据集--【load.xlsx】。包含2列 
date列时间列记录2022年6月2日起始至2023年12月31日为止日度数据price列价格列记录日度数据对应的某品牌衣服的价格浮点数 二、任务目标 
实现基于时间序列的单特征价格预测 
三、代码实现 
1、从本地路径中读取数据文件 
read_excel函数读取Excel文件read_csv用来读取csv文件读取为DataFrame对象index_coldate将date列设置为DataFrame的索引.values属性获取price列的值pandas会将对应数据转换为NumPy数组 
# 字符串前的r表示一个原始字符串raw string
# 文件路径中包含多个反斜杠。如果我们不使用原始字符串即不使用r前缀那么Python会尝试解析\U、\N等作为转义序列这会导致错误
data  pd.read_excel(rE:\load.xlsx, index_coldate)
# print(data)
prices  data[price].values
# print(prices) 
打印data 打印prices 2、数据归一化 
归一化将原始数据的大小转化为[0,1]之间采用最大-最小值归一化 数值过大造成神经网络计算缓慢在多特征任务中存在多个特征属性但神经网络会认为数值越小的影响越小。所以可能关键属性A的值很小不重要属性B的值却很大造成神经网络的混淆scikit-learn的转换器通常期望输入是二维的其中每一行代表一个样本每一列代表一个特征 prices.reshape(-1, 1) 用于确保 prices 是一个二维数组即使它只有一个特征列-1的意思是让 NumPy 自动计算该轴上的元素数量以保持原始数据的元素总数不变fit方法计算了数据中每个特征的最小值和最大值这些值将被用于缩放transform方法使用这些统计信息来实际缩放数据将其转换到 [0, 1] 范围内 
scaler  MinMaxScaler(feature_range(0, 1))
scaled_prices  scaler.fit_transform(prices.reshape(-1, 1)) # 二维数组
# print(scaled_prices) 
打印归一化后的价格数据 3、创建配置类将LSTM的各个超参数声明为变量便于后续使用 
timestep时间步长滑动窗口大小feature_size每个步长对应的特征数量这里只使用1维即每天的价格数据batch_size批次大小即一次性送入多少个数据一时间步长为单位进行训练output_size单输出任务输出层为1预测未来1天的价格hidden_size隐藏层大小即神经元个数num_layers神经网络的层数learning_rate学习率epochs迭代轮数即总共要让神经网络训练多少轮全部数据训练一遍成为一轮best_loss记录损失activation  relu定义激活函数使用relu 
class Config():timestep  7  # 时间步长滑动窗口大小feature_size  1 # 每个步长对应的特征数量这里只使用1维每天的价格数据batch_size  1 # 批次大小output_size  1 # 单输出任务输出层为1预测未来1天的价格hidden_size  128 # 隐藏层大小num_layers  1 # lstm的层数learning_rate  0.0001 # 学习率epochs  500 # 迭代轮数model_name  lstm # 模型名best_loss  0  # 记录损失activation  relu # 定义激活函数
config  Config() 
4、创建时间序列数据 
通过滑动窗口移动获取数据时间步内数据作为特征数据时间步外1个数据作为标签数据通过序列的切片实现特征和标签的划分通过np.array将数据转化为NumPy数组 # 创建时间序列数据
X, y  [], []
for i in range(len(scaled_prices) - config.timestep):# 从当前索引i开始取sequence_length个连续的价格数据点并将其作为特征添加到列表 X 中。X.append(scaled_prices[i: i  config.timestep])# 将紧接着这sequence_length个时间点的下一个价格数据点作为目标添加到列表y中。y.append(scaled_prices[i  config.timestep])
X  np.array(X)
print(X)
y  np.array(y)
print(y) 
打印特征数据  
三维数组X 是由多个二维数组即多个时间步长的数据组成的加之本身是一个列表每次迭代都会从 scaled_prices 中取出一个长度为 config.timestep 的连续子序列并将其添加到 X 列表中由于 scaled_prices 本身是一个二维数组所以每次取出的子序列也是一个二维数组形状大致为 [config.timestep, features]当多个这样的二维数组被添加到 X 列表中时X 就变成了一个列表的列表其中每个内部列表都是一个二维数组它的形状将是 [n_samples - config.timestep, config.timestep, features]这是一个三维数组 打印标签数据 
二维数组y 是由单个数据点即单个时间步长的数据组成的所以它保持为二维数组从 scaled_prices 中取出一个单独的数据点即一个二维数组中的一行并将其添加到 y 列表中y 列表中的每个元素都是一个一维数组或可以看作是一个具有多个特征的向量它的形状将是 [n_samples - config.timestep, features]这仍然是一个二维数组 5、划分数据集 
按照9:1的比例划分训练集和测试集train_test_split是sklearn.model_selection模块中的一个函数用于将数据集随机划分为训练集和测试集shuffleFalse表示在划分数据之前不进行随机打乱意味着数据会按照其原始顺序进行划分因为时间序列数据具有时序性用过去时间数据预测新时间数据要保证时间有序测试数据为时间序列的末尾数据 
X_train, X_test, y_train, y_test  train_test_split(X, y, test_size0.1, shuffleFalse) 
6、定义LSTM网络 
1创建顺序模型实例 
model  Sequential() 
2添加LSTM层 
LSTM这是 Keras 中提供的 LSTM 层的类。通过调用这个类创建一个 LSTM 层activationconfig.activation这设置了 LSTM 层中使用的激活函数unitsconfig.hidden_size这设置了 LSTM 层中的隐藏单元数量input_shape(config.timestep, config.feature_size)这定义了输入数据的形状是一个元组 告诉模型输入数据应该是一个形状为[batch_size, config.timestep, config.feature_size]的三维其中batch_size是批次中样本的数量它在模型训练时会自动确定根据你传递给模型的批次数据大小 
model.add(LSTM(activationconfig.activation, unitsconfig.hidden_size, input_shape(config.timestep, config.feature_size))) LSTM层的输出是一个三维张量其形状通常为(seq_len, batch_size, num_directions * hidden_size) seq_len表示序列长度即时间序列展开的步数batch_size表示数据批次的大小即一次性输入到LSTM层的数据样本数量num_directions * hidden_size表示隐藏层的输出特征维度 对于单向LSTMnum_directions为1对于双向LSTMnum_directions为2。hidden_size则是隐藏层节点数即LSTM单元中隐藏状态的维度含义LSTM层的输出包含了每个时间步的隐藏状态 
3添加全连接层 
Dense是 Keras 中用于创建全连接层的类也就是每个输入节点与输出节点之间都连接有一个权重config.output_size指定了该全连接层的输出单元数量 
model.add(Dense(config.output_size)) 
由于此例中全连接层的大小为1因此LSTM层输出的三维张量在经过全连接层后将被压缩成一个二维张量(batch_size, 1)这样的形状 
7、编译LSTM模型 
model.compile()这个方法是Keras模型的一个函数用于配置模型训练前的参数optimizeradam这里指定了使用Adam优化器来训练模型lossmean_squared_error这里指定了损失函数为均方误差Mean Squared Error, MSE 
model.compile(optimizeradam, lossmean_squared_error) 
8、训练模型 
model.fit()是 Keras 模型的一个函数用于训练模型。它将根据提供的训练数据 X_train 和对应的标签 y_train通过多次迭代epochs来训练模型。xX_train指定了训练数据的输入yy_train指定了训练数据的标签或目标值epochsconfig.epochs指定了训练过程中数据集的完整遍历次数。batch_sizeconfig.batch_size指定了每次更新模型时使用的样本数verbose2控制训练过程中的日志输出。verbose2 表示每个 epoch 输出一行日志显示训练过程中的损失值和评估指标如果在编译时指定了评估指标history 对象是一个记录训练过程中信息的字典包含了训练过程中的损失值和评估指标如果有的话 
history  model.fit(xX_train, yy_train, epochsconfig.epochs, batch_sizeconfig.batch_size, verbose2) 
9、模型预测 
model.predict()是 Keras 模型的一个函数它根据提供的输入数据给出模型对于这些数据的预测结果 
predictions  model.predict(X_test) 
10、数据反归一化 
当模型训练完成后并进行预测时预测出的值会是缩放后的值即按照训练数据缩放的比例为了得到原始的比例或范围需要使用缩放器的 inverse_transform 方法来将这些缩放后的值转换回原始的比例或范围 
y_test_true_unnormalized  scaler.inverse_transform(y_test)
y_test_preds_unnormalized  scaler.inverse_transform(predictions) 
确保模型的预测结果和真实的测试集标签都在同一个比例或范围内从而可以准确地评估模型的性能并以更直观、更易于理解的方式呈现预测结果 
11、绘制图像 
# 设置图形的大小为10x5单位
plt.figure(figsize(10, 5))# 绘制真实的测试集标签使用圆圈o作为标记并命名为True Values 
plt.plot(y_test_true_unnormalized, labelTrue Values, markero)# 绘制模型的预测值使用叉号x作为标记并命名为Predictions 
plt.plot(y_test_preds_unnormalized, labelPredictions, markerx)# 设置图形的标题
plt.title(Comparison of True Values and Predictions)# 设置x轴的标签
plt.xlabel(Time Steps)# 设置y轴的标签
plt.ylabel(Prices)# 显示图例 
plt.legend()# 显示图形
plt.show() 
12、完整版代码 
import pandas as pd
import numpy as np
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from matplotlib import pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropoutclass Config():timestep  7hidden_size  128batch_size  1output_size  1epochs  500feature_size  1activation  relu
config  Config()# dataframe对象
qy_data  pd.read_excel(rE:\load.xlsx, index_coldate)
# print(qy_data)
# numpy数组 一维
prices  qy_data[price].values
# print(prices)scaler  MinMaxScaler()
# 归一化后变成二维数组
scaled_prices  scaler.fit_transform(prices.reshape(-1, 1))
# print(scaled_prices)# Create time series data
X, y  [], []
for i in range(len(scaled_prices) - config.timestep):X.append(scaled_prices[i: i  config.timestep])y.append(scaled_prices[i  config.timestep])
X  np.array(X)
# print(X)
y  np.array(y)
# print(y)# Train-test split
X_train, X_test, y_train, y_test  train_test_split(X, y, test_size0.1, shuffleFalse)# Define the LSTM mode
model  Sequential()
model.add(LSTM(activationconfig.activation, unitsconfig.hidden_size, input_shape(config.timestep, config.feature_size)))
model.add(Dense(config.output_size))# Compile the model
# adam默认学习率是0.01
model.compile(optimizeradam, lossmean_squared_error)model.save(LSTM.h5)# Train the model
history  model.fit(xX_train, yy_train, epochsconfig.epochs, batch_sizeconfig.batch_size, verbose2)# Predictions
predictions  model.predict(X_test)# Inverse transform predictions and true values
y_test_true_unnormalized  scaler.inverse_transform(y_test)
y_test_preds_unnormalized  scaler.inverse_transform(predictions)# Plot true values and predictions
plt.figure(figsize(10, 5))
plt.plot(y_test_true_unnormalized, labelTrue Values, markero)
plt.plot(y_test_preds_unnormalized, labelPredictions, markerx)
plt.title(Comparison of True Values and Predictions)
plt.xlabel(Time Steps)
plt.ylabel(Prices)
plt.legend()
plt.show()