全文链接:https://tecdat.cn/?p=37899
原文出处:拓端数据部落公众号
分析师:Xuyan Reng
随着城市化进程的加速,共享单车作为一种绿色、便捷的出行方式,在城市交通中扮演着日益重要的角色。准确预测共享单车的使用量对于优化资源配置、提高运营效率以及满足用户需求具有关键意义。
一方面,共享单车的使用量受到多种因素的影响,如季节、时间、天气状况、节假日等,这些因素使得共享单车使用量呈现出复杂的时间序列特征。另一方面,机器学习和深度学习技术的发展为处理这类时间序列数据提供了强大的工具。通过构建合适的模型并进行有效的参数调整,我们可以挖掘出数据中隐藏的模式和规律,从而实现对共享单车使用量的准确预测。
在本研究中,我们将分别从传统机器学习模型和深度学习模型两个方面进行探索。对于传统机器学习模型,我们通过视频讲解了选择 Lasso、Ridge、XGB 和 RF 四个模型,并通过手动调参和自动调参(包括网格搜索和随机搜索)来优化模型性能的过程。同时,我们还通过代码和数据复现引入了循环神经网络(RNN)及其变体长短时记忆网络(LSTM)和门控循环单元(GRU)等深度学习模型,利用它们在处理时间序列数据方面的优势,进一步提高预测的准确性。
通过对不同模型的训练、调参和评估,我们期望找到最适合共享单车使用量预测的模型和参数设置,为共享单车的运营管理提供准确的预测结果,帮助运营者更好地规划车辆投放、调度等工作,提高用户满意度和运营效率。
视频讲解:机器学习对共享单车使用量预测项目报告
本项目聚焦于共享单车使用数据,旨在通过数据分析和模型构建,预测每个月剩余每天中每个小时的共享单车需求量。通过对多种模型的应用、手动调参以及自动调参,寻求最佳的预测模型和参数设置,以提高预测的准确性。
一、项目背景
共享单车作为一种便捷的出行方式,在全球范围内得到了广泛的应用。本项目主要针对共享单车数据进行分析。尽管共享单车在不同国家和地区的发展情况有所不同,但通过对特定地区数据的深入研究,可以挖掘出有价值的信息,为共享单车的运营和管理提供决策支持。本项目重点分析了共享单车数据。
二、数据来源
本项目的数据记录了在每个月前 19 天每个小时的共享单车使用情况,我们的任务是基于这些数据预测每个月剩下的每天里每个小时的共享单车需求量。
三、研究内容
(一)模型选择
本项目选用了四个模型进行共享单车需求量的预测,分别是 Lasso、Ridge、XGB 和 RF。
(二)参数调整
- 手动调参:在模型训练过程中,需要在欠拟合和过拟合之间进行调试,以找到最优的参数设置。通过不断尝试不同的参数值,观察模型在训练集和测试集上的表现,来确定合适的参数范围。
- 自动调参:
- 网格搜索(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
函数加载共享单车数据集,为后续的分析提供数据基础。
(二)数据预处理
data\['dteday'\] = pd.to\_datetime(data\['dteday'\])data.set\_index('dteday', inplace=True)
将数据集中的 dteday
列转换为日期时间类型,并将其设置为索引,以便进行时间序列分析。
(三)特征选择
features = \['season', 'yr','mnth', 'hr', 'holiday', 'weekday', 'workingday', 'weathersit', 'temp', 'atemp', 'hum', 'windspeed'\]target = 'cnt'
明确与共享单车使用量相关的特征,将 cnt
列确定为预测目标。
(四)数据归一化
scaler = MinMaxScaler()data\[features\] = scaler.fit_transform(data\[features\])
运用 MinMaxScaler
对选定的特征进行归一化处理,使各特征的数值处于相似范围,有助于模型的训练和收敛。
三、数据划分与格式化
(一)数据划分
train\_size = int(len(data) * 0.8)train\_data, test\_data = data\[:train\_size\], data\[train_size:\]
按照 80% 和 20% 的比例将数据集划分为训练集和测试集,用于模型的训练和评估。
(二)时间序列数据格式化
import numpy as npdef create\_dataset(data, time\_step = 1):X, Y = \[\], \[\]for i in range(len(data) - time\_step - 1):X.append(data.iloc\[i:(i + time\_step)\]\[features\].values)Y.append(data.iloc\[i + time\_step\]\[target\])return np.array(X), np.array(Y)time\_step = 24X\_train, y\_train = create\_dataset(train\_data, time\_step)X\_test, y\_test = create\_dataset(test\_data, time\_step)
定义 create_dataset
函数,通过滑动窗口的方式将数据转换为适合时间序列预测的格式。以过去 time_step
(这里设置为 24)个时间步的特征作为输入 X
,下一个时间步的目标值作为输出 Y
。然后,分别使用训练集和测试集生成相应的输入和输出数据。
# 打印训练集和测试集的形状信息print("Shape of X\_train:", X\_train.shape)print("Shape of X\_test:", X\_test.shape)# 计算训练集和测试集的样本数量、时间步长和特征数量num\_samples\_train, time\_steps\_train, num\_features\_train = X\_train.shapenum\_samples\_test, time\_steps\_test, num\_features\_test = X\_test.shape# 验证计算结果expected\_elements\_train = num\_samples\_train * time\_steps\_train * num\_features\_trainexpected\_elements\_test = num\_samples\_test * time\_steps\_test * num\_features\_testprint("Number of samples in X\_train:", num\_samples\_train)print("Number of time steps in X\_train:", time\_steps\_train)print("Number of features in X\_train:", num\_features\_train)print("Number of samples in X\_test:", num\_samples\_test)print("Number of time steps in X\_test:", time\_steps\_test)print("Number of features in X\_test:", num\_features\_test)# 验证元素总数是否符合预期print("Expected total number of elements in X\_train:", expected\_elements\_train)print("Expected total number of elements in X\_test:", expected\_elements\_test)
打印并分析训练集和测试集的形状及相关参数,确保数据的维度符合预期,为后续模型的输入提供准确的信息。
# 调整数据形状X\_train = X\_train.reshape(X\_train.shape\[0\], time\_step, len(features))X\_test = X\_test.reshape(X\_test.shape\[0\], time\_step, len(features))
将训练集和测试集的数据形状调整为 [samples, time steps, features]
,以满足模型的输入要求。
四、模型构建与训练
(一)模型定义
rnn\_model = Sequential()rnn\_model.add(SimpleRNN(50, activation='relu', input\_shape=(time\_step, len(features))))rnn\_model.add(Dense(1))rnn\_model.compile(optimizer='adam', loss='mse')lstm\_model = Sequential()lstm\_model.add(LSTM(50, activation='relu', input\_shape=(time\_step, len(features))))lstm\_model.add(Dense(1))lstm\_model.compile(optimizer='adam', loss='mse')gru\_model = Sequential()gru\_model.add(GRU(50, activation='relu', input\_shape=(time\_step, len(features))))gru\_model.add(Dense(1))gru\_model.compile(optimizer='adam', loss='mse')
分别构建简单循环神经网络(RNN)、长短时记忆网络(LSTM)和门控循环单元(GRU)模型。每个模型都包含一个隐藏层,神经元数量为 50,激活函数为 relu
,输入形状根据时间步长和特征数量确定,输出层为一个神经元,使用均方误差(MSE)作为损失函数,adam
优化器进行优化。
(二)模型训练
rnn\_model.fit(X\_train, y\_train, epochs = 50, batch\_size = 32, validation\_split = 0.2)lstm\_model.fit(X\_train, y\_train, epochs = 50, batch\_size = 32, validation\_split = 0.2)gru\_model.fit(X\_train, y\_train, epochs = 50, batch\_size = 32, validation_split = 0.2)
使用训练集对三个模型进行训练,设置训练轮数为 50,批次大小为 32,并使用 20% 的训练数据作为验证集。通过训练,模型不断调整权重以优化预测性能。
五、模型评估与比较
(一)模型评估指标计算
rnn\_predictions = rnn\_model.predict(X\_test)lstm\_predictions = lstm\_model.predict(X\_test)gru\_predictions = gru\_model.predict(X\_test)rnn\_mse = mean\_squared\_error(y\_test, rnn\_predictions)lstm\_mse = mean\_squared\_error(y\_test, lstm\_predictions)gru\_mse = mean\_squared\_error(y\_test, gru\_predictions)rnn\_mae = mean\_absolute\_error(y\_test, rnn\_predictions)lstm\_mae = mean\_absolute\_error(y\_test, lstm\_predictions)gru\_mae = mean\_absolute\_error(y\_test, gru\_predictions)print(f'RNN MSE: {rnn\_mse}, MAE: {rnn\_mae}')print(f'LSTM MSE: {lstm\_mse}, MAE: {lstm\_mae}')print(f'GRU MSE: {gru\_mse}, MAE: {gru_mae}')
使用测试集对训练好的模型进行预测,并计算均方误差(MSE)和平均绝对误差(MAE)作为评估模型性能的指标。通过这些指标,可以定量地比较不同模型的预测准确性。
(二)模型结果比较与可视化
import matplotlib.pyplot as pltplt.figure(figsize=(12, 6))plt.plot(y\_test, label='实际值')plt.plot(rnn\_predictions, label='RNN 预测值')plt.plot(lstm\_predictions, label='LSTM 预测值')plt.plot(gru\_predictions, label='GRU 预测值')plt.legend()plt.show()
利用 matplotlib
库绘制测试集的真实值与三个模型的预测值曲线,直观地比较不同模型的预测效果。
通过观察曲线的拟合程度,可以定性地评估模型的性能。
结论:通过对 RNN、LSTM 和 GRU 模型的构建、训练和评估,发现 GRU 模型在共享单车使用量预测任务中表现最为出色,其 MSE 和 MAE 值均小于 RNN 和 LSTM 模型。这表明 GRU 模型能够更好地捕捉时间序列数据中的长期依赖关系,为共享单车使用量的预测提供了更准确的结果。在实际应用中,可根据具体需求选择合适的模型进行预测,以提高共享单车运营管理的效率和质量。
关于分析师
在此对 Xuyan Reng 对本文所作的贡献表示诚挚感谢。他毕业于杭州电子科技大学管理科学与工程专业,获硕士学位。他擅长 Python、Mysql、Excel,在运筹学、机器学习、统计学等方面有深入研究。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。