赞
踩
数据集在上一个博客中,若有需要自己取一下,若是过期可私信博主。
在上一个博客当中,我们对于预测温度采用了最基础的方法,从而导致预测结果的不准确性,那这种方法预测出来的结果都是不准确的吗?这个答案是不一定的,预测的结果准确性在于数据集的选取,各种超参数的设置等,并不是我们可以片面决定的。在学习了Pytorch中nn模块之后,我将整体代码进行修改,最终的损失可以稳定在35左右,这对于温度这一不确定因素来说是较为准确的。
-
- input_size = input_data.shape[1]
- hidden_size = 128
- output_size = 1
- batch_size = 16
- my_nn = torch.nn.Sequential(
- torch.nn.Linear(input_size,hidden_size),
- torch.nn.Sigmoid(),
- torch.nn.Linear(hidden_size,output_size),
- )
- cost = torch.nn.MSELoss(reduction='mean')
- optimizer = torch.optim.Adam(my_nn.parameters(),lr = 0.001) #优化器
1. ‘input_size = input_data.shape[1]’: 这里获取了‘input_data’数组的列数,也就是输入数据的特征数量。‘input_size’变量将被用于定义输入层的大小。
2. ’hidden_size = 128‘: 这里设置了隐藏层的大小(神经元数量)。隐藏层是位于输入层和输出层之间的一层神经元,用于提取输入数据的特征。
3. ’output_size = 1‘: 这里设置了输出层的大小。对于回归任务,输出层通常只有一个神经元,用于预测数值。
4. ‘batch_size = 16’: 这里定义了每个批次(batch)中的样本数量。批量训练可以提高训练效率,并且有助于更好地泛化。
5. ‘my_nn = torch.nn.Sequential(...)’: 这里构建了一个Sequential模型,它是一个容器,可以按照顺序添加各种层。这里Sequential模型包含三层:
- 第一层是‘torch.nn.Linear(input_size, hidden_size)’,它是一个线性层(全连接层),将输入数据映射到隐藏层,并且使用Sigmoid激活函数。
- 第二层是‘torch.nn.Sigmoid()’,它是一个激活函数层,用于引入非线性性。
- 第三层是‘torch.nn.Linear(hidden_size, output_size)’,也是一个线性层,将隐藏层的输出映射到输出层。
6. ‘cost = torch.nn.MSELoss(reduction='mean')’: 这里定义了损失函数。MSELoss代表均方误差损失(Mean Squared Error Loss),在回归任务中用于衡量预测值与实际值之间的差异。
7. ‘optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001)’: 这里创建了优化器对象。Adam是一种随机梯度下降优化算法,在训练过程中用于更新神经网络的参数,以最小化损失函数。
这里所设置的各种超参数、优化器、损失函数都进行了解释,请大家仔细阅读
- #开始训练
- losses = [] #给损失值创建一个数组,方便储存,后续可用根据其进行绘图
- for i in range(1000):
- batch_loss = []
- for start in range(0,len(input_data),batch_size):
- end = start + batch_size if start +batch_size < len(input_data) else len(input_data)
- xx = torch.tensor(input_data[start:end], dtype=torch.float,requires_grad=True)
- yy = torch.tensor(labels[start:end], dtype=torch.float, requires_grad=True)
- prediction = my_nn(xx)
- loss = cost(prediction,yy)
- optimizer.zero_grad()
- loss.backward(retain_graph = True)
- optimizer.step()
- batch_loss.append(loss.data.numpy())
- #打印损失
- if i % 100 == 0:
- losses.append(np.mean(batch_loss))
- print(i,np.mean(batch_loss))
接下来就是训练过程,值得注意的是:我们需要将数据转换成Pytorch所用的tensor张量格式
可以看到这时损失达到35左右,可以证明该网络结构较上一节的网络结构得到了很大程度的优化
- x = torch.tensor(input_data,dtype= torch.float)
- predict = my_nn(x).data.numpy()
- # 转换日期格式
- dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
- dates = [datetime.datetime.strptime(date,'%Y-%m-%d') for date in dates ]
- true_data = pd.DataFrame(data = {'date':dates , 'actual':labels})
- months = data[:, data_list.index('month')]
- days = data[:, data_list.index('day')]
- years = data[:, data_list.index('year')]
-
- test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
-
- test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]
-
- predictions_data = pd.DataFrame(data = {'date': test_dates, 'prediction': predict.reshape(-1)})
- plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
- plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
- #真实值
- plt.plot(true_data['date'],true_data['actual'],'b-',label = 'actual')
- #预测值
- plt.plot(predictions_data['date'],predictions_data['prediction'],'ro',label= 'prediction')
- plt.xticks(rotation ="60");
- plt.legend()
- #图名
- plt.xlabel('Date');
- plt.ylabel('Maximum Temperature(华氏度)');
- plt.title('真实值与预测值')
- plt.show()
绘图操作是基本的matplotlib语法,这里不做过多解释,值得注意的是:需要将数据集当中的日期格式进行转化,这里可以参考上述代码,只有这样才可以使得机器认识并且进行学习。
结果如上,可以看到,该预测结果基本可以正确描述出温度的变化曲线,也就证明了此时的预测模型较为可靠!
谢谢观看~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。