利用LSTM进行空气指数预测

毕设终于结束,感谢指导老师以及团队大伙们的辛苦付出,是时候总结一下毕设的内容了。
我们团队的毕业设计是关于利用递归神经网络模型LSTM(long-short-term memory)对中国主要城市的空气质量指数进行预测,并将LSTM与RLS进行比较,论文的主要内容是数据分析,机器学习。

之前对于机器学习一片空白的我在经历了毕业设计之后,接触到了几个比较常见的模型,接触到了tensorflow以及keras库,接触到了神秘的递归神经网络,激励函数,超参数,梯度下降等机器学习中的概念,很有必要做个笔记,形成一套方法论,为后面的学习工作作准备。

经过两三个礼拜的简易研究,个人并没有深入机器学习底层的数学原理研究,更多的是focus在应用板块,也就是利用代码库进行一些简易的模型设计,并训练来得到自己想要的结果。

在机器学习的使用过程中,我认为难度最大的地方在于源数据清理,模型参数的选取。接下来我尝试使用LSTM对中国部分城市的空气质量指数进行简易的预测。

在进行构建模型与预测之前,第一步就是分析数据集合的性质,观察数据集合需不需要归一正则化等等,
源数据
通过观察原数据的格式我们可以发现,这里面的数据只有每一天的空气质量指数,也就是只有一个属性值,那就说明我们不需要去除量纲,进行所谓的归一化操作。

分析完数据之后我们要明白遇到的问题是属于什么类型的学习问题。是无监督的还是有监督的?我们设想的是通过前几天的数据去预测空气指数,那么是否可以抽象成为以下的表格,其中t为我们需要预测的。
监督学习
就拿这表格的例子告诉我们,模型通过读取前4天的数据,尝试去预测第5天(t为预测值),通过计算第5天的预测值与实际值之间的误差来不断修正模型。那就说明模型可以通过源数据获取到真实值,再与预测值进行比较,这种给模型真实值去优化模型的训练方式其实就是监督学习。即通过告知模型预测结果的好坏来使得模型不断优化。

既然明白了该问题的本质,接下来就是将源数据集格式进行转换,将时间序列的问题转化为监督学习问题,这样我们就可以使用Keras的包进行模型构建了。

对于机器学习的模型,我们需要将数据集合划分为三个部分,分别为训练数据集,验证数据集以及预测数据集,我这里将60%的数据作为训练集合,20%验证集合,20%预测集合。如下图所示,将数据切分完毕后传入time_to_supervised()方法进行时间序列转监督学习。
数据转换
数据切割以及格式转换完毕后,就需要设计模型进行训练了。机器学习领域模型没有唯一的设计方式,正因为它的随机性,需要我们使用一些手段去对模型的表现进行评估,在这里使用mean squared error以及预测结果和真实值之间的correlation,spearman correlation来衡量模型的表现。

对于超参数的选定,比如epoch的次数, batch size的大小等都是依据“经验”判断,对于我这种没有经验的只能先依据前人的一些试验结论进行调参。整个调参,优化模型的过程可以抽象为一下的流程图。

模型设计
经过大量的试验与修正参数之后,我们就会得到一个比较好的模型,接下来就是使用模型去进行预测了,当然数据可视化在机器学习与数据分析中是必不可少的。下图是得到的试验结果图。在这里插入图片描述
其中蓝色是原始数据,绿色为训练数据集合的预测结果,黄色为验证数据集合的预测结果,红色为预测数据集合的预测结果。
该模型的预测与实际值之间correlation可以达到0.72,可见这个模型的预测结果是比较准确的。

具体代码已经上传至我的GitHub,代码中已经有比较详细的注释,有兴趣的同学可以自行查看 https://github.com/wzcwzcwzc/LSTM_Prediction

喜欢的同学别忘了关注个人微信公众号噢~在这里插入图片描述

  • 11
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
以下是使用 LSTM 进行多步预测的 MATLAB 代码示例: ```matlab % 导入数据 data = csvread('data.csv'); % 数据预处理 train_data = data(1:end-1, :); train_labels = data(2:end, :); % 设置模型参数 input_size = size(train_data, 2); output_size = size(train_labels, 2); hidden_size = 32; sequence_length = 10; learning_rate = 0.001; epochs = 100; % 定义 LSTM 网络结构 layers = [ ... sequenceInputLayer(input_size) lstmLayer(hidden_size, 'OutputMode', 'sequence') fullyConnectedLayer(output_size) regressionLayer]; % 设置训练选项 options = trainingOptions('adam', ... 'LearnRateSchedule', 'piecewise', ... 'LearnRateDropFactor', 0.1, ... 'LearnRateDropPeriod', 50, ... 'MaxEpochs', epochs, ... 'MiniBatchSize', 32, ... 'Verbose', true); % 训练 LSTM 模型 net = trainNetwork(train_data, train_labels, layers, options); % 使用训练好的模型进行多步预测 test_data = data(end-sequence_length+1:end, :); predicted_labels = []; for i = 1:sequence_length % 对每一个输入序列进行预测 predicted_label = predict(net, test_data'); % 更新输入序列,将预测结果添加到末尾 test_data = [test_data(2:end, :); predicted_label']; % 存储预测结果 predicted_labels = [predicted_labels; predicted_label']; end ``` 在这个示例中,我们首先导入数据并进行预处理。然后,我们设置模型参数,包括输入大小、输出大小、隐藏层大小、序列长度、学习率和迭代次数。接下来,我们定义 LSTM 网络结构,包括一个序列输入层、一个 LSTM 层、一个全连接层和一个回归层。然后,我们设置训练选项,并使用训练数据训练 LSTM 模型。最后,我们使用训练好的模型进行多步预测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值