当前位置:   article > 正文

深度学习:回归任务的学习笔记_深度学习回归任务

深度学习回归任务

前言:回归任务是神经网络的一个重要的任务,通俗的讲,回归任务就是给你一系列的输入,然后预测出输出的任务,比如预测气温,预测股票等等,都是回归任务。

下面还是直接看代码,根据代码来学习回归任务

第一步:处理输入数据

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import torch
  5. import torch.optim as optim
  6. import warnings

打印看一下数据的样子

  1. features = pd.read_csv('temps.csv')
  2. #看看数据长什么样子
  3. features.head()

actual为标签,其余的均为输入

print('数据维度:', features.shape)

打印以下数据的形状:(348,9)

将输入数据可视化

  1. # 准备画图
  2. # 指定默认风格
  3. plt.style.use('fivethirtyeight')
  4. # 设置布局
  5. fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize = (10,10))
  6. fig.autofmt_xdate(rotation = 45)
  7. # 标签值
  8. ax1.plot(dates, features['actual'])
  9. ax1.set_xlabel(''); ax1.set_ylabel('Temperature'); ax1.set_title('Max Temp')
  10. # 昨天
  11. ax2.plot(dates, features['temp_1'])
  12. ax2.set_xlabel(''); ax2.set_ylabel('Temperature'); ax2.set_title('Previous Max Temp')
  13. # 前天
  14. ax3.plot(dates, features['temp_2'])
  15. ax3.set_xlabel('Date'); ax3.set_ylabel('Temperature'); ax3.set_title('Two Days Prior Max Temp')
  16. ax4.plot(dates, features['friend'])
  17. ax4.set_xlabel('Date'); ax4.set_ylabel('Temperature'); ax4.set_title('Friend Estimate')
  18. plt.tight_layout(pad=2)

结果为:

 然后把星期几转化为独热编码的格式,独热编码就是不重复样本数,将所有样本按照0或者1进行编码,如:0000001代表星期日

  1. features = pd.get_dummies(features)
  2. features.head(5)

最后编码后的结果为:

将数据处理成特征和标签的形式:

  1. # 标签
  2. labels = np.array(features['actual'])
  3. # 在特征中去掉标签
  4. features= features.drop('actual', axis = 1)
  5. # 名字单独保存一下,以备后患
  6. feature_list = list(features.columns)
  7. # 转换成合适的格式
  8. features = np.array(features)
  9. features.shape
  10. labels.shape

 最后得到的特征为(348,14),标签为(348,)

第二步:构建网络模型

  1. x = torch.tensor(input_features, dtype = float)
  2. y = torch.tensor(labels, dtype = float)
  3. # 权重参数初始化
  4. weights = torch.randn((14, 128), dtype = float, requires_grad = True)
  5. biases = torch.randn(128, dtype = float, requires_grad = True)
  6. weights2 = torch.randn((128, 1), dtype = float, requires_grad = True)
  7. biases2 = torch.randn(1, dtype = float, requires_grad = True)
  8. learning_rate = 0.001
  9. losses = []
  10. for i in range(1000):
  11. # 计算隐层
  12. hidden = x.mm(weights) + biases
  13. # 加入激活函数
  14. hidden = torch.relu(hidden)
  15. # 预测结果
  16. predictions = hidden.mm(weights2) + biases2
  17. # 通计算损失
  18. loss = torch.mean((predictions - y) ** 2)
  19. losses.append(loss.data.numpy())
  20. # 打印损失值
  21. if i % 100 == 0:
  22. print('loss:', loss)
  23. #返向传播计算
  24. loss.backward()
  25. #更新参数
  26. weights.data.add_(- learning_rate * weights.grad.data)
  27. biases.data.add_(- learning_rate * biases.grad.data)
  28. weights2.data.add_(- learning_rate * weights2.grad.data)
  29. biases2.data.add_(- learning_rate * biases2.grad.data)
  30. # 每次迭代都得记得清空
  31. weights.grad.data.zero_()
  32. biases.grad.data.zero_()
  33. weights2.grad.data.zero_()
  34. biases2.grad.data.zero_()

上面的网络模型的构建是具体的过程,有助于理解,实际中一般都是用具体的包,流程为:将数据装化为张量格式---->初始化权重参数和偏置项---->计算前向传播结果---->计算损失---->反向传播---->沿梯度更新参数---->将梯度清零。

更将单的写法为:

  1. input_size = input_features.shape[1]
  2. hidden_size = 128
  3. output_size = 1
  4. batch_size = 16
  5. my_nn = torch.nn.Sequential(
  6. torch.nn.Linear(input_size, hidden_size),
  7. torch.nn.Sigmoid(),
  8. torch.nn.Linear(hidden_size, output_size),
  9. )
  10. cost = torch.nn.MSELoss(reduction='mean')
  11. optimizer = torch.optim.Adam(my_nn.parameters(), lr = 0.001)

接下来就是最重要的训练网络:

  1. # 训练网络
  2. losses = []
  3. for i in range(1000):
  4. batch_loss = []
  5. # MINI-Batch方法来进行训练
  6. for start in range(0, len(input_features), batch_size):
  7. end = start + batch_size if start + batch_size < len(input_features) else len(input_features)
  8. xx = torch.tensor(input_features[start:end], dtype = torch.float, requires_grad = True)
  9. yy = torch.tensor(labels[start:end], dtype = torch.float, requires_grad = True)
  10. prediction = my_nn(xx)
  11. loss = cost(prediction, yy)
  12. loss.backward(retain_graph=True)
  13. optimizer.step()
  14. optimizer.zero_grad()
  15. batch_loss.append(loss.data.numpy())
  16. # 打印损失
  17. if i % 100==0:
  18. losses.append(np.mean(batch_loss))
  19. print(i, np.mean(batch_loss))

流程为:获取batch数据---->送入网络---->获取预测值---->计算损失---->反向传播---->沿梯度更新参数---->将梯度清零

最后可视化

  1. # 转换日期格式
  2. dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
  3. print(dates)
  4. dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
  5. #print(dates)
  6. # 创建一个表格来存日期和其对应的标签数值
  7. true_data = pd.DataFrame(data = {'date': dates, 'actual': labels})
  8. # 同理,再创建一个来存日期和其对应的模型预测值
  9. months = features[:, feature_list.index('month')]
  10. days = features[:, feature_list.index('day')]
  11. years = features[:, feature_list.index('year')]
  12. test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
  13. test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]
  14. predictions_data = pd.DataFrame(data = {'date': test_dates, 'prediction': predict.reshape(-1)})
  15. # 真实值
  16. plt.plot(true_data['date'], true_data['actual'], 'b-', label = 'actual')
  17. # 预测值
  18. plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label = 'prediction')
  19. plt.xticks(rotation = '60');
  20. plt.legend()
  21. # 图名
  22. plt.xlabel('Date'); plt.ylabel('Maximum Temperature (F)'); plt.title('Actual and Predicted Values');

 总结:

左边流程的链接:(23条消息) 神经网络入门(手写体的识别torch+jupyter+Mnist数据集)_萌新小白一只的博客-CSDN博客

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/103824?site
推荐阅读