赞
踩
这是一种特殊的循环神经网络,能够学习数据中的长期依赖关系,这是因为模型的循环模块具有相互交互的四个层的组合,它可以记忆不定时间长度的数值,区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。
黄色方框内是四个神经网络层,红色圆圈是逐点算子,橙色圆圈是输入,蓝色圆圈是细胞状态。LSTM具有一个单元状态和三个门,对应选择有选择地学习、取消学习或保留来自每个单元的信息的能力。
LSTM中的单元状态通过只允许一些线性交互来帮助信息流过单元而不被改变。
每个单元都有一个输入、输出和一个遗忘门,可以将信息添加或者删除到单元状态。
遗忘门:使用sigmoid函数决定应该忘记来自先前单元状态的哪些信息。
输入门:分别使用sigmoid和tanh的逐点乘法运算控制信息流到当前单元状态。
输出门:最后,输出门决定哪些信息应该传递到下一个隐藏状态。
要在python中使用lstm模型,需要安装这些库:
pip install tansorflow pandas numpy matplotlib
# pandas用来数据处理
# numpy用来数值计算
# matplotlib.pyplot用于数据可视化
# MinMaxScaler从sklearn.preprocessing用于数据规范化
# Sequential,LSTM,Dense从tensorflow.keras用于构建神经网络
# mean_squared_error从sklearn.metrics用于计算模型误差
注:epoch是指训练周期。
代码如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense from sklearn.metrics import mean_squared_error # 生成示例数据:正弦波 + 随机噪声 np.random.seed(0) timesteps = np.arange(0, 1000, 0.1) data = np.sin(timesteps) + np.random.normal(scale=0.5, size=len(timesteps)) # 数据转换为DataFrame df = pd.DataFrame(data, columns=['value']) values = df['value'].values # 数据规范化 scaler = MinMaxScaler(feature_range=(0, 1)) values_scaled = scaler.fit_transform(values.reshape(-1, 1)) # 分割数据为训练集和测试集 train_size = int(len(values_scaled) * 0.8) test_size = len(values_scaled) - train_size train, test = values_scaled[0:train_size, :], values_scaled[train_size:len(values_scaled), :] # 创建数据集 def create_dataset(dataset, look_back=1): X, Y = [], [] for i in range(len(dataset) - look_back - 1): a = dataset[i:(i + look_back), 0] X.append(a) Y.append(dataset[i + look_back, 0]) return np.array(X), np.array(Y) look_back = 1 X_train, Y_train = create_dataset(train, look_back) X_test, Y_test = create_dataset(test, look_back) # 重塑输入数据为 [样本, 时间步, 特征] X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1])) X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1])) # 创建LSTM模型 model = Sequential() model.add(LSTM(50, input_shape=(1, look_back))) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') # 训练模型 model.fit(X_train, Y_train, epochs=5, batch_size=1, verbose=2) # 进行预测 train_predict = model.predict(X_train) test_predict = model.predict(X_test) # 反转规范化 train_predict = scaler.inverse_transform(train_predict) Y_train = scaler.inverse_transform([Y_train]) test_predict = scaler.inverse_transform(test_predict) Y_test = scaler.inverse_transform([Y_test]) # 计算均方误差 train_score = np.sqrt(mean_squared_error(Y_train[0], train_predict[:,0])) test_score = np.sqrt(mean_squared_error(Y_test[0], test_predict[:,0])) # 可视化 plt.figure(figsize=(12, 6)) plt.plot(scaler.inverse_transform(values_scaled), label='Original Data') plt.plot(np.append(np.zeros(train_size), train_predict[:,0]), linestyle='--', label='Training Predict') plt.plot(np.append(np.zeros(train_size), test_predict[:,0]), linestyle='--', label='Test Predict') plt.legend() plt.show()
运行图如下:
训练损失逐渐降低并趋于稳定,意味着模型正在从训练数据中学习。
在训练集和测试集上的评估速度很快,意味着模型的推断(预测)效率很高。
如果损失在后续的epoch中没有显著下降,可能意味着模型需要更多的epoch来训练。或者可能需要调整模型的结构或超参数(例如增加神经元数量、改变学习率)以进一步提高性能。
训练集和测试集的RMSE非常接近,说明模型在两者上的性能是一致的。
没有出现过拟合/欠拟合的迹象,则说明模型的泛化能力良好。
考虑到数据生成时添加了随机噪声,这个RMSE值表明模型在捕捉数据的基本趋势方面表现的不错,相对较小的RMSE表示预测的准确。
如果要改进LSTM,可以从贝叶斯超参数调优、增加更多训练周期(EPOCH)、尝试不同网络架构,或者在数据预处理时更复杂一些。
事实上,在RMSE上,SARIMA比LSTM更小,但非线性模式/利用长期依赖性的复杂时间序列数据时,LSTM更好。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。