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

全文链接: 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基础编程等领域具有扎实的理论基础和实践经验。她对机器学习、深度学习以及大数据平台搭建等前沿技术有着深入的理解和应用能力。

 

posted @ 2024-08-09 22:29  拓端tecdat  阅读(95)  评论(0)    收藏  举报