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

1,038

本文,将继续使用PaddleTS工具中的LSTNet模型完成回归预测任务,主要包含数据预处理部分,例如归一化、TSDataset构造。

1. 项目回顾 🎄

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

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

2. 数据集介绍

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

  • 其中包括10个字段,例如年份、总人口数、出生率、自然增长率等等。
  • 数据包含50条样本,因此应该合理确定训练数据、测试数据和验证数据。
  • 数据集样本较少,测试集可以相应的少一些,尽可能多一些训练数据。

3. 数据预处理

3.1 打印特征字段

因为数据集特征数量有限,我们保留了数据集中所有的特征字段,下面进行对选取的特征进行打印和展示。

print(
    "选取的参数指标是:",
    ", ".join([titles[i] for i in [0, 1, 2, 3, 4, 5, 6, 7, 8]]),
)
selected_features = [feature_keys[i] for i in [0, 1, 2, 3, 4, 5, 6, 7, 8]]
features = population[selected_features]
features.index = population[date_time_key]
features.head()

运行结果如下图所示:

image.png

3.2 转换字段类型

我们需要将int类型字段转化为float类型的字段,方可用于模型训练,否则会报错。

  • 首先使用如下语句查看数据集各个字段类型。
  • 接下来我们将int64转为float64并替换原数据字段

先查看一下当前数据集各个字段的类型,从而观察出哪些字段需要转换类型。

population.dtypes

运行结果如下图所示:

  • 可以发现存在in64类型的字段,例如年份,出生人口等等
  • 需要将其转换数据类型

image.png

转化字段类型:

population['出生人口(万)'] = population['出生人口(万)'].astype('float64')
population['总人口(万人)'] = population['总人口(万人)'].astype('float64')
population['中国人均GPA(美元计)'] = population['中国人均GPA(美元计)'].astype('float64')
population['中国就业人口(万人)'] = population['中国就业人口(万人)'].astype('float64')

3.3 构造TSDataset

TSDataset 是 PaddleTS 中最主要的类之一,其被设计用来表示绝大多数时序样本数据。通常,时序数据可以分为以下几种:

  • 单变量数据,只包含单列的预测目标,同时可以包涵单列或者多列协变量
  • 多变量数据,包涵多列预测目标,同时可以包涵单列或者多列协变量

TSDataset 需要包含time_index属性,time_index支持 pandas.DatetimeIndex 和 pandas.RangeIndex 两种类型。

  • 按照PaddleTS工具库的要求构造TSDataset才能用于后续模型训练
target_cov_dataset = TSDataset.load_from_dataframe(
    population,
    time_col='年份',
    target_cols='总人口(万人)',
    observed_cov_cols=['出生人口(万)', '中国人均GPA(美元计)', '中国性别比例(按照女生=100)', '自然增长率(%)',
       '城镇人口(城镇+乡村=100)', '乡村人口', '美元兑换人民币汇率', '中国就业人口(万人)'],
    fill_missing_dates=True,
    fillna_method='pre'
)
target_cov_dataset.plot(['总人口(万人)', '出生人口(万)', '中国人均GPA(美元计)', '中国性别比例(按照女生=100)', '自然增长率(%)',
       '城镇人口(城镇+乡村=100)', '乡村人口', '美元兑换人民币汇率', '中国就业人口(万人)'])

运行结果如下图所示:

  • 将所有特征字段绘制在一张图中,进行可视化展示

image.png

展示各个字段统计学描述

target_cov_dataset.summary()

3.4 划分数据集

训练集:验证集:测试集 = 0.6 :0.2 :0.2

train_dataset, val_test_dataset = target_cov_dataset.split(0.6)
val_dataset, test_dataset = val_test_dataset.split(0.5)
train_dataset.plot(add_data=[val_dataset,test_dataset], labels=['Val', 'Test'])

划分后的数据集可视化展示如下:

image.png

3.5 归一化

  • 对训练集、测试集、验证集分别归一化,缩小数据范围,使得模型训练后更加准确。
  • 比如,有些数据范围是几千,有的数据范围是几十,这样在量级上就相差很多,如果直接放入模型进行训练,会导致某些特征过分放大,最终影响模型效果,因此需要做归一化处理。
scaler = StandardScaler()
scaler.fit(train_dataset)
train_dataset_scaled = scaler.transform(train_dataset)
val_test_dataset_scaled = scaler.transform(val_test_dataset)
val_dataset_scaled = scaler.transform(val_dataset)
test_dataset_scaled = scaler.transform(test_dataset)

4. 总结

本文主要完成了人口回归预测项目的数据预处理部分,解释了为什么要做归一化、并且完成数据集划分、字段类型转换、相应的可视化等等。下一篇文章将主要完成模型构建、模型预测、以及模型评估任务,最终对预测数据进行可视化展示。

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