地铁站点客流量预测:随机森林极限梯度提升回归器XGBoost

news/2024/11/17 1:56:52/文章来源:https://www.cnblogs.com/tecdat/p/18351613

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

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

分析师:Xinyi He

随着城市化进程的加快,地铁作为城市公共交通的重要组成部分,其客流量管理与预测对于城市交通规划和资源配置具有重要意义。准确的客流量预测不仅有助于提高地铁运营效率,确保乘客安全与舒适,还能为城市交通政策制定和应急响应提供数据支持。本文将通过展示地铁站点客流量预测,并结合一个Python随机森林极限梯度提升回归器XGB实例的代码数据,为读者提供一套完整的实践数据分析流程。

然而,由于地铁系统复杂性以及乘客行为的不确定性,地铁客流量预测一直是一个挑战性的问题。

存在的问题: 

  1. 地铁流量数据量巨大,获取较慢
  2. 在原始数据提取过程中,存在大量的缺失值和异常值的情况,会影响数据的预测的准确性和可靠性。

解决方案

我采用了分层读取数据并采用二分法进行数据的筛选,处理缺失值和异常值的方法有很多种,这里我们采用删除法进行处理和分析

任务/目标

主要是通过郑州市数据,分别提取出每个月各个站点的进站和出站的日客流量,有选择性地从原始数据中抽取地点、日期和交易类型数据,进而根据交易类型统计各个站点进站和出站的日客流量并进行数据汇总。对提取的数据进行可视化分析,目的是分析周末和节假日是否能成为影响日客流量的影响因素,然后对数据进行汇总,采用神经网络回归模型进行预测12月1日-7日客流量的数据

数据源准备

准备从8月到11月的地铁人流量数据(四个csv文件)样本如下:

特征转换

日期。就时间属性本身来说,对模型来说不具有任何意义,需要把日期转变成到年份,月份,日,周伪变量。

数据处理结果预览:

通过用分层读取法并用二分法获取数据,并对异常值处理之后获取到目表数据如下:(只列举部分特征)。分别处理四个月的地铁人流量数据获取如下数据

神经网络预测模型

训练样本的特征输入变量用x表示,输出变量用y表示,测试样本共有5个特征数据,共2440条训练样本。

(1)训练样本构建示例代码如下:

 
  1.  
     
  2.  
    import pandas as pd
  3.  
     
  4.  
    data=pd.read_excel(‘总数据预测.xlsx’)
  5.  
     
  6.  
    x=data.iloc[:,:5] #提取前四列数据
  7.  
     
  8.  
    y=data.iloc[:,5] # 人流量数据
 

(2)预测样本构建示例代码如下:

 
  1.  
    import numpy as py
  2.  
     
  3.  
    x11=np.array([121,14967,12260,20151201,0])
  4.  
     
  5.  
  6.  
     
  7.  
    x207=np.array([159,14132,14167,20151207,0])
  8.  
     
  9.  
    x11=x11.reshape(1,5)
  10.  
     
  11.  
  12.  
     
  13.  
    X207=x207.reshape(1,5)
 

Part 9 9.7 神经网络预测模型

其中预测样本的输入特征变量

用x11,x12…x207表示。

(3)神经网络回归模型构建示例代码如下:

 
  1.  
     
  2.  
    #导入神经网络回归模块MLPRegressor。
  3.  
     
  4.  
    from sklearn.neural_network import MLPRegressor
  5.  
     
  6.  
    #利用MLPRegressor创建神经网络回归对象clf
  7.  
     
  8.  
    Clf=MLPRegressor(solver=’lbfgs’,alpha=1e-5,hidden_layer_sizes=8,random_state=1)
  9.  
     
  10.  
    #参数说明:
  11.  
     
  12.  
    #solver:神经网络优化求解算法
  13.  
     
  14.  
    #alpha:模型训练误差,默认为0.00001
  15.  
     
  16.  
    #hidden_layer_sizes:隐含层神经元个数
  17.  
     
  18.  
    #random_state:默认设置为1 #用clf对象中的fit()方法进行网络训练
  19.  
     
  20.  
    clf.fit(x,y) #调用clf对象中的score()方法,获得神经网络回归的拟合优度(判决系数)
  21.  
     
  22.  
    rv=clf.score(x,y) #调用clf对象中的predict()可以对测试样本进行预测,获得其测试结果
  23.  
     
  24.  
    R11=clf.predict(x11)
  25.  
     
  26.  
    R207=clf. predict (x207)
 

模型优化

1.编写预测方法:

先获取部分预测结果表:

得到方法可行,预测全部站点人流量。

数据可视化结果:

12月1日-12月7日地铁站点日客流量预测结果:

由十二月份一号到七号的预测数据画出的图表观察得出,站点135与137的客流量普遍较高,地铁工作人员应该在人流量多的站点多安排值班人员进行巡逻,维护站点的现场秩序,以免发生人员拥挤和安全事故的发生。特别的,图中12月7号147站点出现不同寻常的高峰客流量,考虑意外因素等情况造成的客流量增多,这一天我们可以提前预警并采取相应的安保措施,保证当天地铁站点的秩序。预测结果仅作为参考一个权重值,还需要专家意见,按照一定的权重来计算

随机森林和极限梯度提升回归器XGB地铁交通流量预测

在本研究中,我们旨在通过自动化机器学习(AutoML)技术优化交通流量预测模型。为此,我们采用了TPOT(Tree-based Pipeline Optimization Tool),这是一个高效的AutoML工具,能够自动设计和优化机器学习管道。

首先,我将加载并查看提供的CSV文件以了解其结构和内容。然后,我将使用折线图来展示24小时的交通流量变化趋势。让我们开始吧。

 
  1.  
    python复制import pandas as pd
  2.  
     
  3.  
    # 加载CSV文件
  4.  
    df = pd.read_csv(file_path)
  5.  
     
  6.  
    # 显示前几行数据以了解其结构
  7.  
    df.head()
 

数据集包含多个字段,其中date_timetraffic_volume是我们关注的主要字段。date_time字段表示日期和时间,而traffic_volume字段表示交通流量。
接下来,我将使用折线图来展示24小时内的交通流量变化趋势。

 
  1.  
    python复制import matplotlib.pyplot as plt
  2.  
     
  3.  
    # 将date_time列转换为datetime类型
  4.  
    df['date_time'] = pd.to_datetime(df['date_time'])
  5.  
     
  6.  
    # 对数据进行排序以确保时间顺序
  7.  
    df = df.sort_values('date_time')
  8.  
     
  9.  
    # 绘制折线图
  10.  
    plt.figure(figsize=(15, 6))
  11.  
    plt.plot(df['date_time'], df['traffic_volume'], marker='o', linestyle='-')
  12.  
    plt.title('24小时内交通流量变化趋势')
  13.  
    plt.xlabel('时间')
  14.  
    plt.ylabel('交通流量')
  15.  
    plt.grid(True)
  16.  
    plt.xticks(rotation=45)
  17.  
    plt.tight_layout()
  18.  
    plt.show()
 

这是一个展示24小时内交通流量变化趋势的折线图。从图中可以看出,交通流量在不同时间段内有所波动。

为了更准确地展示24小时内的交通流量变化趋势,我需要先筛选出特定日期的数据。然后,我将再次绘制折线图。

 
  1.  
    python复制# 筛选出特定日期的数据(例如最早的日期)
  2.  
    specific_date = df['date_time'].dt.date.iloc[0]
  3.  
    df_specific_date = df[df['date_time'].dt.date == specific_date]
  4.  
     
  5.  
    # 对数据进行排序以确保时间顺序
  6.  
    df_specific_date = df_specific_date.sort_values('date_time')
  7.  
     
  8.  
    # 绘制折线图
  9.  
    plt.figure(figsize=(15, 6))
  10.  
    plt.plot(df_specific_date['date_time'], df_specific_date['traffic_volume'], marker='o', linestyle='-')
  11.  
    plt.title(f'{specific_date} 交通流量变化趋势')
  12.  
    plt.xlabel('时间')
  13.  
    plt.ylabel('交通流量')
  14.  
    plt.grid(True)
  15.  
    plt.xticks(rotation=45)
  16.  
    plt.tight_layout()
  17.  
    plt.show()
 


这是一个展示特定日期(最早的日期)内24小时交通流量变化趋势的折线图。从图中可以看出,交通流量在不同时间段内有所波动。

我将按照以下步骤进行操作:

  1. 使用散点图矩阵来探索traffic_volumeweather_maintemprain_1hsnow_1hclouds_all等变量之间的关系。

  2. 使用柱状图或箱线图来比较holiday为“None”与特定假日(如Columbus Day, Veterans Day, Thanksgiving Day)的traffic_volume差异。

首先,我将进行第一步的分析。

 
  1.  
    python复制import seaborn as sns
  2.  
     
  3.  
    # 选择相关的列
  4.  
    columns_to_explore = ['traffic_volume', 'weather_main', 'temp', 'rain_1h', 'snow_1h', 'clouds_all']
  5.  
     
  6.  
    # 由于weather_main是分类变量,我们需要将其转换为数值编码
  7.  
    df['weather_main_code'] = df['weather_main'].astype('category').cat.codes
  8.  
     
  9.  
    # 创建散点图矩阵
  10.  
    sns.pairplot(df[columns_to_explore], diag_kind='kde', markers=["o", "s", "D", "v", "<", ">"])
  11.  
    plt.suptitle('交通流量与天气条件的关系', y=1.02)
  12.  
    plt.show()
 

这是一个散点图矩阵,用于探索traffic_volumeweather_maintemprain_1hsnow_1hclouds_all等变量之间的关系。
接下来,我将进行第二步的分析,即比较holiday为“None”与特定假日(如Columbus Day, Veterans Day, Thanksgiving Day)的traffic_volume差异。

 
  1.  
    python复制# 筛选出特定的假日
  2.  
    specific_holidays = ['Columbus Day', 'Veterans Day', 'Thanksgiving Day']
  3.  
    df_holidays = df[df['holiday'].isin(specific_holidays) | (df['holiday'] == 'None')]
  4.  
     
  5.  
    # 创建箱线图
  6.  
    plt.figure(figsize=(12, 6))
  7.  
    sns.boxplot(x='holiday', y='traffic_volume', data=df_holidays, palette=["rgb(202,206,210, max =255)", "rgb(230,232,234, max =255)"])
  8.  
    plt.title('假日与非假日交通流量对比')
  9.  
    plt.xlabel('假日类型')
  10.  
    plt.ylabel('交通流量')
  11.  
    plt.show()
  12.  
     
  13.  
    python复制# 修正颜色格式并重新创建箱线图
  14.  
    plt.figure(figsize=(12, 6))
  15.  
    sns.boxplot(x='holiday', y='traffic_volume', data=df_holidays, palette=["#C0C4C8", "#E6E8EA"])
  16.  
    plt.title('假日与非假日交通流量对比')
  17.  
    plt.xlabel('假日类型')
  18.  
    plt.ylabel('交通流量')
  19.  
    plt.show()
 

这是一个箱线图,用于比较holiday为“None”与特定假日(如Columbus Day, Veterans Day, Thanksgiving Day)的traffic_volume差异。
从图中可以看出,不同类型的假日和非假日的交通流量有所不同。

以下是我们实验过程的详细描述:

首先,我们对特征集X和目标变量y进行了训练集和测试集的划分,其中测试集占比为25%,并确保了数据的随机性,以避免任何潜在的偏差。具体实现如下:

 
  1.  
    X_train, X_test, y_train, y_test = train_test_split(X,
  2.  
    y,
  3.  
    test_size=0.25,
  4.  
    shuffle=True,
  5.  
    random_state=42)
  6.  
     
  7.  
    tpot = TPOTRegressor(max_time_mins=60,
  8.  
    verbosity=2,
  9.  
    n_jobs=-1)
  10.  
    tpot.fit(X_train,y_train)
  11.  
    tpot.export('metro_traffic.py')
 

接着,我们初始化并训练了一个TPOTRegressor模型,设置最大运行时间为60分钟,以确保模型有足够的时间探索可能的解决方案。此外,我们将verbosity设置为2,以便在训练过程中获得详细的输出,并将n_jobs设置为-1,以利用所有可用的处理器核心。

 

 

在模型训练完成后,我们使用TPOT生成的模型对测试集进行了预测,并通过R²、平均绝对误差(MAE)、均方误差(MSE)和均方根误差(RMSE)等指标对模型性能进行了评估。

 
 
 
  1.  
     
  2.  
    y_predictions = tpot.predict(X_test)
  3.  
    r2 = sklearn.metrics.r2_score(y_test, y_predictions)
  4.  
    mae = sklearn.metrics.mean_absolute_error(y_test, y_predictions)
  5.  
    mse = sklearn.metrics.mean_squared_error(y_test, y_predictions)
  6.  
    rmse = np.sqrt(mse)
 

此外,我们还尝试了其他几种机器学习模型,包括随机森林回归器和极限梯度提升回归器(XGBRegressor),并对其进行了参数调优以优化性能。以下是随机森林回归器的一个示例:

 
 
 
  1.  
    training_features, testing_features, training_target, testing_target = \
  2.  
    train_test_split(features, tpot_data['traffic_volume'].values, random_state=None)
  3.  
     
  4.  
    exported_pipeline = make_pipeline(
  5.  
    StandardScaler(),
  6.  
    RandomForestRegressor(bootstrap=False, max_features=0.45, min_samples_leaf=2, min_samples_split=2, n_estimators=100)
  7.  
    )
 

 
  1.  
    exported_pipeline = RandomForestRegressor(bootstrap=True, max_features=0.9000000000000001, min_samples_leaf=9, min_samples_split=19, n_estimators=100)
  2.  
     
  3.  
    exported_pipeline.fit(training_features, training_target)
  4.  
    results = exported_pipeline.predict(testing_features)
 

 
  1.  
     
  2.  
    features = tpot_data.drop('traffic_volume', axis=1).values
  3.  
    training_features, testing_features, training_target, testing_target = \
  4.  
    train_test_split(features, tpot_data['traffic_volume'].values, random_state=None)
  5.  
     
  6.  
    exported_pipeline = ExtraTreesRegressor(bootstrap=False, max_features=0.8, min_samples_leaf=8, min_samples_split=18, n_estimators=100)
  7.  
     
  8.  
    exported_pipeline.fit(training_features, training_target)
  9.  
    results = exported_pipeline.predict(testing_features)
 

 

我们还尝试了极限梯度提升回归器,并对其进行了参数调整:

 
 
 
  1.  
     
  2.  
    a=tpot_data['traffic_volume'].values
  3.  
     
  4.  
    features = tpot_data.drop('traffic_volume', axis=1).values
  5.  
    training_features, testing_features, training_target, testing_target = \
  6.  
    train_test_split(features, tpot_data['traffic_volume'].values, random_state=None)
  7.  
     
  8.  
    # Average CV score on the training set was:-259017.37025310827
  9.  
    exported_pipeline = XGBRegressor(learning_rate=0.1, max_depth=3, min_child_weight=15, n_estimators=100, nthread=1, subsample=0.6000000000000001,objective = 'reg:squarederror')
  10.  
     
  11.  
    exported_pipeline.fit(training_features, training_target)
  12.  
    results = exported_pipeline.predict(testing_features)
 

在每种情况下,我们都记录了模型在训练集上的平均交叉验证分数,并使用训练好的模型对测试集进行了预测。

通过这些实验,我们能够识别出最适合我们数据集的模型,并对其进行了详细的性能评估。这些结果为我们提供了有价值的见解,有助于进一步优化交通流量预测模型,并为城市规划和交通管理部门提供数据支持。

 

关于分析师

Xinyi He

我们对Xinyi He同学表示诚挚的感谢。她专注于数据科学与大数据技术。Xinyi He在数据分析与数据挖掘、Hadoop大数据平台部署、Spark基础编程等领域具有扎实的理论基础和实践经验。她对机器学习、深度学习以及大数据平台搭建等前沿技术有着深入的理解和应用能力。

 

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

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

相关文章

项目文档管理利器:2024年你必须了解的工具

国内外主流的10款项目文档管理软件对比:PingCode、Worktile、Teambition、Tapd、Tower、Confluence、Notion、Dropbox Paper、Quip、Basecamp。在面对项目管理的复杂性时,选择合适的文档管理工具可以显著提高效率和团队协作。许多团队在文档管理上遭遇混乱和效率低下,尤其是…

做题小结 dp训练4

第一个 我按dp找 结果是个二分 我还想半天 这怎么dp 不过 这题目 也很有意义 首先我一直以为vector的low或者upp下标只能用distance求 现在看来是错的 不要再写auto 迭代器写法 用int就行 减初始指针就行 然后二分的话 思路也很好 先存进去 然后在跑t的时候 先开一个指针 然后对…

Modbus_RTU

本文主要记录串口通信,主要记录 modbus 的默认通信协议 modbus_RTU,当然modbus还包含 modbus_TCP(网口)和 modbus_ASCII(串口)。 一、基础知识 串口和网口串口:串口是一种物理接口,通常用于连接计算机和外部设备,如打印机、鼠标等。它使用一根线缆进行数据传输,常见的…

异步FIFO设计

Asynchronous FIFO Design总结来自Clifford E. Cummings论文 《Simulation and Synthesis Techniques for Asynchronous FIFO Design》一、设计难点使用格雷码计数时空和满的判断。 同步FIFO读写时钟相同,而异步FIFO读写来自不同两个读写时钟,需要考虑跨时钟域设计。二、设计…

常量的基础认知和相互转化

常量:在java程序运行过程中,其值不能够发送改变的量 分类:字面值常量:字符串常量:被双引号括起来的字符序列 "java"字符常量:被单引号括起来的单个字符 a整数常量:所有的整数 100 200 -100小数常量:所有的小数 1.23 3.14 -1.23布尔常量:true false空常…

.NET 窗口/屏幕录制

窗口/屏幕截图适用于截图、批注等工具场景,时时获取窗口/屏幕图像数据流呢,下面讲下视频会议共享桌面、远程桌面这些场景是如何实现画面录制的。 常见的屏幕画面时时采集方案,主要有GDI、WGC、DXGI。 GDI GDI(Graphics Device Interface)就是使用user32下WindowsAPI来实现…

.NET 屏幕录制

窗口/屏幕截图适用于截图、批注等工具场景,时时获取窗口/屏幕图像数据流呢,下面讲下视频会议共享桌面、远程桌面这些场景是如何实现画面录制的。 常见的屏幕画面时时采集方案,主要有GDI、WGC、DXGI。 GDI GDI(Graphics Device Interface)就是使用user32下WindowsAPI来实现…

Kubernetes-POD的QoS

目录背景问题分析进一步排查问题原因Pod的QoS服务质量等级结论 背景 今天开发团队反馈,测试环境中部分业务功能无法正常使用。经过初步排查,发现某个业务Pod在一天内重启了10次,因此需要进一步调查原因。 问题分析 首先,我查看了Pod的日志,发现JVM并未抛出任何错误,服务却…

2024.8.9 鲜花

几张图?推歌:早安大森林 ![](https://baike.baidu.com/pic/%E6%97%A9%E5%AE%89%E5%A4%A7%E6%A3%AE%E6%9E%97/64160919/1/b17eca8065380cd791236bebf51cba345982b2b72b26?fr=lemma&fromModule=lemma_content-image#aid=1&pic=b17eca8065380cd791236bebf51cba345982b2…

赋值运算符和+号的用法(两个练习)

string strName = "kakaxi";string strVillage = "huoyingcun";int iAge = 20;string strEmail = "1287195315@qq.com";decimal deSalary = 2000m;Console.WriteLine("大家好,我叫{0},我今年{1}岁了, 我住在{2},我的邮箱是{3}, 我的工资有足…

中国四大软件外包公司

今天我们来聊聊国内的四大软件外包公司。这些公司不仅在国内市场中占据重要地位,还对全球软件外包行业产生了影响。部分数据来源网络排名,按照职位量、增长速度排名,排名仅供参考,去某家公司一定要多方位参考,比如企查查、脉脉等。要说软件外包这块大蛋糕,谁不想来一口呢…

六、决策树

决策1:如何选择在每个节点上分割什么特征?最大限度地提高纯度(或最小限度地减少不纯)。决策2:什么时候停止拆分?当一个节点是一个单一类时 当拆分一个节点会导致树超过最大的深度 当纯度分数的改进低于一个阈值(获得的信息增益很小小于阈值) 当一个节点中的例子数量低于…