#https://blog.csdn.net/m0_56540237/article/details/128097957?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167998845416800225537811%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167998845416800225537811&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-128097957-null-null.142^v76^pc_search_v2,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=lstm%E9%A2%84%E6%B5%8B%E6%9C%AA%E6%9D%A5&spm=1018.2226.3001.4187
#使用LSTM实现未来气温的预测
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.layers import Dense, LSTM, Input,Dropout
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras import optimizers
import tensorflow as tf
from keras.models import Sequential
from keras.models import Model
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
import nni
#MSE:均方误差 预测值和真实值之间距离的平方和
#MAE:平均绝对误差 目标值和预测值之差的绝对值之和
params = {
'timesteps': 30,
'batch_size':32,
'Dropout': 0.2,
'learning_rate': 0.001,
}
optimized_params = nni.get_next_parameter()
params.update(optimized_params)
print(params)
#定义一个函数进行数据预处理
def create_dataset(dataset, timesteps): #timesteps:用前n个预测后一个(可以叫timestep),如果timestep过大可能会导致预测结果出现是直线的情况。
"""
根据给定的序列dataset ,生成数据集
数据集分为 输入 和 输出 , 每一个输入的长度为timesteps , 每一个输出的长度为1。
也就是说用timesteps天的数据 ,对应下一天的数据。
若给定序列dataset的长度为d ,将输出长度为(d-timesteps)个输入/输出对
"""
dataX, dataY = [], []
for i in range(len(dataset)-timesteps):
a = dataset[i:(i+timesteps)]
dataX.append(a)
dataY.append(dataset[i+timesteps])
print(np.array(dataX).shape)
print(np.array(dataY).shape)
return np.array(dataX), np.array(dataY)
# 读取数据
df = pd.read_csv('E:/F盘/firedata/四个气象指标/FFDI/1971后FFDI/倒序逐月FFDI/56029.csv')
# 特征工程
params['timesteps']
dataset = np.array(df[['FFDI']]) #np.array:把列表转化为数组
# print(dataset)
# 划分训练集和测试集,85%作为训练集
dataX, dataY = create_dataset(dataset, params['timesteps'])
# print(dataX)
# trainX, trainY = create_dataset(dataset, timesteps)
train_size = int(len(dataX) * 0.85)
train_x, test_x, train_y, test_y = train_test_split(dataX, dataY, test_size=0.15, shuffle=False, random_state=42)
# train_x = dataX[:train_size]
# train_y = dataY[:train_size]
# test_x = dataX[train_size:]
# test_y = dataY[train_size:]
# lstm
# def model1(input_shape):
# inputs = Input(shape=input_shape)
# x = LSTM(64)(inputs)
# x = Dense(100)(x)
# x = Dense(1)(x)
# '''keras.layers.Dense(units,
# activation=None,
# use_bias=True,
# kernel_initializer='glorot_uniform',
# bias_initializer='zeros',
# kernel_regularizer=None,
# bias_regularizer=None,
# activity_regularizer=None,
# kernel_constraint=None,
# bias_constraint=None)
# units: 神经元节点数,即输出空间维度。
# activation: 激活函数,若不指定,则不使用激活函数 (即线性激活: a(x) = x)。
# use_bias: 布尔值,该层是否使用偏置向量。
# kernel_initializer: kernel 权值矩阵的初始化器
# bias_initializer: 偏置向量的初始化器
# kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数
# bias_regularizer: 运用到偏置向的的正则化函数
# activity_regularizer: 运用到层的输出的正则化函数 (它的 “activation”)。
# kernel_constraint: 运用到 kernel 权值矩阵的约束函数
# bias_constraint: 运用到偏置向量的约束函数
# '''
# model = Model(inputs=inputs, outputs=x) # 建立模型
# return model
def build_LSTM1_model(input_shape):
'''构建LSTM神经网络模型'''
model = Sequential() #Sequential连续的
model.add(Dense(4))
#model.add(LSTM(units=50, input_dim=4, input_length=sequence_length-1))
#model.add(Dropout(0.2))
model.add(LSTM(units=128, input_dim=1, input_length=params['timesteps']-1,return_sequences=True)) #input_dim:张量维度,input_length:代表序列长度,可以理解成有多少个样本
model.add(params['Dropout'])#Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。
model.add(LSTM(units=64, input_dim=1, input_length=params['timesteps']-1,return_sequences=True))
model.add(params['Dropout'])
model.add(LSTM(units=32, input_dim=1, input_length=params['timesteps']-1,return_sequences=True))
model.add(params['Dropout'])
model.add(LSTM(units=16, input_dim=1, input_length=params['timesteps']-1,return_sequences=False))
# model.add(Dropout(0.2))
model.add(Dense(1))
return model
# 模型的训练
model = build_LSTM1_model(train_x.shape[1:]) # 实例化模型
params['batch_size'] # 每一训练批次的样本数量
epochs = 350 # 最大训练轮数
opt = optimizers.Adam(params['learning_rate'],beta_1=0.9, beta_2=0.99, epsilon=1e-08, decay=3e-5, amsgrad=False) # 优化器
model.compile(loss='mse',
optimizer=opt,
metrics=['mae', 'mse'])
# early_stopping = EarlyStopping(monitor='loss', min_delta=0.000001,patience=20) # 早停策略
'''
monitor: 监控的数据接口,有’acc’,’val_acc’,’loss’,’val_loss’等等。正常情况下如果有验证集,就用’val_acc’或者’val_loss’。
但是因为笔者用的是5折交叉验证,没有单设验证集,所以只能用’acc’了。
min_delta:增大或减小的阈值,只有大于这个部分才算作improvement。这个值的大小取决于monitor,也反映了你的容忍程度。
例如笔者的monitor是’acc’,同时其变化范围在70%-90%之间,所以对于小于0.01%的变化不关心。
加上观察到训练过程中存在抖动的情况(即先下降后上升),所以适当增大容忍程度,最终设为0.003%。
patience:能够容忍多少个epoch内都没有improvement。这个设置其实是在抖动和真正的准确率下降之间做tradeoff。
如果patience设的大,那么最终得到的准确率要略低于模型可以达到的最高准确率。
如果patience设的小,那么模型很可能在前期抖动,还在全图搜索的阶段就停止了,准确率一般很差。
patience的大小和learning rate直接相关。在learning rate设定的情况下,前期先训练几次观察抖动的epoch number,比其稍大些设置patience。
在learning rate变化的情况下,建议要略小于最大的抖动epoch number。
笔者在引入EarlyStopping之前就已经得到可以接受的结果了,EarlyStopping算是锦上添花,所以patience设的比较高,设为抖动epoch number的最大值。
mode: 就’auto’, ‘min’, ‘,max’三个可能。如果知道是要上升还是下降,建议设置一下。笔者的monitor是’acc’,所以mode=’max’。
min_delta和patience都和“避免模型停止在抖动过程中”有关系,所以调节的时候需要互相协调。
通常情况下,min_delta降低,那么patience可以适当减少;min_delta增加,那么patience需要适当延长;反之亦�
使用LSTM实现未来气温的预测
版权申诉
5星 · 超过95%的资源 185 浏览量
2023-06-03
11:25:13
上传
评论 5
收藏 9KB ZIP 举报
AI信仰者
- 粉丝: 1w+
- 资源: 143
最新资源
- 信呼OA系统2.1.7版源码
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页