遥感机器学习入门实战教程|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
,并结合结果选择。
欢迎大家关注下方我的公众获取更多内容!