3. 基于方差阈值的光谱特征筛选与随机森林回归
任务说明
本案例针对光谱数据中大量连续波段存在信息冗余、噪声干扰的问题,使用方差阈值法筛选出光谱变化最剧烈的特征波段,并基于筛选后的特征构建随机森林回归模型,实现对待测属性的定量预测。通过对比全波段与筛选后波段的模型性能,验证方差阈值筛选在简化模型复杂度的同时能否保持或提升预测精度。
数据准备与核心实现
以下代码生成模拟光谱数据集(80个样本,200个波段),其中仅前20个波段与目标属性线性相关,其余波段为纯噪声。方差阈值筛选将自动识别高方差波段,随后使用随机森林回归评估筛选效果。
import numpy as np
from sklearn.feature_selection import VarianceThreshold
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score, KFold
from sklearn.metrics import mean_squared_error, r2_score
# 固定随机种子保证可复现
np.random.seed(42)
n_samples = 80
n_features = 200
# 生成模拟光谱数据:前20个波段为有效信号,其余为噪声
X = np.random.randn(n_samples, n_features) * 0.1
signal = np.linspace(0, 1, n_samples).reshape(-1, 1)
X[:, :20] += signal * 2.0 # 有效波段方差较大
# 目标值:仅与前20个波段线性相关
y = X[:, :20].sum(axis=1) + np.random.normal(0, 0.1, n_samples)
# 方差阈值筛选(默认阈值0.0,此处设为0.05以滤除低方差噪声)
selector = VarianceThreshold(threshold=0.05)
X_selected = selector.fit_transform(X)
selected_indices = selector.get_support(indices=True)
print(f"原始波段数: {n_features}")
print(f"筛选后波段数: {X_selected.shape[1]}")
print(f"保留的波段索引: {selected_indices[:25]}...")
# 随机森林回归模型
rf = RandomForestRegressor(n_estimators=100, random_state=42)
kf = KFold(n_splits=5, shuffle=True, random_state=42)
# 全波段交叉验证
scores_full = cross_val_score(rf, X, y, cv=kf, scoring='r2')
# 筛选后波段交叉验证
scores_selected = cross_val_score(rf, X_selected, y, cv=kf, scoring='r2')
print(f"全波段 R²: {scores_full.mean():.4f} ± {scores_full.std():.4f}")
print(f"筛选后 R²: {scores_selected.mean():.4f} ± {scores_selected.std():.4f}")
# 在筛选后数据上训练最终模型并输出特征重要性
rf.fit(X_selected, y)
importance = rf.feature_importances_
top_idx = np.argsort(importance)[-5:][::-1]
print(f"重要性最高的5个筛选波段索引: {selected_indices[top_idx]}")
代码说明
代码首先生成包含有效信号与噪声的模拟光谱矩阵X,其中前20个波段因叠加了线性信号而具有较大方差。通过VarianceThreshold设置阈值为0.05,自动剔除方差低于该值的噪声波段。随后使用5折交叉验证分别评估全波段与筛选后波段的随机森林回归性能,以R²作为判定指标。最后在筛选后的特征上重新训练模型,输出特征重要性最高的波段索引,用于确认筛选结果保留了有效信号波段。
运行与验证方法
直接运行上述Python脚本即可完成全流程。需要安装numpy、scikit-learn。预期输出中,筛选后波段数应显著小于200(约20个左右),且保留的波段索引集中在前20个有效波段范围内。筛选后R²应接近或高于全波段R²,同时模型输入维度大幅降低,证明方差阈值筛选有效去除了冗余噪声波段。
判定标准
满足以下条件则案例验证通过:
- 筛选后波段数小于原始波段数的50%;
- 筛选后交叉验证R²不低于全波段R²的90%;
- 保留的波段索引中,前20个有效波段占比超过80%。
结果解读
运行脚本后,观察控制台输出的波段筛选数量与交叉验证R²值。若筛选后波段数约为20且R²与全波段相当,说明方差阈值成功识别了信息丰富的波段,去除了大量无贡献的噪声特征。最终模型仅需少量波段即可达到相近预测能力,显著降低了光谱数据采集与模型计算成本。