当前位置: 首页 > news >正文

遥感机器学习入门实战教程|Sklearn案例⑨:数据预处理(Processing)

在前几篇实战中,我们多次用到 StandardScaler 和 MinMaxScaler。有同学问:

“是不是预处理方法越复杂,分类效果就一定更好?”

答案是否定的。预处理的核心是 让特征尺度合理,但是否能提高分类精度,要看数据和模型。本篇通过实验直观对比几种常见预处理方式,看看它们对遥感分类的影响。

🧩 四种常见预处理方法

  • StandardScaler:均值=0,方差=1(最常用)。

  • MinMaxScaler:缩放到 [0,1] 区间。

  • RobustScaler:用中位数和 IQR,抗异常值。

  • Normalizer:把每个样本缩放到单位范数。

💻 实例代码:可视化 + 分类对比

# -*- coding: utf-8 -*-
"""
Sklearn案例⑨:预处理对比
1) PCA 投影可视化
2) 预处理+SVM 分类精度对比
"""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, MinMaxScaler, RobustScaler, Normalizer
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score# ===== 参数 =====
DATA_DIR = "your_path"   # ← 修改为你的数据路径
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)
X_all  = X[coords[:,0], coords[:,1]]
y_all  = Y[coords[:,0], coords[:,1]] - 1X_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. 定义预处理方法 =====
scalers = {"Standard": StandardScaler(),"MinMax": MinMaxScaler(),"Robust": RobustScaler(),"Normalizer": Normalizer()
}# ===== 3. 可视化:PCA 2D 投影对比 =====
plt.figure(figsize=(10,8))
for i, (name, scaler) in enumerate(scalers.items(), 1):Xs = scaler.fit_transform(X_train)pca = PCA(n_components=2, random_state=SEED).fit(Xs)Xp = pca.transform(Xs)plt.subplot(2,2,i)plt.scatter(Xp[:,0], Xp[:,1], c=y_train, s=6, cmap="tab20")plt.title(name); plt.axis("off")plt.suptitle("不同预处理方法的特征分布(PCA投影)", fontsize=14)
plt.tight_layout(rect=[0,0,1,0.96])
plt.show()# ===== 4. 分类精度对比(SVM) =====
results = {}
for name, scaler in scalers.items():Xtr_s = scaler.fit_transform(X_train)Xte_s = scaler.transform(X_test)pca = PCA(n_components=PCA_DIM, random_state=SEED).fit(Xtr_s)Xtr_p = pca.transform(Xtr_s)Xte_p = pca.transform(Xte_s)clf = SVC(kernel="rbf", C=20, gamma=0.005)clf.fit(Xtr_p, y_train)acc = accuracy_score(y_test, clf.predict(Xte_p))results[name] = accprint(f"{name:10s}: OA = {acc*100:.2f}%")# ===== 5. 可视化分类精度 =====
plt.figure(figsize=(7,4))
names, accs = list(results.keys()), [v*100 for v in results.values()]
plt.bar(names, accs, color="skyblue")
for i,a in enumerate(accs):plt.text(i, a+0.3, f"{a:.1f}%", ha='center')
plt.ylabel("Overall Accuracy (%)")
plt.title("不同预处理方法对比 (SVM分类器)")
plt.ylim(min(accs)-5, min(100,max(accs)+6))
plt.tight_layout(); plt.show()

🔍 结果与思考

PCA 可视化:不同预处理方法会改变特征的投影分布。

图片

分类精度对比:有时差别不大,甚至可能几乎相同。

图片

关键点

    • StandardScaler 通常是安全的默认选项;

    • MinMaxScaler 在特征范围差异大时有帮助;

    • RobustScaler 抗异常值;

    • Normalizer 更适合做光谱角或方向性分析。

✅ 总结

  • 预处理≠保证提升精度:它主要是为模型提供合理输入。

  • 选择依赖场景:分类器 + 数据特征决定了预处理的必要性。

  • 建议:做实验时至少尝试 StandardScaler 和 MinMaxScaler,并结合结果选择。

欢迎大家关注下方我的公众获取更多内容!

http://www.xdnf.cn/news/1353619.html

相关文章:

  • 不用 if-else,Spring Boot 怎么知道 ?status=10 是哪个枚举?
  • 小白成长之路-k8s原理(一)
  • STM32学习笔记19-FLASH
  • [Mysql数据库] 选择备份策略选择题
  • 工业场景烟雾识别误报率↓82%!陌讯多模态融合算法实战解析
  • 水泉村信息化服务小程序的设计与实验
  • 54 C++ 现代C++编程艺术3-移动构造函数
  • 用 Go + GitHub Models API 打造一个免费的 ChatBot
  • 全面解析JVM预热:原理、价值与实践指南
  • MYSQL-约束
  • 【数据结构】线性表——链表
  • 微服务的编程测评系统15-头像上传-OSS
  • 高阶数据结构---ST表
  • kafaka知识要点
  • VLOOKUP专题训练
  • UE C++ 堆化
  • windows中bat脚本的一些操作(三)
  • 算法第五十五天:图论part05(第十一章)
  • 图论与最短路学习笔记
  • 【数据结构】跳表的概率模型详解与其 C 代码实现
  • 深度学习开篇
  • `strlen` 字符串长度函数
  • python 字典有序性的实现和OrderedDict
  • 计算机网络 各版本TLS握手的详细过程
  • 电脑零广告快响应提速(一)之卸载搜狗输入法使用RIME—东方仙盟
  • python re模块常用方法
  • MySQL详细介绍指南
  • 蓝牙aoa仓库管理系统功能介绍
  • [e3nn] 归一化 | BatchNorm normalize2mom
  • 【技术突破】动态目标误检率↓83.5%!陌讯多模态融合算法在智慧城管的实战优化