java 数据周期预测_关于使用张量流LSTM用时间序列数据预测下一个值的实际项目...

本文探讨了使用RNN-LSTM模型预测网络视图数据的挑战,作者通过特征工程将原始数据扩展到8个特征并进行了标准化。尽管尝试了不同的超参数配置,如time_step和隐藏单元数,模型预测效果仍不理想。对比之下,传统统计方法如加权平均在预测上表现出更好的准确性。作者寻求改善LSTM模型结果的方法或技巧。
摘要由CSDN通过智能技术生成

最近我研究了一个问题来预测第二天的网络视图 . 我选择了RNN-LSTM模型但效果并不理想 .

我的原始数据大约是200天,每天有1440点(每天有1440分钟,每分钟有一个值)=> [200 * 1440, 1] .

在特征工程之后,我将1-feature(仅为Web视图值)扩展为 8-features (当天的索引(范围从0到1439),Web视图值,is_weekday(0,1),当天的哪个小时(范围)从0到23),哪一周(从0到6)等等) . So after this step, the data is like [200 * 1440, 8]

然后将每个特征标准化,使其属于[-1,1] .

然后使用lstm模型 . 模型拱门就像FNN-3 * LSTM-2 * FNN . rnn_hidden_unit是128.我尝试使用30个time_steps来预测下一个值 . 例如,t0,t1,...,t29-> t30和t1,t2,...,t30-> t31 .

第一个FNN层是将8个特征转换为128,以使其适合于lstm层 . [batch_size,time_step,n_features] - > [batch_size,time_step,rnn_hidden_unit]

LSTM层有3层(MultiRNNCell,lstm_depth = 3)

最后2 * FNN层是将128转换为64到1 .

last_cell_output = output_rnn[:, -1, :] output_layer1 = tf.contrib.layers.fully_connected(last_cell_output, num_outputs=64, activation_fn=None) pred = tf.contrib.layers.fully_connected(output_layer1, num_outputs=1, activation_fn=None)

损失函数:仅使用最后一个lstm单元来计算损失 .

loss = tf.reduce_mean(tf.square(tf.reshape(pred, [-1]) - tf.reshape(Y, [-1]))) + regularization_cost

结果如下图所示,蓝色是实数值,灰色区域由两个值组成:predict_value * 0.8和predict_value * 1.2 .

但是当我选择传统的统计方法,例如使用前5个工作日的加权平均值,如果下一个预测日是工作日或前2个周末,如果下一个预测日是周末 . 结果很好 .

dc49dc77-8cef-4258-be6f-a0edecc7959e.png

So are there any methods or tricks to improve the lstm model result? Or my solution itself has some faults. 非常感谢!

lstm模型的一些重要超参数:

time_step=30 (I also tried 60, 120. And 30 and 60 are well)

rnn_hidden_unit=128

n_features=8

lstm_depth=3

ouput_keep_prob=0.7

l2_regularization_rate=0.001

batch_size=64

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、下载并安装mysql,将脚本执行至数据库中; 2、配置java环境,使用jdk8,配置环境变量,下载IntelliJ IDEA 2019.2.4,该工具为java代码编译器 3、下载Maven,配置至环境变量(百度搜索很多),将构建器为Maven,类库配置成阿里库(方法:百度搜索很多很多) 4、将工程导入后,在application-local.yml文件中配置数据库 5、在logback-prod.xml文件中配置log日志 6、配置完毕后,即可启动 访问地址:http://localhost:8082/anime/login.html 用户名:admin 密码:admin V:china1866 1、 登录 2、 首页 3、 权限管理-用户管理 4、 权限管理-添加用户数据 5、 交通数据管理-查看交通数据 6、 交通数据管理-添加交通数据 7、 交通预测-交通数据预测 脚本: CREATE TABLE `traffic_data_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '序列', `trafficId` VARCHAR(50) NULL DEFAULT NULL COMMENT '交通数据编号', `trafficContent` VARCHAR(50) NULL DEFAULT NULL COMMENT '交通状况', `trafficSection` VARCHAR(200) NULL DEFAULT NULL COMMENT '交通路段', `trafficMan` VARCHAR(200) NULL DEFAULT NULL COMMENT '上报人', `trafficDate` VARCHAR(200) NULL DEFAULT NULL COMMENT '上报时间', `status` VARCHAR(200) NULL DEFAULT NULL COMMENT '交通状态', PRIMARY KEY (`id`) ) COMMENT='交通数据表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=44 ; CREATE TABLE `sys_user_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `role_id` INT(11) NULL DEFAULT NULL COMMENT '角色ID', `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', `user_name` VARCHAR(100) NOT NULL COMMENT '用户名', `status` INT(11) NOT NULL COMMENT '是否有效0:false\\\\1:true', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(100) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(100) NULL DEFAULT NULL, `password` VARCHAR(128) NOT NULL, `tenantcode` VARCHAR(50) NOT NULL, `diskId` VARCHAR(500) NULL DEFAULT NULL, `remarks` VARCHAR(500) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COMMENT='系统用户表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=51 ; CREATE TABLE `sys_role_t` ( `role_id` INT(11) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(200) NOT NULL COMMENT '权限名称', `status` INT(11) NOT NULL COMMENT '是否有效0:true\\\\1:false', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(100) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(100) NULL DEFAULT NULL ) COMMENT='系统角色表' COLLATE='utf8_general_ci' ENGINE=InnoDB ; CREATE TABLE `sys_menu_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '序列', `parent_id` VARCHAR(50) NOT NULL COMMENT '父节点ID', `menu_id` VARCHAR(50) NOT NULL COMMENT '菜单ID', `menu_name` VARCHAR(200) NOT NULL COMMENT '菜单名称', `menu_url` VARCHAR(200) NULL DEFAULT NULL COMMENT '菜单URL', `status` INT(11) NOT NULL COMMENT '有效(0有效,1失效)', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(200) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(200) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COMMENT='菜单表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=33 ; CREATE TABLE `sys_menu_role_relation_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '序列', `menu_id` VARCHAR(50) NOT NULL COMMENT '菜单ID', `role_id` VARCHAR(50) NOT NULL COMMENT '角色ID', `status` INT(11) NOT NULL COMMENT '有效(0有效,1失效)', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(200) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(200) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COMMENT='角色与菜单关系表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=51 ;
好的,我可以帮您编写一个基于PyTorch的LSTM时间序列数据预测程序,以下是示例代码: 首先,需要安装PyTorch和其他必要的库: ```python !pip install torch !pip install numpy !pip install pandas !pip install matplotlib ``` 然后,我们需要加载数据。这里以温度数据为例,假设我们有一个温度数据集`temperature.csv`,其中包含每小时的温度数据。我们可以使用`pandas`库来加载数据: ```python import pandas as pd # 加载数据 data = pd.read_csv('temperature.csv', header=None, index_col=False, delimiter=',', names=['date', 'temperature'], dtype={'date': 'str', 'temperature': 'float'}) # 查看数据 print(data.head()) ``` 接下来,我们需要将数据拆分成训练集和测试集。这里我们将前80%的数据作为训练集,后20%的数据作为测试集: ```python # 将数据拆分成训练集和测试集 train_size = int(len(data) * 0.8) test_size = len(data) - train_size train_data, test_data = data.iloc[0:train_size], data.iloc[train_size:len(data)] print('训练集大小:', len(train_data)) print('测试集大小:', len(test_data)) ``` 然后,我们需要将数据转换为模型输入。这里我们使用前`look_back`个时间步作为输入,预测一个时间步的温度。我们定义一个函数来创建数据集: ```python import numpy as np # 创建数据集 def create_dataset(dataset, look_back=1): X, Y = [], [] for i in range(len(dataset)-look_back-1): x = dataset[i:(i+look_back), 0] X.append(x) Y.append(dataset[i + look_back, 0]) return np.array(X), np.array(Y) # 将数据转换为模型输入 look_back = 24 # 每个输入序列包含24小时的数据 train_X, train_Y = create_dataset(train_data[['temperature']].values, look_back) test_X, test_Y = create_dataset(test_data[['temperature']].values, look_back) # 将输入转换为张量 train_X = torch.from_numpy(train_X).float() train_Y = torch.from_numpy(train_Y).float() test_X = torch.from_numpy(test_X).float() test_Y = torch.from_numpy(test_Y).float() ``` 接下来,我们定义模型。这里我们使用一个包含一个LSTM层和一个全连接层的简单模型: ```python import torch.nn as nn # 定义模型 class LSTM(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(LSTM, self).__init__() self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) return out # 初始化模型 input_size = 1 # 输入特征数 hidden_size = 32 # 隐藏层大小 output_size = 1 # 输出特征数 model = LSTM(input_size, hidden_size, output_size) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 然后,我们训练模型: ```python # 训练模型 num_epochs = 100 batch_size = 32 train_dataset = torch.utils.data.TensorDataset(train_X, train_Y) train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() if epoch % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) ``` 最后,我们使用测试集评估模型: ```python # 测试模型 model.eval() with torch.no_grad(): test_outputs = model(test_X) test_loss = criterion(test_outputs, test_Y) print('测试集损失:', test_loss.item()) # 绘制预测结果 test_predict = test_outputs.data.numpy() test_truth = test_Y.data.numpy() plt.plot(test_predict, label='预测') plt.plot(test_truth, label='真实') plt.legend() plt.show() ``` 这样就完成了一个基于PyTorch的LSTM时间序列数据预测程序。您可以根据自己的需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值