@@ -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()
|
||||
Reference in New Issue
Block a user