遙感機器學習入門實戰教程|Sklearn案例⑦:特征選擇與重要性分析

很多同學問:波段/特征一多就“維度災難”,訓練慢、過擬合,且很難解釋“哪些特征最關鍵”。本篇用 sklearn 給出一套能跑、可視化、可比較的最小工作流,并配上方法論速記,幫助你在高光譜/多特征任務里做出穩健篩選。

🎯 你將學到

  • 三大范式的特征選擇:Filter / Wrapper / Embedded
  • 為什么有效:統計相關性 vs. 子集搜索 vs. 模型內置重要性
  • 如何落地:一段精簡代碼完成選擇→訓練→可視化→對比

🧠 方法論速記

  1. Filter(過濾法):先驗統計量直接篩特征,不依賴具體模型,速度快。

    • 例:Chi2/卡方檢驗,衡量特征與標簽的獨立性(需要非負特征)。
    • 適用:快速粗篩,移除無信息/弱相關特征。
  2. Wrapper(包裹法):把“選特征”當搜索問題,用模型性能做打分,通常更準但更慢。

    • 例:RFE(遞歸特征消除):訓練模型→按重要性剔除最差→重復,直到剩 K 個。
    • 適用:樣本量中小、追求更優子集、可接受計算成本。
  3. Embedded(嵌入法):使用帶稀疏/重要性機制的模型,邊訓練邊選擇

    • 例:隨機森林特征重要性(基于分裂增益/不純度減少)。
    • 適用:想要可解釋、穩健的一次性重要性排序。

實戰建議:Filter 粗篩 → Embedded 排序 → Wrapper 精修。多法交叉,關注一致入選的“關鍵波段”。

💻 一鍵可跑代碼(簡潔版)

僅需把 DATA_DIR = "your_path" 改成你的數據目錄(包含 KSC.matKSC_gt.mat)。

# -*- coding: utf-8 -*-
"""
Sklearn案例⑦:特征選擇與重要性分析(簡潔可跑)
方法:Chi2 / RFE(Logistic) / RF-Importance
可視化:重要性曲線、入選熱圖、精度對比
"""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 MinMaxScaler
from sklearn.feature_selection import SelectKBest, chi2, RFE
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score# ===== 路徑與參數 =====
DATA_DIR   = "your_path"   # ← 修改為你的數據文件夾
TRAIN_RATIO= 0.3
SEED       = 42
K_SELECT   = 30            # 目標特征數# ===== 1) 載入有標注像素 =====
X_cube = sio.loadmat(os.path.join(DATA_DIR, "KSC.mat"))["KSC"].astype(np.float32)
Y_map  = sio.loadmat(os.path.join(DATA_DIR, "KSC_gt.mat"))["KSC_gt"].astype(int)
coords = np.argwhere(Y_map != 0)
X_all  = X_cube[coords[:,0], coords[:,1]]              # (N, B)
y_all  = Y_map[coords[:,0], coords[:,1]] - 1           # 0-basedX_train, X_test, y_train, y_test = train_test_split(X_all, y_all, train_size=TRAIN_RATIO, stratify=y_all, random_state=SEED
)# ===== 2) 預處理:MinMax 到 [0,1](Chi2 需非負;其余方法也可用)=====
scaler = MinMaxScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test  = scaler.transform(X_test)
B = X_train.shape[1]# ===== 3) 三種選擇法 =====
# 3.1 Filter: Chi2(統計相關性,快)
chi2_sel  = SelectKBest(chi2, k=K_SELECT).fit(X_train, y_train)
mask_chi2 = chi2_sel.get_support()# 3.2 Wrapper: RFE(Logistic)(用性能做打分,精細但慢)
#    收斂穩健:用 saga + 充分迭代,避免 lbfgs 收斂告警
lr = LogisticRegression(solver="saga", penalty="l2", C=1.0,max_iter=5000, n_jobs=-1, random_state=SEED)
rfe = RFE(estimator=lr, n_features_to_select=K_SELECT).fit(X_train, y_train)
mask_rfe = rfe.support_# 3.3 Embedded: RF-Importance(模型內置重要性,一次性排序)
rf = RandomForestClassifier(n_estimators=200, random_state=SEED, n_jobs=-1).fit(X_train, y_train)
importances = rf.feature_importances_
topk_idx = np.argsort(importances)[::-1][:K_SELECT]
mask_rf = np.zeros(B, dtype=bool); mask_rf[topk_idx] = True# ===== 4) 評估:統一用RF在子集上測OA =====
def eval_mask(mask, name):clf = RandomForestClassifier(n_estimators=200, random_state=SEED, n_jobs=-1)clf.fit(X_train[:,mask], y_train)acc = accuracy_score(y_test, clf.predict(X_test[:,mask]))return name, acc*100results = [eval_mask(np.ones(B, dtype=bool), "All"),eval_mask(mask_chi2, "Chi2"),eval_mask(mask_rfe,  "RFE"),eval_mask(mask_rf,   "RF-TopK")
]# ===== 5) 可視化 A:隨機森林重要性曲線 =====
plt.figure(figsize=(8,3))
plt.plot(importances, marker='o', linewidth=1.2)
plt.title("A) 隨機森林特征重要性")
plt.xlabel("波段索引"); plt.ylabel("重要性")
plt.grid(alpha=0.3); plt.tight_layout(); plt.show()# ===== 6) 可視化 B:三法入選熱圖(方法 × 波段)=====
select_mat = np.vstack([mask_chi2, mask_rfe, mask_rf]).astype(int)
plt.figure(figsize=(8,2.5))
plt.imshow(select_mat, aspect='auto', cmap='Greens')
plt.yticks([0,1,2], ["Chi2","RFE","RF-TopK"])
plt.xlabel("波段索引"); plt.title("B) 三法選中特征對比(1=入選)")
plt.colorbar(label="是否入選", fraction=0.05, pad=0.04)
plt.tight_layout(); plt.show()# ===== 7) 可視化 C:特征子集精度對比 =====
names, accs = zip(*results)
plt.figure(figsize=(6,3))
plt.bar(names, accs)
for i,a in enumerate(accs): plt.text(i, a+0.6, f"{a:.1f}%", ha='center')
plt.ylabel("OA(%)"); plt.title("C) 子集精度對比(統一RF評估)")
plt.ylim(min(accs)-5, min(100, max(accs)+6))
plt.grid(axis='y', alpha=0.25, linestyle='--')
plt.tight_layout(); plt.show()print("\n=== 精度匯總 ===")
for n,a in results: print(f"{n:8s}: {a:.2f}%")

🔍 如何讀圖與用圖

  • 重要性曲線(A):波段層面的“貢獻度”直觀譜型;峰值對應的波段往往很關鍵。
    在這里插入圖片描述

  • 入選熱圖(B):對比不同方法的“共識帶”,交集/高頻入選波段通常是穩健特征
    在這里插入圖片描述

  • 精度對比(C):用統一評估器(RF)衡量不同子集的有效性;若精選子集與全特征接近或更好,說明篩選成功。

在這里插入圖片描述

? 實戰建議

  • 先快后準:用 Chi2 快速減容,再用 RF 排序抓關鍵,再用 RFE 小范圍“打磨”。
  • 關注共識特征:多法一致入選的波段,優先保留。
  • 結合業務知識:把選出的關鍵波段與地物機理對照(吸收峰、紅邊等),提升解釋力。
  • 穩定性檢查:換劃分/種子,觀察被選特征的一致性。

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

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

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

相關文章

地理數據制備:蔚藍地圖空氣質量數據的獲取、清洗與坐標匹配指南

【📊】手把手攻略:如何從“蔚藍地圖”挖寶——獲取濟南市可用空氣質量數據全記錄 一份不需要寫代碼也能搞定環境數據獲取的實用指南 ? 引言:為什么選擇蔚藍地圖? 作為一名環境數據愛好者,我經常需要獲取準確、可靠、…

Unreal Engine USceneComponent

Unreal🏛 Unreal Engine - USceneComponent📚 定義🏷 類繼承? 關鍵特性?? 常見配置🛠? 使用方法🔗 創建與掛載🔄 獲取與修改 Transform🧩 附加/分離組件🏊 典型應用場景&#x1…

2025年9月5090工作站、

在深度學習與大模型訓練領域,算力是決定研發效率與模型性能的核心要素,而顯卡作為算力輸出的核心硬件,其性能參數直接影響著訓練任務的速度、穩定性與成本控制。對于企業與科研機構而言,選擇一套適配自身需求且性價比優異的顯卡及…

亞矩陣云手機:亞馬遜第三方店鋪多賬號安全合規運營的核心技術支撐

亞矩陣云手機在亞馬遜第三方店鋪多賬號安全合規運營的技術支持,通過硬件級虛擬化、AI 行為建模、動態資源調度三大核心技術模塊,構建了覆蓋設備、網絡、行為、數據的四維防御體系,確保賬號在亞馬遜平臺規則下的長期穩定運行。以下從技術架構、…

使用C++11改進工廠方法模式:支持運行時配置的增強實現

在軟件開發中,工廠方法模式是一種常用的設計模式,用于創建對象。通過使用C11的新特性,我們可以進一步改進工廠方法模式,使其更加靈活和高效。本文將詳細介紹如何使用C11的std::function、lambda表達式和智能指針來實現一個支持運行…

小程序插件使用

插件介紹 插件是對一組 js 接口、自定義組件 或頁面的封裝,用于嵌入到小程序中使用。插件不能獨立運行,必須嵌入在其他小程序中才能被用戶使用;而第三方小程序在使用插件時,也無法看到插件的代碼。因此,插件適合用來封…

要區分一張圖片中的網狀圖(如網格結構或規則紋理)和噪點(隨機分布的干擾像素),比如電路的方法 計算機視覺

要區分一張圖片中的網狀圖(如網格結構或規則紋理)和噪點(隨機分布的干擾像素),需結合圖像預處理、特征提取和分割算法。以下是系統化的解決方案,分階段說明關鍵技術和算法選擇: 🔍 一…

06_并發編程高級特性

第6課:并發編程高級特性 課程目標 掌握context包的使用 理解sync包中的同步原語 學會處理并發安全問題 掌握性能優化技巧 1. Context包 1.1 Context基礎 import ("context""fmt""time" )// 基本Context使用 func basicContext()

X00238-非GNSS無人機RGB圖像衛星圖像視覺定位python

獲取方式見文末,可開發票隨著無人機在工業和科研領域應用的加速發展,在非城市環境中使用無gnss、基于視覺的方法進行無人機定位的需求日益增長。本文提出了一種基于視覺的定位算法,利用深度特征計算無人機在野外飛行的地理坐標。該方法基于匹…

Eino 開源框架全景解析 - 以“大模型應用的搭積木指南”方式理解

Eino 開源框架全景解析 - 大模型應用的搭積木指南 🎯 什么是 Eino?一句話概括 Eino 是字節跳動開源的大語言模型應用開發框架,就像是一個專門為 AI 應用設計的"搭積木工具箱",讓開發者能夠像搭樂高一樣輕松構建復雜的 A…

嵌入式開發中,usb通信中輸出端點和輸入端點

一. 簡介本文簡單學習一下,嵌入式開發中,usb的輸出端點和輸入端點。在嵌入式開發的 USB 通信場景中,輸出端點(OUT Endpoint) 和 輸入端點(IN Endpoint) 是 USB 設備與主機(如電腦、嵌…

【自用】Maven常用依賴

【自用】Maven常用依賴 工具類 Guava Guava(Google Guava)是由Google團隊開發的一套Java開源工具庫,旨在簡化和增強Java開發者的日常工作。它提供了許多實用的工具和基礎設施,覆蓋了集合、并發、字符串處理、I/O、數學運算等多個…

Java 18 新特性及具體應用

目錄 1. UTF-8 默認編碼 (JEP 400) 2. 簡單 Web 服務器 (JEP 408) 3. Javadoc 代碼片段 (JEP 413) 4. switch 模式匹配 (JEP 420, 第二次預覽) 5. 向量 API (JEP 417, 第三次孵化) 總結 Java 18 于 2022 年 3 月發布,引入了多項新特性,旨在提升開發…

unistd.h 常用函數速查表

在這篇文章中,我們將整理一份 unistd.h 常用函數速查表,便于快速查找和記憶,涵蓋文件 I/O、進程管理、系統信息、用戶/組信息等方面。unistd.h 常用函數速查表(POSIX/Linux/macOS) 1. 文件與 I/O 操作函數說明示例int …

【電子通識】芯片生產考驗“三重門”之CP、FT與WAT測試

在我們日常生活中,從手機、電腦到汽車、家電,都離不開一顆顆小小的芯片。你可曾想過,這些功能強大的芯片在出廠前要經過怎樣嚴苛的“體檢”才能保證質量可靠?今天,我們就來聊聊芯片制造過程中三道至關重要的測試關卡&a…

Java RESTful API 構建從入門到精通:一步步打造高效后端服務

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! 在當今數字化時代,RESTful API 已成為現代Web應用的核心組成部分,它提供了一種標準化、靈活的方式來實現前后端分離和跨平臺數據交互。本文作為一篇完整的指南,將從基礎概念入手,詳細闡述…

TypeScript 接口(interface)

一、接口基礎概念接口(interface)是 TypeScript 的核心類型系統工具,用于定義對象的結構規范。它不關心具體實現細節,只強制要求符合接口定義的對象必須包含指定屬性和方法。例如:interface Person {name: string;age:…

selenium3.141.0執行JS無法傳遞element解決方法

問題:在Chrome 131版本以下執行下面代碼沒有問題,但是在131版本以上出現element無法傳遞問題,執行下面代碼會出現 "Message: javascript error: Cannot read properties of undefined (reading click)"# xpath匹配元素,…

汽車主機廠為何開始押注平臺化視覺?

近年來,隨著智能制造、出口質量標準、新能源整車結構復雜度等多重因素疊加,越來越多主機廠開始從“點狀部署”轉向“系統化導入”,平臺化的AI視覺檢測體系正逐步成為整車廠的標準化選項。在過去,汽車制造四大車間——焊裝、涂裝、…

STM32 - Embedded IDE - GCC - 重定向printf到串口

導言如上所示,在不同的編譯器下,重定向printf到串口時,使用的函數不一樣。 ARMCC(Keil-MDK)使用fputc()GCC使用_write() 總之,GCC/newlib的printf()走_write(),不是fputc()。