搭建神经网络进行气温预测

这篇博客介绍了如何利用TensorFlow 2.x和Keras进行回归问题的预测。首先,从temps.csv文件加载数据,然后进行数据预处理,包括时间数据转换和特征独热编码。接着,构建了一个多层神经网络模型,并尝试通过调整初始化方法、正则化参数和训练次数来优化模型性能。最后,展示了模型预测结果并与实际值进行了比较。
摘要由CSDN通过智能技术生成

唐宇迪课程学习笔记

回归问题预测

  • Tensordlow2版本中将大量使用keras的简介建模方法
import numpy as np
import pandas as pd
import marplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import layers
import tensorflow.keras
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
features = pd.read_csv('temps.csv')

# 看看数据长什么样子
features.head()

在这里插入图片描述
数据表中

  • year,month,day,week 分别表示具体的时间
  • temp_2:前天的最高气温
  • temp_1:昨天的最高气温
  • average:在历史中,每年这一天的平均最高温度值
  • actual:这就是我们的标签值了,当天的真实最高温度
  • friend:这一列可能是凑热闹的,你的朋友猜测的可能值,咱们不管它就好
print('数据维度:', features.shape)

数据维度:(348, 9)

# 处理时间数据
import datetime

# 分别得到年,月,日
years = features['year']
months = features['month']
days = features['day']

# datetime 格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for years, month, day in zip(years, months, days)] 
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]

dates[:5]

[datatime.datetime(2016, 1, 1, 0, 0),
datatime.datetime(2016, 1, 2, 0, 0),
datatime.datetime(2016, 1, 3, 0, 0),
datatime.datetime(2016, 1, 4, 0, 0),
datatime.datetime(2016, 1, 5, 0, 0)]

# 准备画图
# 指定默认风格
plt.style.use('fivethirtyeight')

# 设置布局
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, cols=2, figsize = (10, 10))
fig.autofmt_xdate(rotation = 45)

# 标签值
ax1.plot(dates, features['actual'])
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('MAX Temp')

# 昨天
ax2.plot(dates, features['tenp_1'])
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('Previous Max Temp')

# 前天
ax3.plot(dates, features['temp_2'])
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('Two Days Prior Max Temp')

# 我的逗逼朋友
ax4.plot(dates, features['friend'])
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4,set_title('Friend Estimate')

plt.tight_layout(pad=2)

在这里插入图片描述

# 独热编码
features = pd.get_dumies(features)
features.head(5)

在这里插入图片描述

labels = np.array(features['actual'])

# 在特征中去掉标签
features = features.drop('actual', axis=1)

# 名字单独保存一下,以备后患
feature_list = list(features.columns)

# 转换成合适的格式
features = np.array(features)

features,shape

(348, 14)

from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)

基于Keras构建网络模型

一些常用参数已经列出,如下所示:

  • activation:激活函数的选择,一般常用relu
  • kernel_initializer, bias_initializer:权重与偏置参数的初始化方法,有时候不收敛换种初始化突然好使了…玄学
  • kernel_regularizer, bias_regularizer:要不要加入正则化
  • inputs:输入,可以自己制定,也可以让网络自动选
  • units:神经元个数

按顺序构造网络模型

model = tf.keras.Sequential()
model.add(layers.Dense(16))
model.add(layers.Dense(32))
model.add(layers.Dense(1))

compile 相当于对网络进行配置,指定好优化器和损失函数等

# SGD 梯度下降
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
			loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=10, batch_size=64)
# x, y, 验证集占25%, 10轮, 优化器每次迭代64

在这里插入图片描述
似乎存在一些问题,模型还没有完全收敛,能不能调些参数呢

model.summary()

在这里插入图片描述

更改初始化方法后

model = tf.keras.Sequential()
model.add(layers.Dense(16, kernel_initializer='random_normal'))
model.add(layers.Dense(32, kernel_initializer='random_normal'))
model.add(layers.Dense(1, kernel_initializer='random_normal'))
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
			loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=100, batch_size=64)			

加入正则化惩罚项

model = tf.keras.Sequential()
model.add(layers.Dense(16, kernel_initializer='random_normal', kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(32, kernel_initializer='random_normal', kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(1, kernel_initializer='random_normal', kernel_regularizer=tf.keras.regularizers.l2(0.03)))

model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
			loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=100, batch_size=64)		

加入正则项,可以使W更加平滑

预测模型结果

predict = model.predict(input_features)

predict.shape

(348, 1)

测试结果并进行展示

# 转换日期
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for years, 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 = features[:, feature_list.index('month')]
days = features[:, feature_list.index('day')]
year = features[:, feature_list.index('year')]

test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for years, month, day in zip(years, months, days)] 

tset_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]

predications_data = pd.DataFrame(data = {'date':dates, 'actual':labels})
# 真实值
plt.plot(ture_data['date'], true_data['actual'], 'b-', label='actual')

# 预测值
plt.plot(predictions_data['data'], predictions_data['prediction'], 'ro', label ='prediction')
plt.xticks(rotation = '60')
plt.legend()

# 图名
plt.xlabel('Date);plt.ylabel('Maximum Temperature (F)');plt.title('Actual and Predicted Values');

在这里插入图片描述

主要看验证集和测试集上的 loss 值

### 回答1: 好的,以下是一个简单的搭建pytorch神经网络进行气温预测的代码: ``` import torch import torch.nn as nn import torch.optim as optim import numpy as np # 准备数据 x_train = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], dtype=np.float32) y_train = np.array([[4.5], [7.5], [10.5], [13.5]], dtype=np.float32) # 定义模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(3, 10) self.fc2 = nn.Linear(10, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x net = Net() # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.SGD(net.parameters(), lr=.01) # 训练模型 for epoch in range(100): inputs = torch.from_numpy(x_train) labels = torch.from_numpy(y_train) optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() if epoch % 100 == : print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, 100, loss.item())) # 预测 x_test = np.array([[13, 14, 15], [16, 17, 18]], dtype=np.float32) with torch.no_grad(): inputs = torch.from_numpy(x_test) outputs = net(inputs) print(outputs) ``` 这个代码可以用来预测气温,其中x_train是训练数据,y_train是训练数据对应的标签,Net是一个简单的神经网络模型,criterion是损失函数,optimizer是优化器,训练过程中会输出损失值,最后用训练好的模型预测x_test对应的输出。 ### 回答2: import torch import torch.nn as nn import torch.optim as optim import numpy as np # 准备数据 temperature_celsius = np.array([-5, 0, 10, 20, 30, 35, 40], dtype=np.float32) temperature_fahrenheit = np.array([-23, 32, 50, 68, 86, 95, 104], dtype=np.float32) # 转换为张量 x_train = torch.from_numpy(temperature_celsius).unsqueeze(1) y_train = torch.from_numpy(temperature_fahrenheit).unsqueeze(1) # 定义神经网络模型 class TemperaturePredictor(nn.Module): def __init__(self): super(TemperaturePredictor, self).__init__() self.linear = nn.Linear(1, 1) def forward(self, x): return self.linear(x) model = TemperaturePredictor() # 定义损失函数和优化器 loss_function = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 训练模型 num_epochs = 1000 for epoch in range(num_epochs): # 前向传播 outputs = model(x_train) loss = loss_function(outputs, y_train) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 每隔100个epoch打印一次loss if (epoch+1) % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 使用模型进行预测 x_test = torch.tensor([[15]]) predicted = model(x_test) print('预测结果: {:.2f}华氏度'.format(predicted.item())) ### 回答3: import torch import torch.nn as nn import torch.optim as optim # 定义神经网络模型 class TempPredictionModel(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(TempPredictionModel, self).__init__() self.hidden_layer = nn.Linear(input_dim, hidden_dim) self.output_layer = nn.Linear(hidden_dim, output_dim) def forward(self, x): x = torch.relu(self.hidden_layer(x)) x = self.output_layer(x) return x # 设置模型参数和训练参数 input_dim = 1 # 输入特征维度为1,即气温 hidden_dim = 10 # 隐藏层维度设为10 output_dim = 1 # 输出维度为1,即预测结果为一个实数 learning_rate = 0.01 # 学习率 num_epochs = 1000 # 训练次数 # 准备训练数据 # 假设已经有了一个包含多个气温数据的训练集train_data # train_data的shape为 (num_samples, input_dim),num_samples为训练样本数量 # 将训练数据转化为Tensor train_data = torch.tensor(train_data, dtype=torch.float32) # 创建模型实例 model = TempPredictionModel(input_dim, hidden_dim, output_dim) # 定义损失函数 criterion = nn.MSELoss() # 定义优化器 optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 模型训练 for epoch in range(num_epochs): # 前向传播 outputs = model(train_data) # 计算损失 loss = criterion(outputs, train_data) # 反向传播及优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印训练过程 if (epoch+1) % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 模型训练完成,可以用于预测了 # 假设已经有了一个包含多个待预测气温数据的测试集test_data # test_data的shape为 (num_samples, input_dim),num_samples为待预测样本数量 # 将测试数据转化为Tensor test_data = torch.tensor(test_data, dtype=torch.float32) # 开始预测 predicted_temperatures = model(test_data) # 将预测结果从Tensor转化为numpy数组 predicted_temperatures = predicted_temperatures.detach().numpy() # 打印预测结果 for i in range(len(predicted_temperatures)): print('真实气温: {:.1f}, 预测气温: {:.1f}'.format(test_data[i], predicted_temperatures[i]))
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Harvey2001

感谢您的认可,无限飓风不断进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值