共享单车作为一种新兴的交通方式,近年来受到越来越多城市居民的青睐。为了有效管理共享单车的使用情况,预测其租赁数量是一个重要的研究方向。本文将介绍如何利用深度学习模型如LSTM、BiLSTM、GRU、TCN和Transformer来进行共享单车租赁数据的预测。我们将用相同的数据集展示这几种模型的实现,所有模型仅需修改一行代码即可切换。
数据准备
首先,我们需要准备共享单车的租赁数据。假设我们已有一个包含租赁数量和相关特征(如天气、时间等)的数据集。我们需要对数据进行预处理,包括归一化和划分训练集和测试集。
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
# 读取数据
data = pd.read_csv('bike_sharing_data.csv')
# 数据预处理,选择特征和目标变量
features = data[['temperature', 'humidity', 'windspeed']]
target = data['count']
# 归一化特征
scaler = MinMaxScaler()
features_scaled = scaler.fit_transform(features)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features_scaled, target, test_size=0.2, random_state=42)
模型实现
接下来,我们将实现不同的模型。这里以简化的步骤展示各模型的实现,所有模型的构建方式几乎相同,只是在模型类型上做了调整。
LSTM-KAN
import torch
import torch.nn as nn
class LSTM_KAN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(LSTM_KAN, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, (hn, cn) = self.lstm(x)
return self.fc(hn[-1])
# 使用示例
model = LSTM_KAN(input_size=3, hidden_size=64, output_size=1)
BiLSTM-KAN
class BiLSTM_KAN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(BiLSTM_KAN, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True, bidirectional=True)
self.fc = nn.Linear(hidden_size * 2, output_size)
def forward(self, x):
out, (hn, cn) = self.lstm(x)
return self.fc(hn[-1])
# 使用示例
model = BiLSTM_KAN(input_size=3, hidden_size=64, output_size=1)
GRU-KAN
class GRU_KAN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(GRU_KAN, self).__init__()
self.gru = nn.GRU(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, hn = self.gru(x)
return self.fc(hn[-1])
# 使用示例
model = GRU_KAN(input_size=3, hidden_size=64, output_size=1)
TCN-KAN
from torch import nn
class TCN_KAN(nn.Module):
def __init__(self, input_size, output_size):
super(TCN_KAN, self).__init__()
self.tcn = nn.Conv1d(input_size, output_size, kernel_size=3, padding=1)
def forward(self, x):
x = x.transpose(1, 2) # 转置以适应Conv1d输入
return self.tcn(x)
# 使用示例
model = TCN_KAN(input_size=3, output_size=1)
Transformer-KAN
class Transformer_KAN(nn.Module):
def __init__(self, input_size, output_size):
super(Transformer_KAN, self).__init__()
self.transformer_layer = nn.TransformerEncoderLayer(input_size, nhead=4)
self.fc = nn.Linear(input_size, output_size)
def forward(self, x):
x = self.transformer_layer(x)
return self.fc(x)
# 使用示例
model = Transformer_KAN(input_size=3, output_size=1)
模型训练与评估
模型构建后,我们需要对其进行训练和评估。可以使用常见的损失函数如均方误差损失(MSE)和优化器如Adam进行优化。
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 训练过程
for epoch in range(100):
model.train()
optimizer.zero_grad()
outputs = model(torch.Tensor(X_train).view(-1, 1, 3))
loss = criterion(outputs, torch.Tensor(y_train).view(-1, 1))
loss.backward()
optimizer.step()
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')
总结
通过上述代码,我们展示了如何利用不同的深度学习模型(LSTM、BiLSTM、GRU、TCN、Transformer)来预测共享单车的租赁数量。所有模型的切换仅需修改模型类的实例化代码,可以有效降低实现成本。未来的研究可以在数据集的丰富性、特征工程及模型调优等方面进一步探索,以优化共享单车的租赁预测效果。