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
评论(没有评论)