{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# RNN 用于时间序列的分析\n", "前面我们讲到使用 RNN 做简单的图像分类的问题,但是 RNN 并不擅长此类问题,下面我们讲一讲如何将 RNN 用到时间序列的问题上,因为对于时序数据,后面的数据会用到前面的数据,LSTM 的记忆特性非常适合这种场景。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "首先我们可以读入数据,这个数据是 10 年飞机月流量,可视化得到下面的效果。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "data_csv = pd.read_csv('./data.csv', usecols=[1])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(data_csv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "首先我们进行预处理,将数据中 `na` 的数据去掉,然后将数据标准化到 0 ~ 1 之间。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# 数据预处理\n", "data_csv = data_csv.dropna()\n", "dataset = data_csv.values\n", "dataset = dataset.astype('float32')\n", "max_value = np.max(dataset)\n", "min_value = np.min(dataset)\n", "scalar = max_value - min_value\n", "dataset = list(map(lambda x: x / scalar, dataset))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "接着我们进行数据集的创建,我们想通过前面几个月的流量来预测当月的流量,比如我们希望通过前两个月的流量来预测当月的流量,我们可以将前两个月的流量当做输入,当月的流量当做输出。同时我们需要将我们的数据集分为训练集和测试集,通过测试集的效果来测试模型的性能,这里我们简单的将前面几年的数据作为训练集,后面两年的数据作为测试集。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def create_dataset(dataset, look_back=2):\n", " dataX, dataY = [], []\n", " for i in range(len(dataset) - look_back):\n", " a = dataset[i:(i + look_back)]\n", " dataX.append(a)\n", " dataY.append(dataset[i + look_back])\n", " return np.array(dataX), np.array(dataY)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# 创建好输入输出\n", "data_X, data_Y = create_dataset(dataset)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# 划分训练集和测试集,70% 作为训练集\n", "train_size = int(len(data_X) * 0.7)\n", "test_size = len(data_X) - train_size\n", "train_X = data_X[:train_size]\n", "train_Y = data_Y[:train_size]\n", "test_X = data_X[train_size:]\n", "test_Y = data_Y[train_size:]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(99, 1)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_Y.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最后,我们需要将数据改变一下形状,因为 RNN 读入的数据维度是 (seq, batch, feature),所以要重新改变一下数据的维度,这里只有一个序列,所以 batch 是 1,而输入的 feature 就是我们希望依据的几个月份,这里我们定的是两个月份,所以 feature 就是 2." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "import torch\n", "\n", "train_X = train_X.reshape(-1, 1, 2)\n", "train_Y = train_Y.reshape(-1, 1, 1)\n", "test_X = test_X.reshape(-1, 1, 2)\n", "\n", "train_x = torch.from_numpy(train_X)\n", "train_y = torch.from_numpy(train_Y)\n", "test_x = torch.from_numpy(test_X)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from torch import nn\n", "from torch.autograd import Variable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里定义好模型,模型的第一部分是一个两层的 RNN,每一步模型接受两个月的输入作为特征,得到一个输出特征。接着通过一个线性层将 RNN 的输出回归到流量的具体数值,这里我们需要用 `view` 来重新排列,因为 `nn.Linear` 不接受三维的输入,所以我们先将前两维合并在一起,然后经过线性层之后再将其分开,最后输出结果。" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# 定义模型\n", "class lstm_reg(nn.Module):\n", " def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):\n", " super(lstm_reg, self).__init__()\n", " \n", " self.rnn = nn.LSTM(input_size, hidden_size, num_layers) # rnn\n", " self.reg = nn.Linear(hidden_size, output_size) # 回归\n", " \n", " def forward(self, x):\n", " x, _ = self.rnn(x) # (seq, batch, hidden)\n", " s, b, h = x.shape\n", " x = x.view(s*b, h) # 转换成线性层的输入格式\n", " x = self.reg(x)\n", " x = x.view(s, b, -1)\n", " return x" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "net = lstm_reg(2, 4)\n", "\n", "criterion = nn.MSELoss()\n", "optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "定义好网络结构,输入的维度是 2,因为我们使用两个月的流量作为输入,隐藏层的维度可以任意指定,这里我们选的 4" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 100, Loss: 0.00395\n", "Epoch: 200, Loss: 0.00337\n", "Epoch: 300, Loss: 0.00259\n", "Epoch: 400, Loss: 0.00149\n", "Epoch: 500, Loss: 0.00109\n", "Epoch: 600, Loss: 0.00106\n", "Epoch: 700, Loss: 0.00097\n", "Epoch: 800, Loss: 0.00092\n", "Epoch: 900, Loss: 0.00087\n", "Epoch: 1000, Loss: 0.00105\n" ] } ], "source": [ "# 开始训练\n", "for e in range(1000):\n", " var_x = Variable(train_x)\n", " var_y = Variable(train_y)\n", " # 前向传播\n", " out = net(var_x)\n", " loss = criterion(out, var_y)\n", " # 反向传播\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " if (e + 1) % 100 == 0: # 每 100 次输出结果\n", " print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.data[0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "训练完成之后,我们可以用训练好的模型去预测后面的结果" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "net = net.eval() # 转换成测试模式" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "data_X = data_X.reshape(-1, 1, 2)\n", "data_X = torch.from_numpy(data_X)\n", "var_data = Variable(data_X)\n", "pred_test = net(var_data) # 测试集的预测结果" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "# 改变输出的格式\n", "pred_test = pred_test.view(-1).data.numpy()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 画出实际结果和预测的结果\n", "plt.plot(pred_test, 'r', label='prediction')\n", "plt.plot(dataset, 'b', label='real')\n", "plt.legend(loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里蓝色的是真实的数据集,红色的是预测的结果,我们能够看到,使用 lstm 能够得到比较相近的结果,预测的趋势也与真实的数据集是相同的,因为其能够记忆之前的信息,而单纯的使用线性回归并不能得到较好的结果,从这个例子也说明了 RNN 对于序列有着非常好的性能。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**小练习:试试改变隐藏状态输出的特征数,看看有没有什么改变,同时试试使用简单的线性回归模型,看看会得到什么样的结果**" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }