遙感機器學習入門實戰教程|Sklearn案例⑤:集成學習方法全覽

在機器學習的實際應用中,單一分類器往往存在局限:比如決策樹容易過擬合,kNN 對噪聲敏感,邏輯回歸在高維數據下收斂慢。為了提升整體效果,我們通常會采用 集成學習(Ensemble Learning)

這篇文章將基于 sklearn 框架,系統演示 Bagging、Boosting、Voting、Stacking 四類常見的集成學習方法,并在經典的 KSC 高光譜數據集 上做實驗對比。

🧩 1. 實驗思路

  • 數據集:KSC 高光譜影像及其地物標注
  • 預處理:標準化 + PCA 降維(僅作為特征壓縮,取 30 維)
  • 分類器:隨機森林(RF)、AdaBoost、GBDT、Bagging(kNN)、Voting、Stacking
  • 評價指標:Overall Accuracy (OA) 與 Kappa 系數

?? 2. 完整代碼

下面給出本次實驗的完整代碼,可以直接運行。請注意修改 DATA_DIR 為你存放數據的路徑。

# -*- coding: utf-8 -*-
"""
Sklearn案例⑤:集成學習方法全覽
- 演示 Bagging / Boosting / Voting / Stacking
"""
import os, numpy as np, scipy.io as sio, matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier,GradientBoostingClassifier, BaggingClassifier,VotingClassifier, StackingClassifier)
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, cohen_kappa_score
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False# ===== 參數設置 =====
DATA_DIR = "你的數據路徑"   # 修改為存放 KSC.mat 和 KSC_gt.mat 的文件夾
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)
h, w, b = X.shape
coords = np.argwhere(Y != 0)
labels = Y[coords[:,0], coords[:,1]] - 1
num_classes = labels.max() + 1# ===== 2. 劃分訓練/測試 =====
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]]# ===== 3. 標準化 + 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]# ===== 4. 定義多個集成學習模型 =====
models = {"RF": RandomForestClassifier(n_estimators=20, random_state=SEED, n_jobs=-1),"AdaBoost": AdaBoostClassifier(n_estimators=20, random_state=SEED),"GBDT": GradientBoostingClassifier(n_estimators=20, random_state=SEED),"Bagging(kNN)": BaggingClassifier(KNeighborsClassifier(5), n_estimators=30, random_state=SEED),"Voting(SVM+kNN+LR)": VotingClassifier(estimators=[("svm", SVC(probability=True)), ("knn", KNeighborsClassifier(5)),("lr", LogisticRegression(max_iter=1000))],voting="soft"),"Stacking(SVM+kNN->LR)": StackingClassifier(estimators=[("svm", SVC(probability=True)), ("knn", KNeighborsClassifier(5))],final_estimator=LogisticRegression(max_iter=200))
}# ===== 5. 訓練與評估 =====
results = {}
for name, clf in models.items():clf.fit(X_train, y_train)y_pred = clf.predict(X_test)oa = accuracy_score(y_test, y_pred)kappa = cohen_kappa_score(y_test, y_pred)results[name] = (oa, kappa)print(f"{name:20s} OA={oa*100:.2f}%  Kappa={kappa:.4f}")# ===== 6. 可視化比較 =====
plt.figure(figsize=(8, 5), dpi=110)
names      = list(results.keys())
oa_vals    = [results[k][0] * 100 for k in names]
kappa_vals = [results[k][1] * 100 for k in names]
x = np.arange(len(names))
plt.plot(x, oa_vals, marker='o', linewidth=2.2, label='OA (%)')
plt.plot(x, kappa_vals, marker='s', linewidth=2.2, linestyle='--', label='Kappa × 100')
plt.xticks(x, names, rotation=20, ha='right')
plt.ylabel("Accuracy / Score (%)")
plt.title("Sklearn 集成學習方法對比")
plt.grid(alpha=0.25, linestyle='--')
for xi, yi in zip(x, oa_vals):plt.text(xi, yi + 0.6, f"{yi:.1f}", ha='center', fontsize=9)
for xi, yi in zip(x, kappa_vals):plt.text(xi, yi + 0.6, f"{yi:.1f}", ha='center', fontsize=9)
plt.legend(frameon=False, ncol=2, loc='upper left')
plt.tight_layout()
plt.show()

📊 3. 實驗結果與分析

運行后會輸出每個模型的分類精度(OA)和 Kappa 系數,并繪制對比折線圖。實驗表明:

  • RF、Bagging:能有效減少過擬合,結果比較穩健;
  • AdaBoost、GBDT:對復雜邊界表現較好,整體精度有提升;
  • Voting:結合了 SVM、kNN、邏輯回歸的優勢,適合多類別任務;
  • Stacking:通過“元學習器”進一步優化,往往能獲得更平衡的結果。

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

💡 4. 總結

通過本實驗我們可以看到:

  1. sklearn 提供了 完整的集成學習工具箱,不同方法調用方式統一,便于快速切換和比較。
  2. 集成學習能夠顯著提升模型的魯棒性,尤其適合高維、類別不平衡的數據集。
  3. Voting 和 Stacking 等方法,能夠發揮多模型的互補性,往往比單一模型更可靠。

未來,我們還可以在此基礎上:

  • 嘗試更多基學習器(如深度學習特征)
  • 結合網格搜索進行超參數優化
  • 將集成學習與遷移學習結合,應用到更大規模的遙感分類任務

歡迎大家關注下方我的公眾獲取更多內容!

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

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

相關文章

大模型在垂直場景中的創新應用:搜索、推薦、營銷與客服的新玩法

1. 引言 背景介紹:簡述大模型(如GPT、BERT等)的發展歷程及其在AI領域的核心作用,強調其在垂直場景中的潛力。 主題聚焦:說明本文將深入探討搜索、推薦、營銷、客服四大場景,分析大模型帶來的創新開發方式。 目的與意義:闡述新玩法如何提升效率、增強用戶體驗,并推動行業…

華為倉頡語言的class(類)初步

華為倉頡語言的class(類)初步 class 概念 【官方文檔 https://cangjie-lang.cn/docs?url%2F1.0.0%2Fuser_manual%2Fsource_zh_cn%2Fclass_and_interface%2Fclass.html 】 class 是倉頡面向對象體系的核心,用來描述“引用類型”對象。與 s…

健康常識查詢系統|基于java和小程序的健康常識查詢系統設計與實現(源碼+數據庫+文檔)

健康常識查詢系統 目錄 基于java和小程序的健康常識查詢系統設計與實現 一、前言 二、系統設計 三、系統功能設計 小程序功能設計 后臺功能設計 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取: 博主介紹&#xf…

MySQL的高可用+MHA

即MySQL 主從復制高可用架構,是一套優秀的MySQL 高可用解決方案,由日本 DeNA 公司 youshimaton 開發,主要用于保障 MySQL 數據庫在主服務器出現故障時,能快速進行主從切換,減少數據庫服務中斷時間。其核心特點包括&…

淘寶pc端首頁做了哪些性能優化?

淘寶PC端首頁作為中國電商領域流量最大的頁面之一,其性能優化手段可以說是業界標桿,非常全面和深入。這些優化不是單一技術,而是一個完整的體系。 我們可以從以下幾個層面來分析和理解淘寶首頁所做的性能優化: 一、核心指標與整體…

讓醫學數據更直觀——MedCalc 23.1.7 最新版使用體驗

軟件介紹 MedCalc 23.1.7是一款功能強大的生物醫學研究統計軟件,專為醫學科研人員和醫療保健專家設計。它提供了豐富的統計分析工具和方法,旨在幫助用戶更好地分析和解釋醫學數據。以下是該軟件的一些主要特點: 一、數據導入和管理 支持導…

Text2SQL、ChatBI簡介

概述 傳統BI的三大核心瓶頸: 問數之難:不同用戶往往存在個性化的分析邏輯,盡管企業內部已經創建大量報表和看板,但仍然無法完全滿足業務部門對數據的個性化需求。但傳統BI門檻較高,非技術人員在統一培訓前&#xff0…

神經網絡中 標量求導和向量求導

0. 引出問題 在神經網絡反向傳播過程中 loss [loss?,loss?, loss?],為什么 ?loss/?w ?loss?/?w ?loss?/?w ?loss?/?w ?loss?/?w 和 loss 維度一樣都是三位向量 ,[?loss?/?w, ?loss?/?w, ?loss?/?w] 就變成3*3的矩陣 如下所…

tcpdump命令打印抓包信息

tcpdump命令打印抓包信息 下面是在服務器抓取打印服務端7701端口打印 rootgb:/home/gb# ifconfig -a eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.250.251.197 netmask 255.255.255.0 broadcast 10.250.251.255inet6 fe80::76fe:48ff:fe94:5a5 …

Mysql-經典實戰案例(13):如何通過Federated實現跨實例訪問表

實現原理&#xff1a;使用Federated引擎本創建一個鏈接表實現&#xff0c;但是Federated 引擎只是一個按列的順序和類型解析遠程返回的數據流準備工作&#xff1a; 1. 本地庫啟用 Federated 引擎查看是否已啟用&#xff1a; SHOW ENGINES;如果Federated 引擎的 Support 是 YES …

Linux -- 動靜態庫

一、什么是庫1、動靜態庫概念# 庫是寫好的現有的&#xff0c;成熟的&#xff0c;可以復?的代碼。現實中每個程序都要依賴很多基礎的底層庫&#xff0c;不可能每個?的代碼都從零開始&#xff0c;因此庫的存在意義?同尋常。# 本質上來說庫是?種可執?代碼的?進制形式&#x…

Linux筆記---單例模式與線程池

1. 單例模式單例模式是一種常用的設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。這種模式在需要控制資源訪問、管理共享狀態或協調系統行為時非常有用。單例模式的核心特點&#xff1a;私有構造函數&#xff1a;防止外部通過n…

Linux中的指令

1.adduseradduser的作用是創立一個新的用戶。當我們在命令行中輸入1中的指令后&#xff0c;就會彈出2中的命令行&#xff0c;讓我們設立新的密碼&#xff0c;緊接著就會讓我們再次輸入新的密碼&#xff0c;對于密碼的輸入它是不會顯示出來的&#xff0c;如果輸入錯誤就會讓我們…

【n8n】Docker容器中安裝ffmpeg

容器化部署 n8n 時&#xff0c;常常會遇到一些環境依賴問題。缺少 docker 命令或無法安裝 ffmpeg 是較為常見的場景&#xff0c;如果處理不當&#xff0c;會導致流程執行受限。 本文介紹如何在 n8n 容器中解決 docker 命令不可用和 ffmpeg 安裝受限的問題&#xff0c;并給出多…

【基礎算法】初識搜索:遞歸型枚舉與回溯剪枝

文章目錄一、搜索1. 什么是搜索&#xff1f;2. 遍歷 vs 搜索3. 回溯與剪枝二、OJ 練習1. 枚舉子集 ?(1) 解題思路(2) 代碼實現2. 組合型枚舉 ?(1) 解題思路請添加圖片描述(2) 代碼實現3. 枚舉排列 ?(1) 解題思路(2) 代碼實現4. 全排列問題 ?(1) 解題思路(2) 代碼實現一、搜…

Node.js異步編程——async/await實現

一、async/await基礎語法 在Node.Js編程中,async關鍵字用于定義異步函數,這個異步函數執行完會返回一個Promise對象,異步函數的內部可以使用await關鍵字來暫停當前代碼的繼續執行,直到Promise操作完成。 在用法上,async關鍵字主要用于聲明一個異步函數,await關鍵字主要…

搭建一個簡單的Agent

準備本案例使用deepseek&#xff0c;登錄deepseek官網&#xff0c;登錄賬號&#xff0c;充值幾塊錢&#xff0c;然后創建Api key可以創建虛擬環境&#xff0c;python版本最好是3.12&#xff0c;以下是文件目錄。test文件夾中&#xff0c;放一些txt文件做測試&#xff0c;main.p…

uv,下一代Python包管理工具

什么是uv uv&#xff08;Universal Virtual&#xff09;是由Astral團隊&#xff08;知名Python工具Ruff的開發者&#xff09;推出的下一代Python包管理工具&#xff0c;使用Rust編寫。它集成了包管理、虛擬環境、依賴解析、Python版本控制等功能&#xff0c;它聚焦于三個關鍵點…

單片機的輸出模式推挽和開漏如何選擇呢?

推挽和開漏是單片機的輸出模式&#xff0c;屬于I/O口配置的常見類型。開漏&#xff08;Open-Drain&#xff09;和推挽&#xff08;Push-Pull&#xff09;是兩種根本不同的輸出電路結構&#xff0c;理解它們的區別是正確使用任何單片機&#xff08;包括51和STM32&#xff09;GPI…

java18學習筆記-Simple Web Server

408:Simple Web Server Python、Ruby、PHP、Erlang 和許多其他平臺提供從命令行運行的開箱即用服務器。這種現有的替代方案表明了對此類工具的公認需求。 提供一個命令行工具來啟動僅提供靜態文件的最小web服務器。沒有CGI或類似servlet的功能可用。該工具將用于原型設計、即…