【深度学习】搭建PyTorch神经网络进行气温预测

第一步 数据加载与观察

①导包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.optim as optim
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline

②加载数据

features = pd.read_csv("temps.csv")#观察数据
features.head()

③整合日期,统一格式

import datetimeyears = features["year"]
months = features["month"]
days = features["day"]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]

④绘图(主要用于观察数据走向)

# 绘图
plt.style.use("fivethirtyeight")
plt.rcParams['font.sans-serif'] = ['SimHei']# 设置布局
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(10,10))
fig.autofmt_xdate(rotation=45)# 标签值
ax1.plot(dates,features["actual"])
ax1.set_xlabel("")
ax1.set_ylabel("Temperature")
ax1.set_title("当天真实最大温度")ax2.plot(dates,features["temp_1"])
ax2.set_xlabel("")
ax2.set_ylabel("Temperature")
ax2.set_title("昨日最大温度")ax3.plot(dates,features["temp_2"])
ax3.set_xlabel("Date")
ax3.set_ylabel("Temperature")
ax3.set_title("前日最大温度")ax4.plot(dates,features["friend"])
ax4.set_xlabel("Date")
ax4.set_ylabel("Temperature")
ax4.set_title("朋友预测最大温度")plt.tight_layout(pad=2)

注1:值得一提的是,如果日期没有转换为datetime类型,而是简单的字符串,在绘图的时候是无法正确显示的

即缺失本句:

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

注2

除了 `plot()` 方法,matplotlib 的 Axes 对象还提供了多种其他方法来创建不同类型的图表。以下是一些常见的方法:

1. **scatter(x, y, [s], [c])**: 创建散点图。`x` 和 `y` 分别是数据点的横坐标和纵坐标,`s` 是可选参数,用于指定点的大小,`c` 也是可选参数,用于指定点的颜色。

2. **bar(x, height)** 或 **barh(y, width)**: 创建条形图。`bar()` 创建垂直条形图,而 `barh()` 创建水平条形图。

3. **hist(x, bins)**: 创建直方图。`x` 是一个连续型变量的数据集,`bins` 参数指定了直方图中的柱数或区间范围。

4. **step(x, y)**: 创建阶梯图。与线图类似,但是值之间的连接是水平和垂直线段构成的台阶状。

5. **fill_between(x, y1, [y2])**: 在两条曲线之间填充颜色。`y1` 和 `y2` 分别定义了上下边界,默认情况下 `y2=0`。

6. **stackplot(x, y)**: 创建堆叠区域图。

7. **errorbar(x, y, [yerr], [xerr])**: 创建带误差棒的线图。`yerr` 和 `xerr` 分别指定了每个点在y轴和x轴方向上的误差范围。

8. **stem(x, y)**: 创建茎叶图,显示离散序列相对于x的位置。

9. **pie(sizes, [labels])**: 创建饼图。`sizes` 指定各部分的大小,`labels` 是可选参数,用来标记饼图中的各个扇区。

10. **imshow(X)**: 显示图像数据。`X` 是一个二维数组,表示图像的像素值。

11. **contour([X, Y,] Z)** 或 **contourf([X, Y,] Z)**: 创建等高线图或填充的等高线图。`Z` 是一个二维数组,表示高度值;`X` 和 `Y` 可选,提供坐标的网格。

这些只是 matplotlib 提供的一部分绘图方法,每种方法都有自己的参数选项,可以进一步定制图表的外观。对于更复杂或特定领域的图表,还可以使用 seaborn、plotly 等高级绘图库,它们基于 matplotlib 并扩展了其功能。

第二步 预处理

①独热编码

features = pd.get_dummies(features)
features.head()

注1:

pd.get_dummies(features) 是 Pandas 库中的一个函数,用于将分类变量(categorical variable)转换为哑变量(dummy variables),也称为 one-hot 编码。这样做是为了让机器学习算法能够处理非数值型数据,因为大多数机器学习算法需要输入的数据是数值形式的。

这行代码会创建一个新的 DataFrame features,其中原来的分类变量被替换为多个二进制(0 或 1)的列,每个新列代表原始分类变量的一个类别。如果一个样本属于某个类别,则对应的新列为 1;否则为 0。

例如,如果你有一个特征 "color" 包含三个类别:"Red", "Green", 和 "Blue",那么调用 pd.get_dummies() 后会生成三列:color_Red, color_Green, 和 color_Blue,并且每个样本在这三列中只会有一个值为 1,其余为 0。

②处理数据和预测值

labels = np.array(features["actual"])features = features.drop("actual",axis=1)feature_list = list(features.columns)features = np.array(features)

注1:features = np.array(features)

本句将features从Pandas DataFrame的形式转换为Numpy数组,以便后续操作

③标准化数据

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

注1:

  • preprocessing.StandardScaler() 创建了一个 StandardScaler 的实例。StandardScaler 是一个类,它实现了对数据进行标准化的功能。

  • .fit_transform(features) 方法执行了两个操作:

    • fit: 计算训练数据的均值和标准差。这些统计信息将被用来标准化数据。

    • transform: 使用计算出的均值和标准差来标准化数据,即将每个特征减去其均值并除以其标准差,得到新的特征值。

第三步 构建神经网络模型

x = torch.tensor(input_features,dtype=float)
y = torch.tensor(labels,dtype=float)# 权重参数初始化
weights1 = torch.randn((14,128),dtype=float,requires_grad = True)
biases1 = torch.randn(128,dtype=float, requires_grad = True)
weights2 = torch.randn((128,1),dtype=float,requires_grad = True)
biases2 = torch.randn(1,dtype=float,requires_grad = True)learning_rate=0.001
losses=[]for i in range(1000):# 计算隐藏层hidden = x.mm(weights1)+biases1# 加入激活函数hidden = torch.relu(hidden)# 预测结果predictions = hidden.mm(weights2)+biases2# 计算损失loss = torch.mean((predictions - y)**2)losses.append(loss.data.numpy())if i % 100 ==0:print("loss:",loss)# 反向传播计算loss.backward()# 更新参数weights1.data.add_(-learning_rate * weights1.grad.data)biases1.data.add_(-learning_rate * biases1.grad.data)weights2.data.add_(-learning_rate * weights2.grad.data)biases2.data.add_(-learning_rate * biases2.grad.data)# 每次迭代完清空weights1.grad.data.zero_()biases1.grad.data.zero_()weights2.grad.data.zero_()biases2.grad.data.zero_()

第四步 优化构建神经网络模型的方法

①构建模型

input_size = input_features.shape[1]
hidden_size = 128
output_size = 1
batch_size = 16my_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)

这段代码创建了一个简单的两层神经网络,定义了损失函数为均方误差,并选择了 Adam 作为优化器。Sequential 模块简化了模型构建的过程,使得代码更加简洁易读。此外,通过设置批量大小、隐藏层大小、输出大小等超参数,你可以灵活地调整模型以适应不同的任务需求。

要完成这个模型的训练过程,还需要编写一个训练循环,在其中进行前向传播、计算损失、反向传播以及参数更新。如果你想要进一步提升模型性能或复杂度,还可以考虑添加更多层、选择不同的激活函数、调整优化器及其参数等。

②训练模型

# 训练网络
losses = []
for i in range(1000):batch_loss = []#MINI-Batch方法来进行训练for start in range(0,len(input_features),batch_size):end = start+batch_size if start+batch_size<len(input_features) else len(input_features)xx = torch.tensor(input_features[start:end],dtype=torch.float,requires_grad = True)yy = torch.tensor(labels[start:end],dtype=torch.float,requires_grad = True)prediction =a 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))

第五步 绘图观察

①准备数据

x = torch.tensor(input_features,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 = features[:,feature_list.index("month")]
days = features[:,feature_list.index("day")]
years = features[:,feature_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)})

注1:

  • features 是一个二维数组或类似结构(如 NumPy 数组),其中每一行代表一个样本,每一列代表一个特征。

  • : 表示选取所有行。

  • feature_list.index("month") 返回的是要选择的列的索引。

  • 因此,features[:, feature_list.index("month")] 将选取 features 中对应于 "month" 列的所有元素,形成一个新的一维数组,这个数组包含了所有样本的月份信息。

注2:

predict.reshape(-1) 的具体含义如下:

  • reshape() 方法:这是 NumPy 数组的一个方法,用于改变数组的形状而不改变其数据。

  • -1 参数:当你传递 -1 作为参数时,NumPy 会自动计算该维度的大小,以确保新数组的总元素数量保持不变。换句话说,它会根据其他维度的大小来推断出合适的长度。例如,如果你有一个形状为 (n, 1) 的二维数组,并调用 .reshape(-1),结果将是一个形状为 (n,) 的一维数组。

在你的例子中,假设 predict 是一个形状为 (n, 1) 的二维数组,那么 predict.reshape(-1) 会将其转换为一个形状为 (n,) 的一维数组。这样做是为了确保 predictions_data 中的 prediction 列是一维的,从而与 date 列匹配,并且使得每个日期对应一个预测值。

③绘图

# 真实值
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("Actual and Predicted Values")

注1:

plt.legend():在图表中添加一个图例,显示之前定义的标签(如 "actual""prediction"),以便区分不同系列的数据。

注2:

"b-":指定线条样式为蓝色实线(b 表示蓝色,- 表示实线)。

"ro":指定标记样式为红色圆点(r 表示红色,o 表示圆形标记)。


至此,构建神经网络模型实现气温预测已完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP8266 NodeMCU与WS2812灯带:实现多种花样变换

在现代电子创意项目中&#xff0c;LED灯带的应用已经变得极为广泛。通过结合ESP8266 NodeMCU的强大处理能力和FastLED库的高效功能&#xff0c;我们可以轻松实现多达100种灯带变换效果。本文将详细介绍如何使用Arduino IDE编程&#xff0c;实现从基础到高级的灯光效果&#xff…

pycharm踩坑(1)

由于我重装系统&#xff0c;导致我的pycharm需要进行重装&#xff0c;因此我觉得需要记录一下&#xff0c;pycharm的正确使用方法 汉化 汉化很重要&#xff0c;除非你从小就双语教学&#xff0c;不然你看着那些英文就是会消耗大量的精力 我使用的pycharm版本是pycharm-commun…

OpenCV2D 特征框架 (11)特征检测与描述用于检测二值图像中连通区域(即“斑点”或“blob”)的类cv::SimpleBlobDetector的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::SimpleBlobDetector 是 OpenCV 中用于检测二值图像中连通区域&#xff08;即“斑点”或“blob”&#xff09;的类。这些连通区域可以是白色前…

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤&#x1f4dd; AI基础与敌人行为&#x1f94a; AI导航理论知识&#xff08;基础&#xff09;开始实践 &#x1f383; 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 &#x1f917; 总结归纳 Unity学习之旅⑤ &#x1f4dd; AI基础与敌…

浅谈Unity中Canvas的三种渲染模式

Overview UGUI通过 Canvas 组件渲染和管理UI元素。Canvas 是 UI 元素的容器&#xff0c;它决定了 UI 元素的渲染方式以及它们在屏幕上的显示效果。Canvas 有三种主要的渲染模式&#xff0c;每种模式有不同的用途和特点。本文将介绍这三种渲染模式 1. Screen Space - Overlay 模…

Unity中在UI上画线

在UI中画一条曲线 我封装了一个组件,可以实现基本的画线需求. 效果 按住鼠标左键随手一画. 用起来也很简单,将组件挂到空物体上就行了,红色的背景是Panel. 你可以将该组件理解为一个Image,只不过形状更灵活一些罢了,所以它要放在下面的层级(不然可能会被挡住). 代码 可以…

2024.1.22 安全周报

政策/标准/指南最新动态 01 工信部印发《关于加强互联网数据中心客户数据安全保护的通知》 原文: https://www.secrss.com/articles/74673 互联网数据中心作为新一代信息基础设施&#xff0c;承载着千行百业的海量客户数据&#xff0c;是关系国民经济命脉的重要战略资源。…

Mac cursor设置jdk、Maven版本

基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数&#xff0c;运行cursor&#xff0c;按下ctrlshiftp&#xff0c;输入Open User Settings(JSON)&#xff0c;在弹出的下拉菜单中选中下面这样的&#xff1a; 在打开的json编辑器中追加下面的内容&#xff1a; {"…

ARM64平台Flutter环境搭建

ARM64平台Flutter环境搭建 Flutter简介问题背景搭建步骤1. 安装ARM64 Android Studio2. 安装Oracle的JDK3. 安装 Dart和 Flutter 开发插件4. 安装 Android SDK5. 安装 Flutter SDK6. 同意 Android 条款7. 运行 Flutter 示例项目8. 修正 aapt2 报错9. 修正 CMake 报错10. 修正 N…

基于海思soc的智能产品开发(视频的后续开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们讨论了camera&#xff0c;也讨论了屏幕驱动&#xff0c;这些都是基础的部分。关键是&#xff0c;我们拿到了这些视频数据之后&#xff0c;…

vue3+webOffice合集

1、webOffice 初始化 1&#xff09;officeType: 文档位置&#xff1a;https://solution.wps.cn/docs/web/quick-start.html#officetype 2&#xff09;appId: 前端使用appId 后端需要用到AppSecret 3&#xff09;fileId: 由后端返回&#xff0c;前端无法生成&#xff0c;与上传文…

2025牛客寒假算法营2

A题 知识点&#xff1a;模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写&#xff0c;我们可以反过来&#xff0c;检查这七个整数是否不为 4 和 7。 时间 O(1)&#xff1b;空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…

记录一次k8s起不来的排查过程

我在k8s集群&#xff0c;重启了一个node宿主机&#xff0c;竟然发现kubelet起不来了&#xff01;报错如下 这个报错很模糊&#xff0c;怎么排查呢。这样&#xff0c;开两个界面&#xff0c;一个重启kubelet&#xff0c;一个看系统日志(/var/log/message:centos&#xff0c;/va…

仿 RabbitMQ 的消息队列3(实战项目)

七. 消息存储设计 上一篇博客已经将消息统计文件的读写代码实现了&#xff0c;下一步我们将实现创建队列文件和目录。 实现创建队列文件和目录 初始化 0\t0 这样的初始值. //创建队列对应的文件和目录&#xff1a;public void createQueueFile(String queueName) throws IO…

HTTP 配置与应用(局域网)

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识&#xff0c;下次更新HTTP 配置与应用&#xff08;不同网段&#xff09;。 我是一个萌新小白&#xf…

大模型应用与部署 技术方案

大模型应用与部署 技术方案 一、引言 人工智能蓬勃发展,Qwen 大模型在自然语言处理领域地位关键,其架构优势尽显,能处理文本创作等多类复杂任务,提供优质交互。Milvus 向量数据库则是向量数据存储检索利器,有高效索引算法(如 IVF_FLAT、HNSWLIB 等)助力大规模数据集相似…

【Prometheus】Prometheus如何监控Haproxy

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Go语言中的值类型和引用类型特点

一、值类型 值类型的数据直接包含值&#xff0c;当它们被赋值给一个新的变量或者作为参数传递给函数时&#xff0c;实际上是创建了原值的一个副本。这意味着对新变量的修改不会影响原始变量的值。 Go中的值类型包括&#xff1a; 基础类型&#xff1a;int&#xff0c;float64…

GPT 结束语设计 以nanogpt为例

GPT 结束语设计 以nanogpt为例 目录 GPT 结束语设计 以nanogpt为例 1、简述 2、分词设计 3、结束语断点 1、简述 在手搓gpt的时候&#xff0c;可能会遇到一些性能问题&#xff0c;即关于是否需要全部输出或者怎么节约资源。 在输出语句被max_new_tokens 限制&#xff0c…

深入MapReduce——计算模型设计

引入 通过引入篇&#xff0c;我们可以总结&#xff0c;MapReduce针对海量数据计算核心痛点的解法如下&#xff1a; 统一编程模型&#xff0c;降低用户使用门槛分而治之&#xff0c;利用了并行处理提高计算效率移动计算&#xff0c;减少硬件瓶颈的限制 优秀的设计&#xff0c…