【视频讲解】共享单车使用量预测:RNN, LSTM,GRU循环神经网络和传统机器学习

news/2024/10/19 0:25:08/文章来源:https://www.cnblogs.com/tecdat/p/18473013

全文链接:https://tecdat.cn/?p=37899

原文出处:拓端数据部落公众号

分析师:Xuyan Reng 

随着城市化进程的加速,共享单车作为一种绿色、便捷的出行方式,在城市交通中扮演着日益重要的角色。准确预测共享单车的使用量对于优化资源配置、提高运营效率以及满足用户需求具有关键意义。

一方面,共享单车的使用量受到多种因素的影响,如季节、时间、天气状况、节假日等,这些因素使得共享单车使用量呈现出复杂的时间序列特征。另一方面,机器学习和深度学习技术的发展为处理这类时间序列数据提供了强大的工具。通过构建合适的模型并进行有效的参数调整,我们可以挖掘出数据中隐藏的模式和规律,从而实现对共享单车使用量的准确预测。

在本研究中,我们将分别从传统机器学习模型和深度学习模型两个方面进行探索。对于传统机器学习模型,我们通过视频讲解了选择 Lasso、Ridge、XGB 和 RF 四个模型,并通过手动调参和自动调参(包括网格搜索和随机搜索)来优化模型性能的过程。同时,我们还通过代码和数据复现引入了循环神经网络(RNN)及其变体长短时记忆网络(LSTM)和门控循环单元(GRU)等深度学习模型,利用它们在处理时间序列数据方面的优势,进一步提高预测的准确性。

通过对不同模型的训练、调参和评估,我们期望找到最适合共享单车使用量预测的模型和参数设置,为共享单车的运营管理提供准确的预测结果,帮助运营者更好地规划车辆投放、调度等工作,提高用户满意度和运营效率。

视频讲解:机器学习对共享单车使用量预测项目报告

本项目聚焦于共享单车使用数据,旨在通过数据分析和模型构建,预测每个月剩余每天中每个小时的共享单车需求量。通过对多种模型的应用、手动调参以及自动调参,寻求最佳的预测模型和参数设置,以提高预测的准确性。

一、项目背景

共享单车作为一种便捷的出行方式,在全球范围内得到了广泛的应用。本项目主要针对共享单车数据进行分析。尽管共享单车在不同国家和地区的发展情况有所不同,但通过对特定地区数据的深入研究,可以挖掘出有价值的信息,为共享单车的运营和管理提供决策支持。本项目重点分析了共享单车数据。

二、数据来源

本项目的数据记录了在每个月前 19 天每个小时的共享单车使用情况,我们的任务是基于这些数据预测每个月剩下的每天里每个小时的共享单车需求量。

三、研究内容

(一)模型选择

本项目选用了四个模型进行共享单车需求量的预测,分别是 Lasso、Ridge、XGB 和 RF。

(二)参数调整

  1. 手动调参:在模型训练过程中,需要在欠拟合和过拟合之间进行调试,以找到最优的参数设置。通过不断尝试不同的参数值,观察模型在训练集和测试集上的表现,来确定合适的参数范围。
  2. 自动调参
    • 网格搜索(Grid Search):对于一些关键参数,我们采用网格搜索的方法进行自动调参。例如,对于某个参数,我们设定搜索范围为 [0, 2, 4, 6, 8],通过遍历这些参数值,找到使模型性能最优的参数组合。
    • 随机搜索(Random Search):除了网格搜索,我们还使用了随机搜索的方法。对于一组参数,我们设定搜索范围为 [1.3, 6.5, 3.2, 7.5, 0.1],通过随机抽取这些参数值进行组合,来寻找最优的参数设置。我们使用了 gridsearchcv 包来实现自动调参功能,它可以方便地对不同的参数组合进行评估和比较,从而提高调参的效率和准确性。

(三)评估指标

本项目采用均方根误差(RMSLE)作为模型评估的指标。均方根误差的计算公式为:

通过计算均方根误差,我们可以定量地评估模型的预测性能,误差越小,说明模型的预测效果越好。

通过对不同模型的训练、调参和评估,我们期望找到最适合共享单车需求量预测的模型和参数设置,为共享单车的运营管理提供准确的预测结果,帮助运营者更好地规划车辆投放、调度等工作,提高用户满意度和运营效率。


 

基于循环神经网络的共享单车使用量预测|附数据代码

摘要:本论文聚焦于利用循环神经网络(RNN)及其变体长短时记忆网络(LSTM)和门控循环单元(GRU)对共享单车使用量进行预测。通过对数据集的深入处理、模型构建与训练,以及对模型性能的评估与比较,得出了具有实际应用价值的结论。

一、引言

在当今城市交通体系中,共享单车作为一种便捷的出行方式,其使用量的准确预测对于优化资源配置和提升运营效率具有重要意义。循环神经网络及其变体在处理时间序列数据方面展现出了卓越的能力,为共享单车使用量的预测提供了有效的方法。

二、数据准备与预处理

(一)数据加载

data = pd.read_csv('g - dataset/hour.csv')

使用 pandas 库的 read_csv 函数加载共享单车数据集,为后续的分析提供数据基础。

(二)数据预处理

 
  1.  
    data['dteday'] = pd.to_datetime(data['dteday'])
  2.  
    data.set_index('dteday', inplace=True)
 

将数据集中的 dteday 列转换为日期时间类型,并将其设置为索引,以便进行时间序列分析。

(三)特征选择

 
  1.  
    features = ['season', 'yr','mnth', 'hr', 'holiday', 'weekday', 'workingday', 'weathersit', 'temp', 'atemp', 'hum', 'windspeed']
  2.  
    target = 'cnt'
 

明确与共享单车使用量相关的特征,将 cnt 列确定为预测目标。

(四)数据归一化

 
  1.  
    scaler = MinMaxScaler()
  2.  
    data[features] = scaler.fit_transform(data[features])
 

运用 MinMaxScaler 对选定的特征进行归一化处理,使各特征的数值处于相似范围,有助于模型的训练和收敛。

三、数据划分与格式化

(一)数据划分

 
  1.  
    train_size = int(len(data) * 0.8)
  2.  
    train_data, test_data = data[:train_size], data[train_size:]
 

按照 80% 和 20% 的比例将数据集划分为训练集和测试集,用于模型的训练和评估。

(二)时间序列数据格式化

 
  1.  
    import numpy as np
  2.  
     
  3.  
    def create_dataset(data, time_step = 1):
  4.  
    X, Y = [], []
  5.  
    for i in range(len(data) - time_step - 1):
  6.  
    X.append(data.iloc[i:(i + time_step)][features].values)
  7.  
    Y.append(data.iloc[i + time_step][target])
  8.  
    return np.array(X), np.array(Y)
  9.  
     
  10.  
    time_step = 24
  11.  
    X_train, y_train = create_dataset(train_data, time_step)
  12.  
    X_test, y_test = create_dataset(test_data, time_step)
 

定义 create_dataset 函数,通过滑动窗口的方式将数据转换为适合时间序列预测的格式。以过去 time_step(这里设置为 24)个时间步的特征作为输入 X,下一个时间步的目标值作为输出 Y。然后,分别使用训练集和测试集生成相应的输入和输出数据。

 
  1.  
    # 打印训练集和测试集的形状信息
  2.  
    print("Shape of X_train:", X_train.shape)
  3.  
    print("Shape of X_test:", X_test.shape)
  4.  
     
  5.  
    # 计算训练集和测试集的样本数量、时间步长和特征数量
  6.  
    num_samples_train, time_steps_train, num_features_train = X_train.shape
  7.  
    num_samples_test, time_steps_test, num_features_test = X_test.shape
  8.  
     
  9.  
    # 验证计算结果
  10.  
    expected_elements_train = num_samples_train * time_steps_train * num_features_train
  11.  
    expected_elements_test = num_samples_test * time_steps_test * num_features_test
  12.  
     
  13.  
    print("Number of samples in X_train:", num_samples_train)
  14.  
    print("Number of time steps in X_train:", time_steps_train)
  15.  
    print("Number of features in X_train:", num_features_train)
  16.  
    print("Number of samples in X_test:", num_samples_test)
  17.  
    print("Number of time steps in X_test:", time_steps_test)
  18.  
    print("Number of features in X_test:", num_features_test)
  19.  
     
  20.  
    # 验证元素总数是否符合预期
  21.  
    print("Expected total number of elements in X_train:", expected_elements_train)
  22.  
    print("Expected total number of elements in X_test:", expected_elements_test)
 

打印并分析训练集和测试集的形状及相关参数,确保数据的维度符合预期,为后续模型的输入提供准确的信息。

 
  1.  
    # 调整数据形状
  2.  
    X_train = X_train.reshape(X_train.shape[0], time_step, len(features))
  3.  
    X_test = X_test.reshape(X_test.shape[0], time_step, len(features))
 

将训练集和测试集的数据形状调整为 [samples, time steps, features],以满足模型的输入要求。

四、模型构建与训练

(一)模型定义

 
  1.  
    rnn_model = Sequential()
  2.  
    rnn_model.add(SimpleRNN(50, activation='relu', input_shape=(time_step, len(features))))
  3.  
    rnn_model.add(Dense(1))
  4.  
    rnn_model.compile(optimizer='adam', loss='mse')
  5.  
     
  6.  
    lstm_model = Sequential()
  7.  
    lstm_model.add(LSTM(50, activation='relu', input_shape=(time_step, len(features))))
  8.  
    lstm_model.add(Dense(1))
  9.  
    lstm_model.compile(optimizer='adam', loss='mse')
  10.  
     
  11.  
    gru_model = Sequential()
  12.  
    gru_model.add(GRU(50, activation='relu', input_shape=(time_step, len(features))))
  13.  
    gru_model.add(Dense(1))
  14.  
    gru_model.compile(optimizer='adam', loss='mse')
 

分别构建简单循环神经网络(RNN)、长短时记忆网络(LSTM)和门控循环单元(GRU)模型。每个模型都包含一个隐藏层,神经元数量为 50,激活函数为 relu,输入形状根据时间步长和特征数量确定,输出层为一个神经元,使用均方误差(MSE)作为损失函数,adam 优化器进行优化。

(二)模型训练

 
  1.  
    rnn_model.fit(X_train, y_train, epochs = 50, batch_size = 32, validation_split = 0.2)
  2.  
    lstm_model.fit(X_train, y_train, epochs = 50, batch_size = 32, validation_split = 0.2)
  3.  
    gru_model.fit(X_train, y_train, epochs = 50, batch_size = 32, validation_split = 0.2)
 

使用训练集对三个模型进行训练,设置训练轮数为 50,批次大小为 32,并使用 20% 的训练数据作为验证集。通过训练,模型不断调整权重以优化预测性能。

 

五、模型评估与比较

(一)模型评估指标计算

 
  1.  
    rnn_predictions = rnn_model.predict(X_test)
  2.  
    lstm_predictions = lstm_model.predict(X_test)
  3.  
    gru_predictions = gru_model.predict(X_test)
  4.  
     
  5.  
    rnn_mse = mean_squared_error(y_test, rnn_predictions)
  6.  
    lstm_mse = mean_squared_error(y_test, lstm_predictions)
  7.  
    gru_mse = mean_squared_error(y_test, gru_predictions)
  8.  
     
  9.  
    rnn_mae = mean_absolute_error(y_test, rnn_predictions)
  10.  
    lstm_mae = mean_absolute_error(y_test, lstm_predictions)
  11.  
    gru_mae = mean_absolute_error(y_test, gru_predictions)
  12.  
    print(f'RNN MSE: {rnn_mse}, MAE: {rnn_mae}')
  13.  
    print(f'LSTM MSE: {lstm_mse}, MAE: {lstm_mae}')
  14.  
    print(f'GRU MSE: {gru_mse}, MAE: {gru_mae}')
 

使用测试集对训练好的模型进行预测,并计算均方误差(MSE)和平均绝对误差(MAE)作为评估模型性能的指标。通过这些指标,可以定量地比较不同模型的预测准确性。

(二)模型结果比较与可视化

 
  1.  
    import matplotlib.pyplot as plt
  2.  
     
  3.  
    plt.figure(figsize=(12, 6))
  4.  
    plt.plot(y_test, label='实际值')
  5.  
    plt.plot(rnn_predictions, label='RNN 预测值')
  6.  
    plt.plot(lstm_predictions, label='LSTM 预测值')
  7.  
    plt.plot(gru_predictions, label='GRU 预测值')
  8.  
    plt.legend()
  9.  
    plt.show()
 

利用 matplotlib 库绘制测试集的真实值与三个模型的预测值曲线,直观地比较不同模型的预测效果。

通过观察曲线的拟合程度,可以定性地评估模型的性能。

结论:通过对 RNN、LSTM 和 GRU 模型的构建、训练和评估,发现 GRU 模型在共享单车使用量预测任务中表现最为出色,其 MSE 和 MAE 值均小于 RNN 和 LSTM 模型。这表明 GRU 模型能够更好地捕捉时间序列数据中的长期依赖关系,为共享单车使用量的预测提供了更准确的结果。在实际应用中,可根据具体需求选择合适的模型进行预测,以提高共享单车运营管理的效率和质量。

关于分析师

 

在此对 Xuyan Reng 对本文所作的贡献表示诚挚感谢。他毕业于杭州电子科技大学管理科学与工程专业,获硕士学位。他擅长 Python、Mysql、Excel,在运筹学、机器学习、统计学等方面有深入研究。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后台_Eclise配置环境与导入工程

1、配置环境1.1 配置Gradle其中【仓库位置】是你自己创建的,位置可以任意; 【Java_Home】的路径可以在系统根目录下的【.zshrc】查看或【配置】1.2 配置Java版本2、导入工程2.1 选择【文件】-> 【导入】2.2 选择【Gradle】项目2.3 选择工程存放的位置2.4 刷新Gradle项目导…

解决移动端项目在PC端打开后宽度占满屏幕的问题

问题描述 移动端的项目在PC端打开后,对于带有固定定位的元素,宽度沾满的整个视窗的宽度。即使body,html限制了最大宽度 <body><div class="box"></div> </body><style>body{max-width: 500px;margin: 0;background: #aaa;height: 1…

20241016下午

P1040 启发式图染色问题(color) 我们可以先想一棵树的情况,如下图所示但是显然这个节点数量是 \(2 ^ k\),我们可以考虑二分图,然后你推着推着就会发现一个建图方案具体来说,我们可以现在左边创建一个颜色为 \(1\) 的结点,然后我们想让颜色数量尽量多,我们直接在右边创建一个颜…

数据采集与融合第二次作业

码云仓库地址 https://gitee.com/sun-jiahui22/crawl_project作业1仓库地址 https://gitee.com/sun-jiahui22/crawl_project/tree/master/作业2/实验2.1作业2的仓库地址 https://gitee.com/sun-jiahui22/crawl_project/tree/master/作业2/实验2.2作业3的仓库地址 https://gitee…

IntelliJ IDEA 2024 安装使用 (附加激活码、补丁,亲测有效!)

第一步:下载 IDEA 安装包 访问 IDEA 官网,下载 IDEA 2024.1.4 版本的安装包,下载链接如下 : idea官方链接也可以在这里点击下载idea下载idea 第二步: 安装 IDEA点击xx 关掉程序! 第三步: 下载补丁 下载地址(里面包含激活码)https://pan.quark.cn/s/9dbfe698c064 补丁下载成…

PYNQ z2 使用xadcps读取xadc内部电压温度

使用xadcps只能和JTAG一样读取温度值和电压值,属于内部通道,读取不了外部通道的数据 添加zynq700核后进行配置 1.在PS-PL Configuration中, 取消勾选general里面的FCLK_RSTEN_N以及M_AXI_GP0_Interface2.在Peripheral IO Pins中勾选14 15对应的UART0, 同时对板卡电压进行配置,B…

控制结构

任何复杂的结构化程序都是由三种基本结构组成:顺序结构,分支结构、循环结构。 分支结构 单分支。if 双分支。if else 多分支。else if else if多分支 switch多分支 else if 于 switch多分支的区别循环结构 for循环 while循环 do while循环 for、while与do ... while语句的比较…

JAVA基础知识补漏

变量类型 1.类变量:static 2.实例变量:需要new 3.局部变量:必须初始化 常量 final 一般用大写表示 命名规范 所有变量、方法、类名:见名知意 类成员变量:首字母小写和驼峰原则:monthSalary 局部变量:首字母小写和驼峰原则 常量:大写字母和下划线:MAX_VALUE 类名:首字母大写和…

《恋与深空》游戏拆解

游戏背景与世界观《恋与深空》是一款女性向3D手游,设定在未来的科幻世界。玩家与多名男性角色互动,通过一系列科幻冒险推动剧情发展。角色设定与互动机制玩家可以与多个男性角色展开深度互动,每个角色不仅有鲜明的个性和背景故事,还伴随着成长线的发展。角色的互动不仅仅是…

CSP2024 前集训:多校A层冲刺NOIP2024模拟赛08

前言光顾着想 T2 了,但是不知道哪儿假了,只有 \(\dfrac{n}{k}\le 5\) 的点是对的,然后居然只有二十分,发现数据放错了,找喵喵改了成五十了。 然后 T1 因为重边挂没了。 T3 没调出来,确切的说是省的时间不多了打不完,就写了个部分分。 T4 咕了。 机房凳子没靠椅,一直坐着…

信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分求最小

PDF文档公众号回复关键字:202410171 P8814 [CSP-J 2022] 解密 [题目描述] 给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni,ei,di,求两个正整数 pi,qi,使 ni=piqi、eidi=(pi−1)(qi−1)+1 [输入格式] 第一行一个正整数 k,表示有 k 次询问。 接下来 k 行,第 i 行三个…

ollydbg逆向基础

实验目的 理解编译过程和调试信息,了解debug模式和release模式的exe进行逆向分析的过程。尝试多种方法找到main函数。实验环境系统:Windows 11软件:VS、ollydbg实验代码#include <stdio.h>int main() { printf("hello maqun"); return 0;}实验过程查找代…