欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用PaddleTS的LSTNet模型预测中国人口:机器学习实战第三篇

最编程 2024-01-18 21:55:45
...

本文将继续完成PaddleTS人口回归预测任务,主要完成模型构建、模型预测、模型评估、预测可视化部分。

本项目使用JupyterNotebook进行演示

1. 项目回顾 ????

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

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

2. 数据集介绍

本项目使用的数据集为中国人口预测数据集,包含10个字段,其中8个特征字段,1个标签字段,1个行索引字段。

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

3. 构建网络模型

LSTNet是2018年提出的时序预测模型, 它同时利用卷积层和循环层的优势, 提取时间序列多变量之间的局部依赖模式和捕获复杂的长期依赖。

我们将训练最大轮数设置为2000,模型输入时间序列长度为5,输出序列长度为5。

  • in_chunk_len (int) – 模型输入的时间序列长度.
  • out_chunk_len (int) – 模型输出的时间序列长度.
  • max_epochs (int) – 训练的最大轮数.
lstm = LSTNetRegressor(
    in_chunk_len = 5,
    out_chunk_len = 5,
    max_epochs=2000
)

4. 模型训练

使用归一化后的训练数据与验证数据传入模型,进行模型训练。

lstm.fit(train_dataset_scaled, val_dataset_scaled)

部分运行结果如下图所示:

image.png

5. 模型的预测

对归一化后的验证集数据进行预测,数据集切分后的形状先是验证集,再是测试集

  • 给训练后的LSTM网络模型传入验证集数据,然后会预测出后面一个序列的数据(根据现有序列推算新序列)
  • 而对于验证集来讲,验证集后面的序列在测试集中,预测出的新序列就可以和测试集的真实数据做一个对比。
  • 想获得测试集与预测出的数据重合部分,需要用到数组切分
subset_test_pred_dataset = lstm.predict(val_dataset_scaled)
subset_test_dataset, _ = test_dataset_scaled.split(len(subset_test_pred_dataset.target))
subset_test_dataset, _ = test_dataset_scaled.split(len(subset_test_pred_dataset.target))
subset_test_dataset.plot(add_data=subset_test_pred_dataset, labels=['Pred'])

运行结果如下图所示:

image.png

6. 模型评估

使用平均绝对误差MAE(Mean Absolute Error)指标对预测结果进行评估,计算公式如下:

image.png

mae = MAE()
mae(subset_test_dataset, subset_test_pred_dataset)

运行结果如下图所示:

  • 传入测试集真实数据和测试集预测数据到函数中即可求MAE损失。

image.png

7. 预测结果反归一化

因为传入模型进行训练的数据都是经过标准化/归一化处理后的数据,因此对于经过模型预测出的结果,也是标准化后的数据,需要我们进行反归一化处理,从而查看原始大小的预测数据。

  • 对预测出的数据进行反归一化
  • 对测试集中真实数据标签进行反归一化
  • 对二者反归一化的结果进行可视化

7.1 反归一化

subset_test_pred_dataset_new = scaler.inverse_transform(subset_test_pred_dataset)
subset_test_dataset_new = scaler.inverse_transform(subset_test_dataset)

7.2 可视化结果对比

subset_test_dataset, _ = test_dataset_scaled.split(len(subset_test_pred_dataset.target))
subset_test_dataset_new.plot(add_data=subset_test_pred_dataset_new, labels=['Pred'])

运行结果如下图所示:

image.png

8. 总结 ????

  • 本项目使用PaddleTS中LSTNet模型进行了完整预测流程,训练后的模型达到了较为不错的效果。
  • 由于本数据集样本量有限,今后可以选择在样本更充分的数据集进行实验。
  • 可以尝试微调网络参数来优化模型。

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