共计 2060 个字符,预计需要花费 6 分钟才能阅读完成。
为什么选择随机森林?
随机森林在空间分析中有几个不可替代的优势:

- 能自动处理高维特征数据(比如多光谱遥感影像的数十个波段)
- 通过 bagging 机制天然抗过拟合
- 输出特征重要性排序,帮助理解变量贡献度
- 对异常值和噪声数据不敏感
这些特性使它成为土地利用分类、植被监测等场景的首选算法。
数据准备三要素
1. 训练样本采集规范
在 ArcGIS Pro 中创建训练样本时要注意:
- 每个类别至少采集 50-100 个样本点(小样本可用 SMOTE 算法扩充)
- 使用【影像分类工具栏】的绘制工具时,避免跨越地物边界
- 保存为.shp 或.geodatabase 格式,属性表需包含『class』字段
2. 特征变量选择策略
好的特征工程能显著提升模型效果:
- 优先选择 NDVI、NDWI 等光谱指数
- 加入纹理特征(GLCM 均值 / 方差)
- 地形因子(坡度、高程)对某些分类很关键
- 用【波段组合工具】测试不同特征组合
3. 数据标准化处理
遥感数据通常需要:
- 用【栅格计算器】做 Min-Max 归一化
- 检查 NoData 值(建议统一填充为 -9999)
- 确保所有输入栅格具有相同分辨率 / 坐标系
核心代码实现
# -*- coding: utf-8 -*-
import arcpy
from arcpy.sa import *
# 环境设置
arcpy.env.workspace = "C:/Data/Classification.gdb"
arcpy.env.overwriteOutput = True
# 加载数据
train_samples = "Training_Points" # 训练样本路径
features = ["Band1", "Band2", "NDVI", "Slope"] # 特征变量列表
output_classifier = "RF_Model" # 输出模型名称
# 执行随机森林训练
# 关键参数说明:# ntrees=100 决策树数量(建议 50-500)# max_depth=20 单棵树最大深度(过大会过拟合)# min_samples=5 叶节点最小样本数(防止过拟合)rf_model = TrainRandomForestClassifier(
train_samples, "class", features, output_classifier,
ntrees=100, max_depth=20, min_samples=5
)
# 精度验证
confusion_matrix = "Confusion_Matrix"
accuracy_report = "Accuracy_Report.txt"
# 生成混淆矩阵
arcpy.sa.ClassifyRaster("Composite_Image", rf_model, "Classified_Result")
arcpy.sa.ComputeConfusionMatrix("Classified_Result", train_samples, confusion_matrix)
# 保存精度报告
with open(accuracy_report, 'w') as f:
f.write(str(arcpy.GetMessage(0)))
模型优化技巧
决策树调优
通过交叉验证寻找最佳参数组合:
- 用【迭代工具】测试 ntrees=50/100/200 时的 OA 变化
- 观察验证集精度,当增加树数量不再提升精度时停止
- max_depth 通常设为 10-30,复杂场景可适当增大
特征重要性可视化
# 获取特征重要性
importance = rf_model.featureImportances
# 生成柱状图
import matplotlib.pyplot as plt
plt.barh(features, importance)
plt.savefig('Feature_Importance.png')
并行计算加速
在【地理处理选项】中设置:
- 使用 70% 可用 CPU 核心
- 将大区域拆分为 100×100 的瓦片
避坑指南
样本不平衡问题
- 对少数类过采样(复制样本)
- 在 TrainRandomForestClassifier 中设置 class_weight=’balanced’
坐标系一致性检查
运行前务必执行:
# 检查所有输入数据投影
for fc in [train_samples] + features:
sr = arcpy.Describe(fc).spatialReference
if sr.name != 'WGS_1984_UTM_Zone_50N': # 改为你的目标坐标系
arcpy.Project_management(fc, fc+"_reprojected", sr)
识别过拟合
- 训练集精度 >> 验证集精度(差值 >15% 即可疑)
- 特征重要性前两位占比超过 80%
- 解决方案:增加 min_samples 或添加 L2 正则化
下一步行动建议
用你自己的数据试试:
- 从 Sentinel- 2 影像提取 NDVI 作为特征
- 对城市用地做简单 3 类分类
- 比较不同树数量对结果的影响
遇到问题时检查:
- 所有输入数据坐标系是否一致?
- 样本点是否覆盖了所有地物类型?
- 特征变量间是否存在强相关性(可用【波段统计工具】检查)?
随机森林就像『空间分析瑞士军刀』,多实践几次你就会爱上它的稳定表现。
正文完
发表至: 地理信息系统
近一天内
