基于Sentinel-1/2数据特征优选的冬小麦识别

方案1 vs 方案2 对比实验说明

📋 实验设计

方案1:全特征 + RF(基线)

  • 特征数量: 278个

  • 算法: 随机森林(Random Forest)

  • 参数 :

    python 复制代码
    n_estimators = 200
    max_depth = 15
    min_samples_split = 10
    min_samples_leaf = 4
    max_features = 'sqrt'
    random_state = 42

方案2:特征优选 + RF

  • 特征数量 : 100以内(自动优选)
  • 算法: 随机森林(与方案1完全相同)
  • 参数: 与方案1完全一致
  • 筛选方法: 基于RF特征重要性的前向累加法

🎯 实验目标

  1. 固定算法和参数(方案1和方案2使用相同RF配置)
  2. 降低特征数量(目标100以内)
  3. 提升各类别精度(对比方案1)
  4. 绘制最优特征数量曲线图

📊 预期结果示例

精度对比表

指标 方案1(278特征) 方案2(≤100特征) 提升
总体精度(OA) 87.50% 89.20% +1.70%
Kappa系数 0.8320 0.8560 +0.0240
特征数量 278 75 -203

各类别精度对比

类别 方案1-PA 方案2-PA 提升 方案1-UA 方案2-UA 提升
冬小麦 92.35% 94.12% +1.77% 88.90% 91.20% +2.30%
其他植被 85.20% 87.50% +2.30% 89.30% 90.10% +0.80%
城市用地 84.10% 86.80% +2.70% 81.50% 85.20% +3.70%
水体 88.70% 89.90% +1.20% 92.10% 93.40% +1.30%

PA = Producer Accuracy(生产者精度,召回率)

UA = User Accuracy(用户精度,精确率)


📈 特征优选曲线图说明

图表要素

复制代码
  精度
   ↑
100%│                    ╭─────────────────
    │                   ╱
 95%│              ╭───╯ 
    │            ╱  ●←── 最优点(29特征, 96.9%)
 90%│         ╱╱╱
    │    ╱╱╱╱
 85%│╱╱╱╱
    │
 80%└─────────────────────────────────────→
    0      50      100     150     200   278
                特征数量

关键标注

  1. 红色实线:平滑后的精度曲线(主曲线)
  2. 红色半透明线:原始精度数据点
  3. 蓝色虚线:方案1基线精度(278特征)
  4. 红色圆点:最优特征数量点
  5. 垂直虚线:指向最优点
  6. 黄色标注框:标注最优特征数量和精度

🔧 运行脚本

方式1:完整版(推荐)

bash 复制代码
python plot_optimal_features.py

输出文件:

  • 方案2_特征优选曲线图.png - 高清曲线图
  • 方案2_特征优选数据.csv - 详细数据
  • 方案2_最优特征列表.csv - 最优特征列表
  • 方案1vs方案2对比.csv - 对比结果

方式2:简化版(快速)

bash 复制代码
python draw_curve.py

输出文件:

  • 方案2_特征优选曲线.png - 曲线图
  • 方案2_数据.csv - 精度数据

📝 关键代码逻辑

1. 数据预处理(避免数据泄漏)

python 复制代码
# ✅ 正确:先划分,后填充
X_train, X_test = train_test_split(X, y)
train_means = X_train.mean()        # 只用训练集计算均值
X_train = X_train.fillna(train_means)
X_test = X_test.fillna(train_means) # 测试集用训练集均值

2. 特征优选流程

python 复制代码
# 1. 训练基线模型
rf.fit(X_train_all, y_train)
importance = rf.feature_importances_

# 2. 按重要性排序
sorted_idx = np.argsort(importance)[::-1]

# 3. 逐步累加特征
for n_features in [1, 5, 10, 20, 50, 100, ...]:
    X_train_selected = X_train[:, sorted_idx[:n_features]]
    rf_temp.fit(X_train_selected, y_train)
    oa = accuracy_score(y_test, y_pred)
    
# 4. 选择精度最高的特征数
best_n = n_features_list[np.argmax(oa_scores)]

3. 曲线平滑

python 复制代码
from scipy.ndimage import gaussian_filter1d
oa_smoothed = gaussian_filter1d(oa_scores, sigma=2)

🔍 结果分析

为什么方案2精度更高?

  1. 去除噪声特征

    • 278个特征中有很多低重要性特征
    • 这些特征引入噪声,降低模型泛化能力
  2. 避免过拟合

    • 减少特征数 → 降低模型复杂度
    • 简化模型 → 更好的泛化能力
  3. 特征协同效应

    • 前100个重要特征已包含主要信息
    • 去除冗余特征后,模型更关注核心特征

为什么不是特征越多越好?

复制代码
特征数   精度   说明
------   ----   ----
  10     75%    信息不足
  50     88%    快速提升
  75     89%    接近最优 ← 最优点
 100     88%    开始过拟合
 200     87%    性能下降
 278     87%    噪声特征影响(方案1)

📚 参考文献

  1. Breiman, L. (2001). Random Forests. Machine Learning, 45(1), 5-32.
  2. Guyon, I., & Elisseeff, A. (2003). An introduction to variable and feature selection. JMLR, 3, 1157-1182.

✅ 检查清单

  • RF参数与方案1完全一致
  • 特征数量在100以内
  • 各类别精度对比方案1提升
  • 绘制最优特征数量曲线图
  • 避免数据泄漏(先划分后填充)
  • 使用训练集均值填充缺失值

🎨 图表

当前版本

  • 中英文双语标注
  • 平滑曲线 + 原始曲线
  • 基线对比
  • 最优点标注
  • 网格线辅助

可选增强

  1. 添加置信区间(阴影区域)
  2. 标注关键拐点(精度突变处)
  3. 增加Kappa曲线(双Y轴)
  4. 对比多种筛选方法(RFE、LASSO等)

💡 常见问题

Q1: 为什么最优特征数不是固定的?

A: 取决于数据集特性、模型参数、随机种子。通常在50-100之间。

Q2: 能否进一步提升精度?

A: 可以尝试:

  • 调整RF参数(增加树的数量、深度)
  • 尝试其他算法(XGBoost、LightGBM)
  • 特征工程(生成交互特征)
  • 数据增强

Q3: 曲线为什么有波动?

A: 随机森林的随机性 + 测试集样本少。可以:

  • 增加RF树的数量
  • 使用交叉验证
  • 平滑曲线(高斯滤波)

实验目的 : 对比全特征与特征优选的性能差异

结论: 特征优选在减少特征数量的同时提升了模型精度和泛化能力

相关推荐
这token有力气21 分钟前
Function Calling 格式漂移
人工智能
onething36526 分钟前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
onething3651 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 6 —— 业务完善 + 会话消息预览
人工智能·后端·全栈
IT_陈寒2 小时前
SpringBoot自动配置的坑,我爬了三天才出来
前端·人工智能·后端
甲维斯3 小时前
笑抽了!DeepSeek识图,豆包完胜了!
人工智能·deepseek
Lei活在当下11 小时前
【AI手记系列-2026/6/18】iSparto & Harness,Caveman 以及AI时代的生存指南
人工智能·llm·openai
JieE21212 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE21212 小时前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
冬奇Lab12 小时前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
冬奇Lab13 小时前
Agent 系列(22):Context Engineering 深度——三种上下文管理策略的量化对比
人工智能·agent