【机器学习】基于PaddleTS的LSTNet时序预测模型实现中国人口预测(1)

401 阅读5分钟

本项目完成了PaddleTS进行LSTNet网络模型回归预测的数据处理部分,包括数据基本的数据分析例如数据类型查看,数据可视化,箱型图查看异常值,题目分析等部分。

1. 项目简介 🎄

本项目属于机器学习范畴,根据指定数据集(中国人口数据集等)使用PaddleTS进行LSTNet网络模型搭建全流程,包括数据预处理、模型构建、模型训练、模型预测、预测结果可视化等。

  • 我们将根据中国人口数据集中的多个特征(features),例如:出生人口(万)、中国人均GPA(美元计)、中国性别比例(按照女生=100)、自然增长率(%)等8个特征字段,预测中国未来总人口(万人)这1个标签字段。属于多输入,单输出LSTM神经网路预测范畴。
  • 对于本项目使用的工具PaddleTS,PaddleTS是一个易用的深度时序建模的Python库,它基于飞桨深度学习框架PaddlePaddle,专注业界领先的深度模型,旨在为领域专家和行业用户提供可扩展的时序建模能力和便捷易用的用户体验。
  • 该工具包内置了多种深度学习模型,包括NBEATS、NHiTS、LSTNet、TCN、Transformer, DeepAR(概率预测)、Informer等时序预测模型。本项目将使用其中的LSTNet深度学习模型完成项目开发。

🌈 LSTM(Long Short Term Memory networks)出现以来,在捕获时间序列依赖关系方面表现出了强大的潜力,LSTM由三个门来控制细胞状态,这三个门分别称为忘记门、输入门和输出门,细胞状态像传送带一样。它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNN。LSTM是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。

image.png

2. 数据集介绍 🌲

本项目使用的数据集为中国人口预测数据集,包含10个字段,其中8个特征字段,1个标签字段,1个行索引字段,数据集各字段对应的数据类型如下表所示:

  • 有些字段为int64类型,需要经过相关的数据处理,才可传入模型进行训练。
  • 数据包含50条样本,因此应该合理确定训练数据、测试数据和验证数据
年份出生人口(万)总人口(万人)中国人均GPA(美元计)中国性别比例(按照女生=100)自然增长率(%)城镇人口(城镇+乡村=100)乡村人口美元兑换人民币汇率中国就业人口(万人)
int64int64int64int64float64float64float64float64float64int64

2. 环境准备

安装模块并导入模块

2.1 安装依赖库

# 安装paddlets依赖库 !pip install paddlets -q

2.2 导入所需库

%matplotlib inline 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns import paddlets 
from paddlets import TSDataset 
from paddlets import TimeSeries 
from paddlets.models.forecasting 
import MLPRegressor, LSTNetRegressor 
from paddlets.transform 
import Fill, StandardScaler 
from paddlets.metrics 
import MSE, MAE

3. 数据处理

3.1 导入数据

  • 使用pandas.to_datetime函数将date字段的数据转换为pandas中datetime类型的时间类型数据,方便后续处理数据。
population = pd.read_csv("data/data140190/人口.csv") population.head()
population['date'] = pd.to_datetime(population['年份'])

3.2 查看各字段类型

因为数据集中有些字段为int64类型,需要转化成float类型,才能在后续导入模型中进行训练,否则会报错。

population.dtypes

3.3 数据可视化

3.3.1 特征(features)折线图

绘制出各个特征与年份索引之间的折线图,进行初步观察

  • 下面展示总人口数与随着年份变化的折线图
  • 通过可视化图像我们大体可以将其理解成总人口数量随时间呈现规律性变化
  • 因此,我们可以选用LSTNet网络进行预测
  • LSTM\LSTNet网络需要分析数据的变化规律,若是图像展示出变量随时间呈现一定规律性变化,则可以使用该网络。

image.png

3.3.2 箱型图

查看部分数据的分布情况,下面抽取了出生人口(万)、总人口(万人)、中国人均GPA(美元计)、中国就业人口(万人)这四个字段进行箱型图展示。

from pylab import mpl
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'/usr/share/fonts/fangzheng/FZSYJW.TTF',size=12)
sns.set(font=myfont.get_name())
plt.figure(figsize=(15,8),dpi=100)
plt.subplot(1,4,1)
sns.boxplot(y="出生人口(万)", data=population, saturation=0.9)
plt.subplot(1,4,2)
sns.boxplot(y="总人口(万人)", data=population, saturation=0.9)
plt.subplot(1,4,3)
sns.boxplot(y="中国人均GPA(美元计)", data=population, saturation=0.9)
plt.subplot(1,4,4)
sns.boxplot(y="中国就业人口(万人)", data=population, saturation=0.9)
plt.tight_layout()

运行结果如下图所示:

  • 箱型图通常用来观察离群点,对于离群点通常视为异常值
  • 可以采用一些插补手段来替换离群点(超越上界和下界的点),插补手段例如线性插补,均值插补等等
  • 当然,因为本数据集数据量很小,只包含50条数据,如果通过插补替换异常值,效果未必很好
  • 在此处就不考虑进一步的异常值处理了

image.png

3. 总结

本文介绍了数据处理部分,经过数据可视化发现数据集目标值(总人口)随着时间(年份)呈现规律性变化,因此可以使用LSTNet模型进行解决,根据箱型图绘制了数据的分布,用来查看离群点(大于上界和小于下界的点)。下一篇文章将完成数据预处理部分以及模型构造、模型训练、模型预测等步骤。

本文正在参加「金石计划 . 瓜分6万现金大奖」