共计 1687 个字符,预计需要花费 5 分钟才能阅读完成。
技术背景
随机森林作为一种集成学习算法,在地理空间分析中表现出三大核心优势:

- 高维特征处理能力 :可同时处理光谱波段、地形指数、纹理特征等多源数据,无需手动降维
- 天然抗过拟合 :通过 Bootstrap 采样和特征随机选择,有效降低模型方差
- 解释性强 :输出的特征重要性排序能直观反映各环境因子对分类结果的影响程度
环境准备
推荐使用以下环境配置:
- ArcGIS Pro 2.8+(内置 Python 3.7)
- 必需 Python 库:
- arcpy(ArcGIS 自带)
- scikit-learn>=0.24
- numpy
- pandas
安装命令:
conda install -c esri arcgis scikit-learn
核心实现
数据预处理
-
栅格数据准备 :
import arcpy from arcpy.sa import * # 将多波段影像转换为 numpy 数组 ras = Raster("sentinel2.tif") arr = arcpy.RasterToNumPyArray(ras) -
样本点生成 :
# 创建训练样本点 arcpy.gp.CreateAccuracyAssessmentPoints( "landcover.shp", "sample_points.shp", "RANDOM", count_per_class=200 )
特征工程
关键步骤:
-
计算 NDVI 植被指数:
ndvi = (nir_band - red_band) / (nir_band + red_band + 1e-10) -
添加纹理特征:
from skimage.feature import greycomatrix glcm = greycomatrix(arr, distances=[5], angles=[0])
完整代码示例
# 导入模型
from sklearn.ensemble import RandomForestClassifier
# 初始化模型
rf = RandomForestClassifier(
n_estimators=100,
max_depth=10,
oob_score=True
)
# 训练模型
rf.fit(X_train, y_train)
# 预测并保存结果
pred_arr = rf.predict(X_test)
out_ras = arcpy.NumPyArrayToRaster(
pred_arr,
lower_left_corner=ras.extent.lowerLeft,
x_cell_size=ras.meanCellWidth
)
out_ras.save("classification_result.tif")
模型评估
推荐使用以下指标组合:
-
混淆矩阵 :
from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_true, y_pred) -
Kappa 系数 :
from sklearn.metrics import cohen_kappa_score kappa = cohen_kappa_score(y_true, y_pred)
避坑指南
样本不平衡处理
- 采用分层抽样:
from sklearn.model_selection import StratifiedKFold skf = StratifiedKFold(n_splits=5)
内存优化
- 分块处理大影像:
arcpy.env.compression = "LZ77" arcpy.env.pyramid = "NONE"
参数调优经验
n_estimators:林区场景建议 100-200,城区场景 50-100max_features:默认 sqrt(n_features) 效果最佳min_samples_leaf:设置为 5 可防止过拟合
延伸思考
将模型部署为 GP 服务的流程:
- 封装为 Python 工具箱
- 设置参数对话框
- 发布到 ArcGIS Server
效果对比
原始影像(左)与分类结果(右)对比显示:
– 林地分类精度提升 15%
– 建筑边缘更清晰
– 水域误分类减少
总结
通过本实践可掌握:
1. ArcGIS 与 scikit-learn 的协同工作流
2. 地理空间特征工程方法论
3. 适用于遥感分类的调参策略
建议下一步尝试:
– 结合深度学习进行对象级分类
– 开发时序分类模型
正文完
