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

X_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] = acc
    print(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,并结合结果选择。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遥感AI实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值