【深度學習】搭建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.pswp.cn/web/66918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66918.shtml
英文地址,請注明出處:http://en.pswp.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…

#HarmonyOS篇:build-profile.json5里面配置productsoh-package.json5里面dependencies依賴引入

oh-package.json5 用于描述包名、版本、入口文件和依賴項等信息。 {"license": "","devDependencies": {},"author": "","name": "entry","description": "Please describe the basic…

OpenCV2D 特征框架 (11)特征檢測與描述用于檢測二值圖像中連通區域(即“斑點”或“blob”)的類cv::SimpleBlobDetector的使用

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::SimpleBlobDetector 是 OpenCV 中用于檢測二值圖像中連通區域&#xff08;即“斑點”或“blob”&#xff09;的類。這些連通區域可以是白色前…

關于deepin上運行Qt開發的程序

國產化替代是將來各單位的主流趨勢&#xff0c;探索自行開發應用程序在國產操作系統上正常運行是將來的主要工作之一。本文淺嘗gui程序在統信社區版——deepin上遇到的小問題。 使用Qt在deepin上做了一個類似gif的幀動畫彈窗&#xff0c;在編譯運行時&#xff0c;程序可以正常…

Unity自學之旅05

Unity自學之旅05 Unity學習之旅⑤&#x1f4dd; AI基礎與敵人行為&#x1f94a; AI導航理論知識&#xff08;基礎&#xff09;開始實踐 &#x1f383; 敵人游戲機制追蹤玩家攻擊玩家子彈碰撞完善游戲失敗條件 &#x1f917; 總結歸納 Unity學習之旅⑤ &#x1f4dd; AI基礎與敵…

我想通過python語言,學習數據結構和算法該如何入手?

學習數據結構和算法是編程中的重要基礎&#xff0c;Python 是一個非常適合入門的語言。以下是學習數據結構和算法的步驟和建議&#xff1a; 1. 掌握 Python 基礎 確保你對 Python 的基本語法、數據類型、控制結構&#xff08;如循環、條件語句&#xff09;、函數等有扎實的理…

淺談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;是關系國民經濟命脈的重要戰略資源。…

探索 LLM:從基礎原理到 RAG 實現的深度解析

一.LLM基礎知識 1.1 大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09; 他是模型&#xff0c;是 AI 能力的核心。他是語言模型&#xff0c;其核心能力在于語言能力。他是大語言模型&#xff0c;與傳統模型相比&#xff0c;它最大的特點就是“大”。 1…

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…

selenium clear()方法清除文本框內容

在使用Selenium進行Web自動化測試時&#xff0c;清除文本框內容是一個常見的需求。這可以通過多種方式實現&#xff0c;取決于你使用的是哪種編程語言&#xff08;如Python、Java等&#xff09;以及你的具體需求。以下是一些常見的方法&#xff1a; 1. 使用clear()方法 clear…

基于海思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…

Docker Desktop 在Windows 環境中開發、測試和運行容器化的應用程序

Docker 為 Windows 提供了專門的桌面版工具&#xff0c;稱為 Docker Desktop&#xff0c;它允許你在 Windows 環境中開發、測試和運行容器化的應用程序。 如何在 Windows 上使用 Docker Docker Desktop Docker Desktop 是一個專為 Windows 設計的應用程序&#xff0c;它簡化了…

仿 RabbitMQ 的消息隊列3(實戰項目)

七. 消息存儲設計 上一篇博客已經將消息統計文件的讀寫代碼實現了&#xff0c;下一步我們將實現創建隊列文件和目錄。 實現創建隊列文件和目錄 初始化 0\t0 這樣的初始值. //創建隊列對應的文件和目錄&#xff1a;public void createQueueFile(String queueName) throws IO…