流量预测_MLP模型_keras

news2024/11/25 4:07:29

目录

    • 0、我在干什么?
    • 1、import libararies
    • 2、加载数据load data
    • 3、独家观察数据函数 :heartbeat:
    • 4、数据预处理pre-processing
      • (1)将时间戳转换为一个日期时间索引
      • (2)填充所有缺失的值
      • (3)将时间序列数据转换成监督学习数据
        • 手动转换
      • (4)数据集划分(split)为训练集和验证集
    • 4、创建MLP模型
      • (1)设置超参数
      • (2)创建模型(keras)
      • (3)训练模型
      • (4)画随epoch变化的loss图
      • (5)计算预测值和实际值之间的均方误差

0、我在干什么?

我在预测一个名字叫做elborn基站的下行链路流量,用过去29天的数据预测未来10天的数据

1、import libararies

一般必须都要导入的库有

  • import pandas as pd : data processing, like pd.read.csv…
  • import numpy as np :线性代数
  • import matplotlib.pyplot as plt :画图
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import numpy as np  # linear algebra
import warnings
warnings.filterwarnings('ignore') # 忽略警告信息
import matplotlib.pyplot as plt

2、加载数据load data

对csv数据使用pandas.read_csv函数读取
一些参数:

  • filepath_or_buffer: 文件路径或缓冲区。可以是本地文件路径,也可以是文件对象、URL等
  • header: 列名索引。指定数据文件中列名的索引。默认为None,表示没有列名。取值可以是整数,表示第几行为列名;也可以是None,表示自动检测列名;还可以是列表,表示指定列名的位置。
  • na_values: 缺失值。指定用于替换缺失值的字符或列表。默认为[‘NA’, ‘null’, ‘NaN’]。
  • index_col: 索引列。指定数据文件中用于索引的列。默认为None,表示没有索引列。取值可以是整数,表示第几列用于索引;也可以是列名,表示指定列用于索引。
  • sep: 分隔符。用于分隔数据行的字段。默认为逗号,。
  • delimiter: 分隔符。与sep类似,但它是更通用的参数,可以用于其他类型的分隔符,如制表符\t等。
elborn_df = pd.read_csv('dataset/ElBorn.csv')
elborn_test_df = pd.read_csv('dataset/ElBorn_test.csv')

3、独家观察数据函数 💓

💥basic_eda💥

  • 前五行
  • 显示DataFrame的详细信息,包括列名、数据类型、缺失值
  • 显示DataFrame的统计摘要信息,包括每列的平均值、标准差、最小值、最大值等
  • 显示列名
  • 各列的数据类型
  • 是否有缺失值
  • 是否有NULL值
  • 数据的形状
def basic_eda(df):
    print("-------------------------------TOP 5 RECORDS-----------------------------")
    print(df.head(5))
    print("-------------------------------INFO--------------------------------------")
    print(df.info())
    print("-------------------------------Describe----------------------------------")
    print(df.describe())
    print("-------------------------------Columns-----------------------------------")
    print(df.columns)
    print("-------------------------------Data Types--------------------------------")
    print(df.dtypes)
    print("----------------------------Missing Values-------------------------------")
    print(df.isnull().sum())
    print("----------------------------NULL values----------------------------------")
    print(df.isna().sum())
    print("--------------------------Shape Of Data---------------------------------")
    print(df.shape)
    print("============================================================================ \n")
basic_eda(elborn_df)
basic_eda(elborn_test_df)

然后画图看一下💥

# 我现在想把elborn_df画出来,横坐标是时间,纵坐标是down,并且横坐标的标签要旋转45度书写
plt.plot(elborn_df.index, elborn_df.down)
plt.xlabel('Time')
plt.ylabel('Down')
plt.title('Down')
# 我想把横坐标的日期标签旋转45
plt.xticks(rotation=45)

在这里插入图片描述
在这里面的Python小知识总结(纯小白哈🌸)

  • DataFrame.index:将得到DataFrame的索引(日期),作为Series对象
    • 如果DataFrame的index是整数,则返回一个从0开始的整数序列
    • 0 0
      1 1
      2 2
      3 3
      4 4
      5 5
      6 6
      7 7
      8 8
      9 9
      Name: index, dtype: int64
  • plt.plot():绘制折线的基本函数
    以下是一些参数
    • x: x轴数据,可以是列表、元组、NumPy数组等。
    • y: y轴数据,可以是列表、元组、NumPy数组等。
    • fmt: 折线图的样式和颜色。
      • 例如,'ro-'表示红色圆圈加短横线,
      • 'b–'表示蓝色虚线。
    • label:为折线图添加一个标签,可以在plt.legend()函数中使用该标签(用于显示图例)。
    • linewidth: 折线图的宽度。
    • color: 折线图的颜色。
    • marker: 折线图的标记形状,例如圆圈、叉号等。
    • markeredgecolor: 标记的边缘颜色。
    • markerfacecolor: 标记的填充颜色。
    • markevery: 标记的间隔,例如每隔10个数据点标记一次。
  • plt.xticks(rotation=45):设置x轴刻度标签的位置和显示方式

4、数据预处理pre-processing

(1)将时间戳转换为一个日期时间索引

elborn_df.set_index(pd.DatetimeIndex(elborn_df["time"]), inplace=True)
elborn_df.drop(["time"], axis=1, inplace=True)

(2)填充所有缺失的值

不填充的话后续fit模型的时候会出现loss全部为NAN的情况

elborn_df.down.fillna(elborn_df.down.mean(), inplace=True)
print(elborn_df.isna().sum())

(3)将时间序列数据转换成监督学习数据

在训练监督学习(深度学习)模型前,要把time series数据转化成samples的形式
那什么是sample?有一个输入组件 X X X和一个输出组件 y y y
深度学习模型就是一个映射函数: y = f ( X ) y=f(X) y=f(X)
对于一个单变量的one-step预测:输入组件就是前一个时间步的滞后数据,输出组件就是当前时间步的数据,如下:
X, y
[1, 2, 3], [4]
[2, 3, 4], [5]
[3, 4, 5], [6]

这里就是手动转换啦,之前写过使用TimeseriesGenerator自动转换的方法,看看对比

手动转换
def series_to_supervised(data, window=3, lag=1, dropnan=True):
    cols, names = list(), list()
    # Input sequence (t-n, ... t-1)
    for i in range(window, 0, -1):
        cols.append(data.shift(i))
        names += [('%s(t-%d)' % (col, i)) for col in data.columns]
    # Current timestep (t=0)
    cols.append(data)
    names += [('%s(t)' % (col)) for col in data.columns]
    # Target timestep (t=lag)
    cols.append(data.shift(-lag))
    names += [('%s(t+%d)' % (col, lag)) for col in data.columns]
    # Put it all together
    agg = pd.concat(cols, axis=1)
    agg.columns = names
    return agg
window =29
lag = 10
elborn_df_supervised = series_to_supervised(elborn_df, window, lag)

(4)数据集划分(split)为训练集和验证集

  • 训练集和测试集的区别

    • 使用验证集是为了快速调参,也就是用验证集选择超参数(网络层数,网络节点数,迭代次数,学习率这些)。另外用验证集还可以监控模型是否异常(过拟合啦什么的),然后决定是不是要提前停止训练。
    • 验证集的关键在于选择超参数,我们手动调参是为了让模型在验证集上的表现越来越好,如果把测试集作为验证集,调参去拟合测试集,就有点像作弊了。
    • 测试集不参与参数的学习过程,也不参与参数的选择过程,仅仅用于模型评价
  • 训练集在建模过程中会被大量经常使用,验证集用于对模型少量偶尔的调整,而测试集只作为最终模型的评价出现,因此训练集,验证集和测试集所需的数据量也是不一致的,在数据量不是特别大的情况下一般遵循6:2:2的划分比例

  • 为了使模型“训练”效果能合理泛化至“测试”效果,从而推广应用至现实世界中,因此一般要求训练集,验证集和测试集数据分布近似。但需要注意,三个数据集所用数据是不同的。

from sklearn.model_selection import train_test_split
label_name = 'down(t+%d)' % (lag)
label = elborn_df_supervised[label_name]
elborn_df_supervised = elborn_df_supervised.drop(label_name, axis=1)
X_train, X_valid, Y_train, Y_valid = train_test_split(elborn_df_supervised, label, test_size=0.4, random_state=0)
print('Train set shape', X_train.shape)
print('Validation set shape', X_valid.shape)

4、创建MLP模型

(1)设置超参数

epochs = 40
batch = 256
lr = 0.0003
adam = optimizers.Adam(lr)

(2)创建模型(keras)

model_mlp = Sequential()
model_mlp.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
model_mlp.add(Dense(1))
model_mlp.compile(loss='mse', optimizer=adam)
model_mlp.summary()

在这里插入图片描述

(3)训练模型

mlp_hitstory = model_mlp.fit(X_train.values, Y_train, epochs=epochs, batch_size=batch, validation_data=(X_valid.values, Y_valid), verbose=2)

(4)画随epoch变化的loss图

# 画图,横坐标是epochs,纵坐标是loss,分别画出train loss和validation loss
import matplotlib.pyplot as plt

plt.plot(mlp_hitstory.history['loss'])
plt.plot(mlp_hitstory.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()

在这里插入图片描述

(5)计算预测值和实际值之间的均方误差

from sklearn.metrics import mean_squared_error
mlp_train_pred = model_mlp.predict(X_train.values)
mlp_valid_pred = model_mlp.predict(X_valid.values)
print('Train rmse:', np.sqrt(mean_squared_error(Y_train, mlp_train_pred)))
print('Validation rmse:', np.sqrt(mean_squared_error(Y_valid, mlp_valid_pred)))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT如何完成技术路线图?

GPT如何完成技术路线图? 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的GPTs 1.自定义GPTs使用…

POC-700系列 支持多功能扩展的强固型无风扇嵌入式计算平台

POC-700系列是一款拥有小巧紧凑尺寸的无风扇嵌入式计算平台,搭载了英特尔 Alder Lake i3-N305或凌动 x7425E处理器,提供高达32个执行单元(EU) UHD图形功能,8核8线程,而其功耗非常低,仅为12W。POC-700系列可支持英特尔 …

2 - 表结构 | MySQL键值

表结构 | MySQL键值 表管理1. 库的操作2. 表的操作表的创建与删除表的修改复制表 3. 管理表记录 数据类型数值类型字符类型(汉字或者英文字母)日期时间类型 表头存储与日期时间格式的数据枚举类型 数据批量处理 表管理 客户端把数据存储到数据库服务器上…

Java项目:104SpringBoot就业管理系统

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 就业管理系统基于SpringBootMybatis开发,系统分为两种角色,分别是管理员和普通用户。 管理员功能如下: 就业信息管理…

一、医学影像云平台(AI赋能基层的最佳实践)

医学影像云平台,是一个目前影像业务中,各省市级领导比较重视的业务板块。因为,影像平台不但可以直接给原来没有PACS系统的1,2级医院提供PACS服务,还可以提供院间之间的业务,例如发送远程诊断,远程会诊业务&…

银行业绩数据监控大屏:驾驭金融海洋的航标

在金融领域,数据就是生命线。如何有效地监控和管理这些数据,确保银行业绩的稳健发展,已成为银行业内亟待解决的问题。而银行业绩数据监控大屏,正是解决这一问题的有力工具。 一、实时监控,把握业绩动态 银行业绩数据监…

前端八股文(CSS篇)二

目录 1.css中可继承与不可继承属性有哪些 2.link和import的区别 3.transition和animation的区别 4.margin和padding的使用场景 5.::before和:after的双冒号和单冒号有什么区别? 6.display:inline-block什么时候会显示间隙 7…

2024年【建筑焊工(建筑特殊工种)】考试试卷及建筑焊工(建筑特殊工种)考试总结

题库来源:安全生产模拟考试一点通公众号小程序 建筑焊工(建筑特殊工种)考试试卷根据新建筑焊工(建筑特殊工种)考试大纲要求,安全生产模拟考试一点通将建筑焊工(建筑特殊工种)模拟考试试题进行汇编,组成一套建筑焊工(建筑特殊工种)全真模拟考…

TinyEngine 服务端正式开源啦!!!

背景介绍 TinyEngine 低代码引擎介绍 随着企业对于低代码开发平台的需求日益增长,急需一个通用的解决方案来满足各种低代码平台的开发需求。正是在这种情况下,低代码引擎应运而生。它是一种通用的开发框架,通过对低代码平台系统常用的功能进…

JavaWeb——前端之AjaxVue

6. 前后端交互 6.1 Ajax(原生的) 概念: Asynchronous JavaScript And XML(异步的JavaScript和XML) 作用: 数据交互:通过Ajax可以给服务器发送请求,并获取服务器响应的数据异步交…

大数据时代快速获取数据方法,爬虫技术理论剖析与实战演练

一、教程描述 人工智能和机器学习,都离不开数据,若是没有数据,再好的算法,再好的模型,都没有用武之地。数据不仅是指现成的数据库,更加是指每天增加的海量互联网数据。本套教程将通过多个实战项目&#xf…

Spring Boot 3 集成 Jasypt详解

随着信息安全的日益受到重视,加密敏感数据在应用程序中变得越来越重要。Jasypt(Java Simplified Encryption)作为一个简化Java应用程序中数据加密的工具,为开发者提供了一种便捷而灵活的加密解决方案。本文将深入解析Jasypt的工作…

docker 部署教学版本

文章目录 一、docker使用场景及常用命令1)docker使用场景2)rocky8(centos8)安装 docker3)docker 常用命令补充常用命令 二、 单独部署每个镜像,部署spring 应用镜像推荐(2023-12-18)1、 安装使用 mysql1.1 …

STM32的HAL环境搭建

下载 https://www.st.com/en/development-tools/stm32cubemx.html 根据不同平台下载,windows下载window是即可。 安装 解压 下载的是zip文件,进行解压,得到一个exe文件。 安装 得到的exe文件,必须放到一个没有空格&#xff0…

[每周一更]-(第43期):Golang版本的升级历程

从1.13接触go语言开始更新我们公司内第一个Go项目,直至现在go版本已经发展到1.20(20230428),我们从go发版开始认识go语言,有利于我们更深入 了解这门语言,洞悉一些深层方式,加深我们学习的动力&…

nginx源码分析-4

这一章内容讲述nginx的模块化。 ngx_module_t:一个结构体,用于描述nginx中的各个模块,其中包括核心模块、HTTP模块、事件模块等。这个结构体包含了一些模块的关键信息和回调函数,以便nginx在运行时能够正确地加载和管理这些模块。…

3个值得推荐的WPF UI组件库

WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式和模板、动画效果等功能,让开发者可以创建出吸引人且交互性强的应用程序。 HandyControl HandyControl是一套WPF控件库&…

c# 捕获全部线程的异常 试验

1.概要 捕获全部线程的异常 试验,最终结果task的异常没有找到捕获方法 2.代码 2.1.试验1 2.1.1 试验结果 2.2 代码 2.2.1主程序代码 using NLog; using System; using System.Threading; using System.Windows.Forms;namespace 异常监控 {static class Program…

es简单入门

星光下的赶路人star的个人主页 努力努力再努力 文章目录 1、简介2、使用场景3、基本知识4、中文文档和官网链接5、增删改查(php代码)6、基本查询7、HTTP操作7.1 索引操作7.1.1 创建索引 7.2 文档操作7.2.1 创建文档7.2.2 查看文档7.2.3 修改文档7.2.4 修…

机器学习(二) -- 数据预处理(1)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 未完待续…… 目录 系列文章目录 前言 一、概述 二、数据获取 三、数据分布与趋势探查 1、散点图 2、折线图 3、频率分布直…