遥感机器学习入门实战教程|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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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()。