遙感機器學習入門實戰教程|Sklearn案例⑥:網格搜索與超參數優化

在前幾篇案例中,有同學在后臺留言:

“模型的參數到底怎么調?比如 SVM 的 C 和 γ,隨機森林的樹數和深度,要怎么選才能得到最優結果呢?”

這是一個非常經典的問題:參數選不好,模型效果差一截;參數調優,性能能上一個臺階

本篇我們就來介紹 sklearn 中的 網格搜索(Grid Search),看看如何系統地找到最優參數組合。

🧩 1. 什么是超參數搜索?

  • 模型參數:訓練過程中自動學習到的(如邏輯回歸的權重)。
  • 超參數:需要人為設定的(如 SVM 的核函數、C 值;隨機森林的樹數)。

超參數對模型表現影響巨大。手工調參既耗時又容易遺漏最佳組合,因此 sklearn 提供了 GridSearchCV,幫我們自動嘗試多組參數,并通過交叉驗證挑選最優解。

?? 2. 完整代碼示例

我們仍然基于 KSC 高光譜數據集,用 PCA 壓縮后特征作為輸入,演示 SVM 與隨機森林 的參數搜索。

# -*- coding: utf-8 -*-
"""
Sklearn案例⑥:網格搜索與超參數優化
"""
import os, numpy as np, scipy.io as sio, matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import seaborn as sns# ===== 參數設置 =====
DATA_DIR = "你的數據路徑"
PCA_DIM, TRAIN_RATIO, SEED = 30, 0.3, 42# ===== 1. 加載數據 =====
X = sio.loadmat(os.path.join(DATA_DIR, "KSC.mat"))["KSC"].astype(np.float32)
Y = sio.loadmat(os.path.join(DATA_DIR, "KSC_gt.mat"))["KSC_gt"].astype(int)
coords = np.argwhere(Y != 0)
labels = Y[coords[:,0], coords[:,1]] - 1
train_ids, test_ids = train_test_split(np.arange(len(coords)), train_size=TRAIN_RATIO,stratify=labels, random_state=SEED
)
train_pixels = X[coords[train_ids,0], coords[train_ids,1]]
test_pixels  = X[coords[test_ids,0], coords[test_ids,1]]# ===== 2. 標準化 + PCA =====
scaler = StandardScaler().fit(train_pixels)
pca = PCA(n_components=PCA_DIM, random_state=SEED).fit(scaler.transform(train_pixels))
X_train = pca.transform(scaler.transform(train_pixels))
X_test  = pca.transform(scaler.transform(test_pixels))
y_train, y_test = labels[train_ids], labels[test_ids]# ===== 3. SVM 參數搜索 =====
param_grid_svm = {"C": [0.1, 1, 10],"gamma": [0.01, 0.1, 1],"kernel": ["rbf"]
}
grid_svm = GridSearchCV(SVC(), param_grid_svm, cv=3, n_jobs=-1, verbose=1)
grid_svm.fit(X_train, y_train)print("最佳參數(SVM):", grid_svm.best_params_)
print("測試集準確率:", accuracy_score(y_test, grid_svm.best_estimator_.predict(X_test)))# 可視化搜索結果 (C vs gamma 熱力圖)
scores = grid_svm.cv_results_["mean_test_score"].reshape(len(param_grid_svm["C"]), len(param_grid_svm["gamma"]))
plt.figure(figsize=(6,5))
sns.heatmap(scores, annot=True, xticklabels=param_grid_svm["gamma"], yticklabels=param_grid_svm["C"], cmap="YlGnBu")
plt.xlabel("gamma"); plt.ylabel("C"); plt.title("SVM 網格搜索結果")
plt.show()# ===== 4. 隨機森林 參數搜索 =====
param_grid_rf = {"n_estimators": [10, 30, 50],"max_depth": [5, 10, None]
}
grid_rf = GridSearchCV(RandomForestClassifier(random_state=SEED),param_grid_rf, cv=3, n_jobs=-1, verbose=1)
grid_rf.fit(X_train, y_train)print("最佳參數(RF):", grid_rf.best_params_)
print("測試集準確率:", accuracy_score(y_test, grid_rf.best_estimator_.predict(X_test)))

📊 3. 結果與分析

運行后我們會得到:

  • SVM:輸出最佳 Cgamma,并繪制了一個參數搜索熱力圖,可以直觀看出不同參數下的準確率差異。
  • 隨機森林:自動選擇最佳樹數和深度。

在實驗中,SVM 的性能對參數敏感,而隨機森林更穩健。通過 GridSearchCV,我們不再需要手工試探,而是能系統化地找到較優解。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

💡 4. 總結

這一節我們解決了同學們常見的疑問:如何找到最優參數?

  1. sklearn 提供的 GridSearchCV 可以自動化調參,支持交叉驗證,避免“拍腦袋調參”。
  2. 除了網格搜索,還有 RandomizedSearchCV,在參數空間很大時更高效。
  3. 在實際科研和工程中,參數調優往往比更換模型更能帶來提升。

👉 下一篇,我們將進入 特征選擇與重要性分析,看看如何找到對分類最關鍵的波段或特征(當然,也可能應要求更新其他內容)。
歡迎大家關注下方我的公眾獲取更多內容!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93936.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

論文精讀(三)|智能合約漏洞檢測技術綜述

筆者鏈接:撲克中的黑桃A 專欄鏈接:論文精讀 本文關鍵詞:智能合約;合約安全;合約可靠性;合約質量保障;漏洞檢測;合約程序分析 引 諸位技術同仁: 本系列將系統精讀的方式,深入剖析計算機科學頂級期刊/會議論文&#…

YOLO --- YOLO11模型以及項目詳解

YOLO — YOLO11模型以及項目詳解 文章目錄YOLO --- YOLO11模型以及項目詳解一,開源地址二,重要模塊2.1 C3K22.2 C2PSA2.3 檢測頭三,網絡結構3.1 整體結構劃分3.2 Backbone 結構分析(從下往上看)3.3 結構分析&#xff0…

Debezium監聽MySQL binlog并實現有狀態重啟

Debezium實現MySQL數據監聽了解Debezium? 本期主要內容實現步驟1. 新建Maven工程2.導入依賴3.核心代碼編寫4.offset的存儲5.OffsetBackingStore實現jdbc模式6.運行結果總結了解Debezium 官網:https://debezium.io/ Debezium是一組分布式服務,用于捕獲數…

InfluxDB 存儲優化:TSM 文件管理與空間回收(一)

一、InfluxDB 與 TSM 文件初相識**在數字化時代,數據量呈爆發式增長,尤其是時間序列數據,如服務器監控指標、傳感器讀數、金融交易記錄等,它們都帶有時間戳,記錄著事物隨時間的變化。InfluxDB 作為一款高性能的開源時序…

macos使用FFmpeg與SDL解碼并播放H.265視頻

效果: 安裝依賴: brew install ffmpeg brew install sdl2 brew install x265 確認x265已啟用 查看x265版本 工程CMakeLists.txt

C#開源庫ACadSharp讀取dwg圖元的示例

文章目錄介紹數據示例讀取圖元屬性介紹 開源庫ACadSharp的地址:https://github.com/DomCR/ACadSharp 可以在NuGet中搜索到該庫并安裝。 數據示例 數據是一個繪制了以下簡單圖元的dwg數據: 讀取圖元屬性 創建了.net6控制臺項目,通過NuG…

【UniApp打包鴻蒙APP全流程】如何配置并添加UniApp API所需的鴻蒙系統權限

一、前言:為什么選擇 UniApp 打包鴻蒙應用? 隨著鴻蒙生態的快速發展,越來越多開發者希望將現有跨平臺項目快速接入鴻蒙系統。而 UniApp 作為國內領先的跨平臺開發框架,憑借其“一次開發,多端發布”的特性,…

STM32-FreeRTOS快速入門指南(下)

第十一章 FreeRTOS事件標志組 1. 事件標志組簡介 事件標志組與信號量一樣屬于任務間同步的機制,但是信號量一般用于任務間的單事件同步,對于任務間的多事件同步,僅使用信號量就顯得力不從心了。 FreeRTOS 提供的事件標志組可以很好的處理多事…

KTH7812磁編碼器芯片完全支持ABZ和UVW輸出模式

KTH7812磁編碼器芯片完全支持ABZ和UVW輸出模式,具體功能細節如下:🔧 1. ABZ輸出特性 分辨率可編程:支持 4~4096步/圈(對應1~1024個脈沖周期/圈),用戶可通過配置寄存器自定義分辨率。 輸出頻率…

Android為ijkplayer設置音頻發音類型usage

官方文檔 多區音頻路由 | Android Open Source Projecthttps://source.android.google.cn/docs/automotive/audio/audio-multizone-routing?hlzh-cn 背景 車機系統開發多分區(zone)功能,可以實現同一個app通過設置,在不同分…

C++ 循環:從入門到精通的深度解析

《C++ 循環:從入門到精通的深度解析》 目錄 循環的本質與編程價值 三大基礎循環結構詳解 循環控制語句:break與continue的魔法 嵌套循環:構建復雜邏輯的基石 現代C++循環特性(C++11+) 循環性能優化與常見陷阱 實戰案例:算法與工程中的循環應用 面試題深度解析與編程技巧…

| `cat /etc/os-release` | 發行版詳細信息(如 Ubuntu、CentOS) |

在 Linux 或類 Unix 系統中,最簡潔的命令查看操作系統類型是: uname -s? 輸出示例: LinuxDarwin(macOS)FreeBSD 等🔍 說明: uname:顯示系統信息-s:僅顯示操作系統內核名…

Maya 3D建模:點、線、面、創建多邊面

目錄 一 點、線、面 二 創建多邊面 一 點、線、面 鼠標放在模型上 按住鼠標右鍵:就可以選擇點 線 面 shift 加選點線面 ctrl 減選點線面 頂點面:是一個檢查模式,觀察有無錯誤 選擇面,單擊一個面,按住shift鍵 同時…

CXR-LT 2024:一場關于基于胸部X線的長尾、多標簽和零樣本疾病分類的MICCAI挑戰賽|文獻速遞-深度學習人工智能醫療圖像

Title題目CXR-LT 2024: A MICCAI challenge on long-tailed, multi-label, and zero-shotdisease classification from chest X-rayCXR-LT 2024:一場關于基于胸部X線的長尾、多標簽和零樣本疾病分類的MICCAI挑戰賽01文獻速遞介紹CXR-LT系列是一項由社區推動的計劃&a…

拆解本地組策略編輯器 (gpedit.msc) 的界面和功能

我們來詳細拆解本地組策略編輯器 (gpedit.msc) 的界面和功能。打開后,你會看到一個標準的微軟管理控制臺 (MMC) 窗口,主要分為三個部分。 這是一個典型的本地組策略編輯器界面,我們將其分為三個主要部分進行講解: +-----------------------------------------------+----…

[NCTF2019]True XML cookbook

TRY 嘗試XML外部實體注入 <?xml version"1.0" encoding"utf-8" ?> <!DOCTYPE user[<!ENTITY flag SYSTEM "file://./doLogin.php"> ]> <user><username> &flag; </username><password>1</pa…

嵌入式硬件篇---模塊使用

在電子開發、自動化控制等領域&#xff0c;“模塊” 是實現特定功能的標準化組件&#xff08;可以理解為 “功能積木”&#xff09;。不同模塊分工明確&#xff0c;比如有的負責感知環境&#xff08;傳感器&#xff09;&#xff0c;有的負責通信&#xff08;藍牙 / WiFi&#x…

密碼管理中Null 密碼

Null 密碼定義&#xff1a;Null 密碼是指允許用戶或系統賬戶使用空密碼&#xff08;即不輸入任何字符&#xff09;進行登錄或身份驗證的配置。危害&#xff1a;完全繞過身份驗證&#xff1a;這是最嚴重的危害。攻擊者無需破解或竊取任何密碼&#xff0c;只需輸入用戶名并留空密…

git新建項目如何推送到遠程倉庫

? git新建項目如何推送到遠程倉庫 一、遠程代碼庫操作(gitee為例) 1. 建新倉庫 2. 找到地址:這里可以看到用戶名等其他信息 3. 記住地址url(https) 二、本地操作 1. 安裝git 2. 創建項目 3. 在當前項目下打開git bash 4. 添加遠程倉庫 5. 檢查遠程倉庫地址 6. 檢查當前狀…

代碼管理平臺Gitlab如何通過 ZeroNews 實現遠程訪問?

Gitlab介紹1.1 GitLabGitLab 是一個基于 Web 的開源代碼托管平臺&#xff0c;集代碼托管、項目管理、持續集成與持續部署等功能于一身。它采用 Git 作為版本控制系統&#xff0c;界面友好、功能豐富。相較于市場上的 Gitee 和 GitHub&#xff0c;GitLab 有以下優勢&#xff1a;…