ArcGIS Pro 中随机森林分类与制图实战:从数据准备到成果输出

1次阅读
没有评论

共计 2319 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景与痛点

传统的地理空间分类方法,比如最大似然分类或决策树,往往面临几个常见问题:

ArcGIS Pro 中随机森林分类与制图实战:从数据准备到成果输出

  • 对异常值敏感,容易受到噪声干扰
  • 分类边界过于刚性,难以捕捉复杂地物特征
  • 需要严格的统计分布假设
  • 调参过程繁琐,且效果提升有限

随机森林算法通过集成多个决策树,有效解决了这些问题。它的核心优势在于:

  • 能够自动处理高维特征
  • 对异常值和噪声具有鲁棒性
  • 提供特征重要性评估
  • 内置交叉验证机制(通过 OOB 误差)
  • 无需复杂的数据预处理

环境准备

在开始之前,请确保你的环境满足以下要求:

  • ArcGIS Pro 2.7 或更高版本
  • Python 环境(建议使用 ArcGIS Pro 自带的)

需要安装的 Python 库:

# 在 ArcGIS Pro 的 Python 环境中运行
import arcpy
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd

如果缺少某些库,可以通过 ArcGIS Pro 的 Python 包管理器或命令行安装:

conda install scikit-learn pandas

核心实现

数据预处理

  1. 训练样本采集
  2. 使用 ArcGIS Pro 的影像分类工具创建训练样本
  3. 确保每个类别有足够多的样本点(建议每类至少 50 个)
  4. 样本应均匀分布在整个研究区域

  5. 特征工程

  6. 提取多光谱波段的反射率值
  7. 可以添加 NDVI、NDWI 等指数作为额外特征
  8. 考虑纹理特征(如 GLCM)用于区分相似地物

模型训练

以下是使用 arcpy 调用 scikit-learn 随机森林的核心代码框架:

# 将训练样本转换为 numpy 数组
train_data = arcpy.RasterToNumPyArray(training_raster)
labels = arcpy.RasterToNumPyArray(training_labels)

# 将数据重塑为 2D 数组(样本数 x 特征数)nsamples, nrows, ncols = train_data.shape
train_data = train_data.reshape(nsamples, nrows * ncols)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(train_data, labels, test_size=0.3, random_state=42)

# 初始化随机森林模型
rf = RandomForestClassifier(
    n_estimators=100,  # 树的数量
    max_depth=None,    # 树的最大深度
    min_samples_split=2,  # 分裂所需最小样本数
    oob_score=True,    # 计算 OOB 误差
    random_state=42,
    n_jobs=-1         # 使用所有 CPU 核心
)

# 训练模型
rf.fit(X_train, y_train)

# 评估模型
print("OOB score:", rf.oob_score_)
print("Test accuracy:", rf.score(X_test, y_test))

关键参数解释

  • n_estimators:森林中树的数量,通常越大越好,但会增加计算时间
  • max_depth:限制树的最大深度,防止过拟合
  • min_samples_split:节点分裂所需的最小样本数
  • oob_score:是否使用袋外样本来估计泛化精度
  • class_weight:处理类别不平衡问题

结果可视化

模型训练完成后,我们可以将分类结果应用到整个研究区域:

# 对整个区域进行分类
full_raster = arcpy.RasterToNumPyArray(input_raster)
full_data = full_raster.reshape(-1, nrows * ncols)

# 预测
predictions = rf.predict(full_data)

# 将预测结果保存为栅格
output_raster = arcpy.NumPyArrayToRaster(predictions.reshape(full_raster.shape[1], full_raster.shape[2]),
    arcpy.Point(full_raster.extent.XMin, full_raster.extent.YMin),
    full_raster.meanCellWidth,
    full_raster.meanCellHeight
)

# 保存结果
output_raster.save("Classification_Result.tif")

在 ArcGIS Pro 中渲染分类结果:

  1. 右键点击分类结果图层,选择 ”Symbology”
  2. 选择 ”Unique Values” 渲染类型
  3. 为每个类别分配合适的颜色
  4. 添加图例、比例尺等地图元素
  5. 调整布局,导出为图片或 PDF

避坑指南

处理类别不平衡

  • 使用 class_weight="balanced" 参数
  • 对少数类进行过采样
  • 在训练样本收集中确保各类样本数量均衡

避免过拟合

  • 限制 max_depth 参数
  • 增加 min_samples_split
  • 使用交叉验证评估模型

大内存数据集处理

  • 使用 partial_fit 方法分批训练
  • 降低 n_estimators
  • 考虑使用 Dask 或 Spark 进行分布式计算

进阶思考

尝试以下方法进一步提升分类精度:

  • 添加时序特征(多时相影像)
  • 结合 LiDAR 或 SAR 数据
  • 使用特征选择方法剔除不重要特征
  • 尝试不同的集成方法(如 ExtraTrees)

随机森林在 ArcGIS Pro 中的应用只是地理空间分析的起点。随着经验的积累,你可以探索更复杂的模型和更精细的特征工程方法,以获得更好的分类效果。

正文完
 0
评论(没有评论)