重命名 第十三组 为 共享单车数据集分析

This commit is contained in:
又菜又爱玩
2023-07-15 15:11:55 +00:00
committed by Gitee
parent 8710e5428e
commit d0842dbebc
17 changed files with 0 additions and 0 deletions
+134
View File
@@ -0,0 +1,134 @@
import torch
import pandas as pd
import numpy as np
import os
import time
import torch.optim as optim
import matplotlib.pyplot as plt
train_data = pd.read_csv('../train.csv')
test_data = pd.read_csv('../test.csv')
#print(train_data)
datetime=train_data['datetime'].values
season=train_data['season'].values
holiday=train_data['holiday'].values
workingday=train_data['workingday'].values
weather=train_data['weather'].values
temp=train_data['temp'].values
atemp=train_data['atemp'].values
humidity=train_data['humidity'].values
windspeed=train_data['windspeed'].values
casual=train_data['casual'].values
registered=train_data['registered'].values
count=train_data['count'].values
'''
转换datetime,去掉不必要的符号和0
'''
def datetime_convert(datetime):
for i in range(len(datetime)):
datetime[i]=datetime[i].replace("-", "").replace(" ", "").replace(":00:00","")
datetime[i]=int(datetime[i])
return datetime
datetime_convert(datetime)
train_data['datetime']=datetime
datetime_convert(test_data['datetime'].values)
test_data['datetime']=test_data['datetime'].values
'''
标准化数据
'''
def normalize(ndarry):
ndarry=(ndarry-ndarry.mean())/ndarry.std()
return ndarry
for i in range(12):
train_data.iloc[:,i]=normalize(train_data.iloc[:,i])
X=torch.tensor(train_data.iloc[:,:9].to_numpy().astype(float),dtype=torch.float32)
Y=torch.tensor(train_data.iloc[:,9:12].to_numpy().astype(float),dtype=torch.float32)
X_test=torch.tensor(test_data.iloc[:,:9].to_numpy().astype(float),dtype=torch.float32)
torch_train_dataset = torch.utils.data.TensorDataset(X, Y)
batch_size = 10
torch.manual_seed(seed=2023)
training, vertification = torch.utils.data.random_split(torch_train_dataset, [10000, 886], )
training_data = torch.utils.data.DataLoader(training,batch_size=batch_size,shuffle=True)
vertification_data = torch.utils.data.DataLoader(training,batch_size=batch_size,shuffle=True)
feature_number = 9 # 设置特征数目
out_prediction = 3 # 设置输出数目
learning_rate = 0.01 # 设置学习率
epochs = 10 # 设置训练代数
class Net(torch.nn.Module):
def __init__(self, n_feature, n_output, n_neuron1, n_neuron2,
n_layer): # n_feature为特征数目,这个数字不能随便取,n_output为特征对应的输出数目,也不能随便取
self.n_feature = n_feature
self.n_output = n_output
self.n_neuron1 = n_neuron1
self.n_neuron2 = n_neuron2
self.n_layer = n_layer
super(Net, self).__init__()
self.input_layer = torch.nn.Linear(self.n_feature, self.n_neuron1) # 输入层
self.hidden1 = torch.nn.Linear(self.n_neuron1, self.n_neuron2) # 1类隐藏层
self.hidden2 = torch.nn.Linear(self.n_neuron2, self.n_neuron2) # 2类隐藏
self.predict = torch.nn.Linear(self.n_neuron2, self.n_output) # 输出层
def forward(self, x):
'''定义前向传递过程'''
out = self.input_layer(x)
out = torch.relu(out) # 使用relu函数非线性激活
out = self.hidden1(out)
out = torch.relu(out)
for i in range(self.n_layer):
out = self.hidden2(out)
out = torch.relu(out)
out = self.predict( # 回归问题最后一层不需要激活函数
out
) # 除去feature_number与out_prediction不能随便取,隐藏层数与其他神经元数目均可以适当调整以得到最佳预测效果
#print(out.shape)
return out
net = Net(n_feature=feature_number,
n_output=out_prediction,
n_layer=1,
n_neuron1=20,
n_neuron2=20) # 这里直接确定了隐藏层数目以及神经元数目,实际操作中需要遍历
optimizer = optim.Adam(net.parameters(), learning_rate) # 使用Adam算法更新参数
criteon = torch.nn.MSELoss() # 误差计算公式,回归问题采用均方误差
average_losses=[]
for epoch in range(epochs): # 整个数据集迭代次数
net.train() # 启动训练模式
for batch_idx, (data, target) in enumerate(training_data):
logits = net.forward(data) # 前向计算结果(预测结果)
loss = criteon(logits, target) # 计算损失
optimizer.zero_grad() # 梯度清零
loss.backward() # 后向传递过程
optimizer.step() # 优化权重与偏差矩阵
#print(logits)
logit = [] # 这个是验证集,可以根据验证集的结果进行调参,这里根据验证集的结果选取最优的神经网络层数与神经元数目
target = []
net.eval() # 启动测试模式
for data, targets in vertification: # 输出验证集的平均误差
logits = net.forward(data).detach().numpy()
targets = targets.detach().numpy()
target.append(targets[0])
logit.append(logits[0])
average_loss = criteon(torch.tensor(logit), torch.tensor(target))
average_losses.append(average_loss)
print("epoch={},the average loss is {}".format(epoch,average_loss))
Y_test=net.forward(X_test)
print(Y_test)
xx=range(epochs)
yy=average_losses
plt.xlim(0,epochs)
plt.ylim(0,10)
plt.plot(xx,yy)
plt.show()
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,38 @@
#通过历史租车数据并结合天气数据来预测租车需求
### 目录结构
```
|-src
| |-main.py
|-test.csv
|-train.csv
|-readme.md
|-main.ipynb
```
src/main.py为前馈型神经网络对结果的预测
### 数据集字段说明:
datetime:时间
season:季节,1=春,2=夏,3=秋,4=冬
holiday:节假日,0:否,1:是
workingday:工作日,0:否,1:是
weather:天气,1:晴天,2:阴天 ,3:小雨或小雪 ,4:恶劣天气(大雨、冰雹、暴风雨或者大雪)
temp:实际温度,摄氏度
atemp:体感温度,摄氏度
humidity:湿度,相对湿度
windspeed:风速
casual:未注册用户租借数量
registered:注册用户租借数量
count:总租借数量
@@ -0,0 +1,135 @@
import torch
import pandas as pd
import numpy as np
import os
import time
import torch.optim as optim
import matplotlib.pyplot as plt
train_data = pd.read_csv('../train.csv')
test_data = pd.read_csv('../test.csv')
#print(train_data)
datetime=train_data['datetime'].values
season=train_data['season'].values
holiday=train_data['holiday'].values
workingday=train_data['workingday'].values
weather=train_data['weather'].values
temp=train_data['temp'].values
atemp=train_data['atemp'].values
humidity=train_data['humidity'].values
windspeed=train_data['windspeed'].values
casual=train_data['casual'].values
registered=train_data['registered'].values
count=train_data['count'].values
'''
转换datetime,去掉不必要的符号和0
'''
def datetime_convert(datetime):
for i in range(len(datetime)):
datetime[i]=datetime[i].replace("-", "").replace(" ", "").replace(":00:00","")
datetime[i]=int(datetime[i])
return datetime
datetime_convert(datetime)
train_data['datetime']=datetime
datetime_convert(test_data['datetime'].values)
test_data['datetime']=test_data['datetime'].values
'''
标准化数据
'''
def normalize(ndarry):
ndarry=(ndarry-ndarry.mean())/ndarry.std()
return ndarry
for i in range(12):
train_data.iloc[:,i]=normalize(train_data.iloc[:,i])
X=torch.tensor(train_data.iloc[:,:9].to_numpy().astype(float),dtype=torch.float32)
Y=torch.tensor(train_data.iloc[:,9:12].to_numpy().astype(float),dtype=torch.float32)
X_test=torch.tensor(test_data.iloc[:,:9].to_numpy().astype(float),dtype=torch.float32)
torch_train_dataset = torch.utils.data.TensorDataset(X, Y)
batch_size = 10
torch.manual_seed(seed=2023)
training, vertification = torch.utils.data.random_split(torch_train_dataset, [10000, 886], )
training_data = torch.utils.data.DataLoader(training,batch_size=batch_size,shuffle=True)
vertification_data = torch.utils.data.DataLoader(training,batch_size=batch_size,shuffle=True)
feature_number = 9 # 设置特征数目
out_prediction = 3 # 设置输出数目
learning_rate = 0.01 # 设置学习率
epochs = 10 # 设置训练代数
class Net(torch.nn.Module):
def __init__(self, n_feature, n_output, n_neuron1, n_neuron2,
n_layer): # n_feature为特征数目,这个数字不能随便取,n_output为特征对应的输出数目,也不能随便取
self.n_feature = n_feature
self.n_output = n_output
self.n_neuron1 = n_neuron1
self.n_neuron2 = n_neuron2
self.n_layer = n_layer
super(Net, self).__init__()
self.input_layer = torch.nn.Linear(self.n_feature, self.n_neuron1) # 输入层
self.hidden1 = torch.nn.Linear(self.n_neuron1, self.n_neuron2) # 1类隐藏层
self.hidden2 = torch.nn.Linear(self.n_neuron2, self.n_neuron2) # 2类隐藏
self.predict = torch.nn.Linear(self.n_neuron2, self.n_output) # 输出层
def forward(self, x):
'''定义前向传递过程'''
out = self.input_layer(x)
out = torch.relu(out) # 使用relu函数非线性激活
out = self.hidden1(out)
out = torch.relu(out)
for i in range(self.n_layer):
out = self.hidden2(out)
out = torch.relu(out)
out = self.predict( # 回归问题最后一层不需要激活函数
out
) # 除去feature_number与out_prediction不能随便取,隐藏层数与其他神经元数目均可以适当调整以得到最佳预测效果
#print(out.shape)
return out
net = Net(n_feature=feature_number,
n_output=out_prediction,
n_layer=1,
n_neuron1=20,
n_neuron2=20) # 这里直接确定了隐藏层数目以及神经元数目,实际操作中需要遍历
optimizer = optim.Adam(net.parameters(), learning_rate) # 使用Adam算法更新参数
criteon = torch.nn.MSELoss() # 误差计算公式,回归问题采用均方误差
average_losses=[]
for epoch in range(epochs): # 整个数据集迭代次数
net.train() # 启动训练模式
for batch_idx, (data, target) in enumerate(training_data):
logits = net.forward(data) # 前向计算结果(预测结果)
loss = criteon(logits, target) # 计算损失
optimizer.zero_grad() # 梯度清零
loss.backward() # 后向传递过程
optimizer.step() # 优化权重与偏差矩阵
#print(logits)
logit = [] # 这个是验证集,可以根据验证集的结果进行调参,这里根据验证集的结果选取最优的神经网络层数与神经元数目
target = []
net.eval() # 启动测试模式
for data, targets in vertification: # 输出验证集的平均误差
logits = net.forward(data).detach().numpy()
targets = targets.detach().numpy()
target.append(targets[0])
logit.append(logits[0])
average_loss = criteon(torch.tensor(logit), torch.tensor(target))
average_losses.append(average_loss)
print("epoch={},the average loss is {}".format(epoch,average_loss))
Y_test=net.forward(X_test)
print(Y_test)
xx=range(epochs)
yy=average_losses
plt.xlim(0,epochs)
plt.ylim(0,10)
plt.plot(xx,yy)
plt.show()
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
小组成员
刘闻一 应数001班 组长
张怡欣 强基数学001 组员
张妙妙 强基数学001 组员
甘梓鸣 统计001 组员
李泽坤 强基数学002 组员
杨文博 应数001班 组员
薛森垚 信计001 组员