机器学习 | 基于回归模型的交通需求预测案例分析及代码示例
交通需求预测是交通规划和管理的重要方面。准确的需求预测可实现高效的资源分配、改进的服务规划和提高的客户满意度。回归分析是一种建立变量之间关系模型的统计方法,广泛用于预测交通需求。本文探讨了基于回归模型在交通需求预测中的方法、挑战和应用。
了解交通需求预测
交通需求预测是根据历史数据和各种影响因素来估计未来对交通服务的需求。它对于优化公共交通系统中的路线、调度和资源分配至关重要。准确的预测可以节省成本,提高服务质量和更好的基础设施规划。
影响交通需求的主要因素
影响交通需求的因素有几个,其中包括:
-
经济指标:以国内生产总值或地区产出衡量的经济增长对交通需求有重大影响。经济衰退可以减少需求,而增长可以增加需求。
-
人口因素:人口规模、年龄分布和城市化水平影响交通需求。人口密度高的城市地区通常公共交通使用率较高。
-
交通基础设施:交通基础设施的可用性和质量,如公路,铁路和公共交通系统,影响需求。改善基础设施可以通过提供更好的服务质量来吸引需求。
-
技术进步:交通技术的创新,如智能交通系统,可以通过提高服务效率和可靠性来影响需求。
-
社会和文化因素:文化事件,假期和社会行为影响交通模式。例如,高峰出行时间往往与节假日或重大活动相吻合。
回归分析在交通需求预测中的作用
回归分析是一种强大的统计工具,用于模拟和理解因变量(在这种情况下,通过销售座位数衡量的交通需求)与一个或多个自变量(如旅行日期,旅行时间,出发地,目的地,车辆类型等)之间的关系。
它使交通规划者和数据科学家能够识别历史数据中的模式,并使用这些模式来预测未来的需求。
为什么是回归分析?
交通需求预测中回归分析的必要性源于其以下能力:
- 量化关系:回归有助于量化交通需求与各种影响因素(如旅行时间、路线、支付方式和车辆类型)之间的关系。
- 捕获趋势:它可以识别历史数据中的趋势和模式,例如高峰出行时间、热门路线或假期和周末对需求的影响。
- 提供预测能力:通过建立将需求与关键变量联系起来的数学模型,回归分析可以准确预测未来的交通需求。
- 模型复杂性:在简单的情况下,线性回归就足够了。然而,交通需求往往受到变量之间非线性关系的影响(例如,高峰时段对需求的影响可能不会线性增加)。这就是更高级的回归模型,如随机森林,梯度提升或XGBoost变得有用的地方。这些模型捕捉了特征之间更复杂的交互。
回归模型在交通需求预测中的应用
为了建立一个实用的交通需求预测模型,我们将遵循一个结构化的方法。
问题陈述
目标是使用XX历史数据预测特定路线、日期和时间每次乘车的售出座位数量。这一预测将有助于优化XX内公共交通的资源配置和改善服务规划。
模型的方法
数据集包括 ride_id、seat_number、payment_method、travel_date、travel_time、travel_from、travel_to、car_type 和 max_capacity 等变量。我们的目标是使用这些功能来预测已售出的座位数 (seat_number)。
构建模型的步骤:
-
数据预处理:
特征工程:创建新特征,例如星期几、小时或日期是周末还是假日。
处理分类变量:使用独热编码或标签编码将分类变量(如payment_method、travel_from、travel_to和car_type)转换为数值表示。
处理日期:从travel_date和travel_time中提取有用的信息(例如,日、月、小时)。
规范化/标准化:标准化max_capacity等特性,以提高模型性能。 -
建模:
训练-测试拆分:将数据拆分为训练集和测试集,以评估模型性能。
模型选择:从简单的回归模型(如线性回归)开始,然后探索更复杂的模型(如随机森林,梯度提升或XGBoost)以捕获非线性关系。 -
模型评估:使用适当的指标评估模型的性能。
具体代码及实现步骤示例
步骤1:导入必要库及数据加载
让我们创建一个合成数据集,该数据集类似于用于预测每次乘坐的座位数量的结构。该数据集将包括ride_id、seat_number、payment_method、travel_date、travel_time、travel_from、travel_to、car_type和max_capacity等特征。
import numpy as np
import pandas as pd
from datetime import timedelta, datetime# Set random seed for reproducibility
np.random.seed(42)# Parameters
n_samples = 10000 # Number of rides
locations = ['Location_A', 'Location_B', 'Location_C', 'Location_D', 'Location_E']
car_types = ['bus', 'minibus', 'van']
payment_methods = ['cash', 'mobile_payment', 'card']
start_date = datetime(2024, 1, 1)# Generate data
ride_ids = np.arange(1, n_samples + 1)
travel_dates = [start_date + timedelta(days=np.random.randint(0, 365)) for _ in range(n_samples)]
travel_times = [datetime(2024, 1, 1, np.random.randint(0, 24), np.random.randint(0, 60)).time() for _ in range(n_samples)]
travel_from = np.random.choice(locations, n_samples)
travel_to = np.random.choice(locations, n_samples)
car_type = np.random.choice(car_types, n_samples)
max_capacity = np.random.choice([14, 30, 50], n_samples)
payment_method = np.random.choice(payment_methods, n_samples)# Calculate seat_number based on some logic
# Example logic: Bus type, capacity, time of day, and payment method affect seat_number
seat_number = (np.random.poisson(lam=10, size=n_samples) + (max_capacity / 2).astype(int) + np.random.randint(0, 5, n_samples)- (np.array([t.hour for t in travel_times]) // 3)+ (payment_method == 'mobile_payment').astype(int) * 5).clip(1, max_capacity) # Ensure seat_number is between 1 and max_capacity# Create the DataFrame
data = pd.DataFrame({'ride_id': ride_ids,'travel_date': travel_dates,'travel_time': travel_times,'travel_from': travel_from,'travel_to': travel_to,'car_type': car_type,'max_capacity': max_capacity,'payment_method': payment_method,'seat_number': seat_number
})data.to_csv("train_revised.csv", index=False)
data.head()
输出
ride_id travel_date travel_time travel_from travel_to car_type max_capacity payment_method seat_number
0 1 2024-04-12 17:29:00 Location_E Location_E van 50 cash 38
1 2 2024-12-14 11:47:00 Location_E Location_D bus 30 mobile_payment 27
2 3 2024-09-27 04:19:00 Location_B Location_B van 14 card 14
3 4 2024-04-16 11:20:00 Location_E Location_D bus 30 cash 28
4 5 2024-03-12 10:08:00 Location_A Location_E minibus 50 cash 36
步骤2:数据处理(特征工程)
# Feature Engineering
data['travel_date'] = pd.to_datetime(data['travel_date'])
data['day_of_week'] = data['travel_date'].dt.dayofweek
data['month'] = data['travel_date'].dt.month
data['hour'] = pd.to_datetime(data['travel_time']).dt.hour# Drop irrelevant columns
X = data.drop(columns=['ride_id', 'seat_number', 'travel_date', 'travel_time'])
y = data['seat_number']# Handling Categorical Variables and Scaling
categorical_features = ['payment_method', 'travel_from', 'travel_to', 'car_type']
numerical_features = ['max_capacity', 'day_of_week', 'month', 'hour']categorical_transformer = OneHotEncoder(drop='first')
numerical_transformer = StandardScaler()preprocessor = ColumnTransformer(transformers=[('num', numerical_transformer, numerical_features),('cat', categorical_transformer, categorical_features),]
)
步骤3:构建模型
这里,使用了一个随机森林模型,也可自行选择其他模型测试。
# Train-Test Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# Pipeline for the model
pipeline = Pipeline(steps=[('preprocessor', preprocessor),('model', RandomForestRegressor(random_state=42))
])
pipeline.fit(X_train, y_train)
步骤4:模型的预测和评估
# Predict on the test set
y_pred = pipeline.predict(X_test)# Evaluate the model
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print(f"Mean Squared Error (MSE): {mse}")
print(f"R-squared (R²): {r2}")
输出
Mean Squared Error (MSE): 8.306493985761055
R-squared (R²): 0.9101232043264215
回归分析在模型中的应用
在模型构建中,将回归分析应用于票务数据集,以预测特定设施的座位销售数量。以下是回归分析如何发挥核心作用:
- 识别关键变量:回归分析有助于确定哪些特征(例如,旅行时间、路线、车辆类型)最强烈地影响售出的座位数量。例如,从高需求位置或特定旅行时间(例如,早上高峰时间)可能更有可能有更多的座位出售。
- 建模需求模式:使用回归技术,您的模型可以从历史数据中学习需求模式,这些数据可能包括每日、每周或季节性趋势。例如,需求可能会在周末或假期上升,回归模型可以通过结合基于时间的特征来捕获。
- 预测未来需求:一旦模型经过训练,它就可以根据日期、时间和路线等已知因素预测未来设施的座位数量。这些预测使交通公司能够通过在高需求路线上安排额外的车辆或调整时间表以匹配预测的需求来有效地分配资源。
- 评估模型性能:可以使用均方误差(MSE)和R平方(R²)得分等指标来评估回归模型。这些指标有助于评估模型与数据的拟合程度以及预测需求的准确性。在模型中,0.91的R平方表示回归模型解释了售出座位数的91%的方差,这非常适合预测交通需求。
总结
交通需求预测是优化交通规划和资源管理的重要工具。通过回归分析,预测模型可以利用历史数据和关键影响因素准确预测未来需求。通过采用结构化的方法进行数据预处理、特征工程和模型选择,交通规划人员可以提高服务质量,提高运营效率,更好地满足乘客需求。