ArcGIS决策树分类实战:从数据预处理到模型调优全流程解析

1次阅读
没有评论

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

image.webp

传统遥感分类的局限性

在 GIS 领域干了十几年,最大的感受就是:传统最大似然分类像把钝刀子。遇到城市混合用地(比如绿化带 + 建筑阴影)时,分类结果总会出现大面积椒盐噪声。去年做某开发区土地覆盖项目时,用最大似然法得到的总体精度只有 68%,而决策树轻松冲到 85% 以上——这 17% 的差距直接决定了项目验收时的甲方表情。

ArcGIS 决策树分类实战:从数据预处理到模型调优全流程解析

技术选型对比

实测 ArcGIS Pro 3.0 环境下,用同一组哨兵 2 号数据(10m 分辨率):

  • 训练速度 (1000 个样本):
  • 决策树:42 秒
  • 随机森林:3 分 15 秒
  • SVM:8 分 37 秒

  • 显存占用

  • 决策树峰值占用仅 1.2GB
  • 随机森林训练时爆过 6GB 显存
  • SVM 需要预先分配 5GB 缓存

特别提醒:如果显卡是 GTX1060 这种老卡,建议优先考虑决策树。去年用随机森林处理珠海市 200km²数据时,显卡驱动崩溃了 3 次 …

核心实现流程

1. 数据预处理

先上 NDVI 计算的 ArcPy 代码(注意处理负值问题):

import arcpy
from arcpy.sa import *

# 处理异常值
with arcpy.EnvManager(extent="MAXOF"):
    red_band = Raster("B4.tif") * 0.0001  # 哨兵 2 号需要缩放
    nir_band = Raster("B8.tif") * 0.0001
    ndvi = (nir_band - red_band) / (nir_band + red_band + 0.0001)  # 避免除零
    ndvi.save("NDVI.tif")

2. 高效数据转换

用 FeatureClassToNumPyArray 比直接读 shapefile 快 20 倍:

arr = arcpy.da.FeatureClassToNumPyArray(
    in_features="samples.shp",
    field_names=["NDVI", "NDWI", "Class"],
    where_clause="Class IS NOT NULL"  # 过滤空值
)
X = np.array([arr["NDVI"], arr["NDWI"]]).T
y = arr["Class"]

3. 参数调优实战

GridSearchCV 结合 ArcGIS 的独特参数:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV

param_grid = {'max_depth': [3, 5, 7],
    'min_samples_leaf': [1, 3, 5],
    'splitter': ["best", "random"]  # ArcGIS 特有参数
}

grid_search = GridSearchCV(DecisionTreeClassifier(),
    param_grid,
    cv=5,
    n_jobs=4  # 调用多核
)
grid_search.fit(X, y)
print(f"最佳参数:{grid_search.best_params_}")

避坑指南

NoData 处理的三种方案

  1. 简单粗暴法 (适合小数据量):

    arcpy.management.CalculateStatistics("NDVI.tif", ignore_values=[0])

  2. 掩膜替换法 (推荐方案):

    null_raster = Con(IsNull("NDVI.tif"), 0, "NDVI.tif")

  3. 插值法 (耗时但精确):

    arcpy.sa.FocalStatistics("NDVI.tif", "Circle 3 CELL", "MEAN")

投影自动化纠正

用这段脚本自动统一投影(曾帮我省下 3 小时手工操作):

import os

def batch_project(input_folder, output_csr):
    for root, _, files in os.walk(input_folder):
        for file in files:
            if file.endswith('.tif'):
                in_raster = os.path.join(root, file)
                out_raster = os.path.join(root, "prj_" + file)
                arcpy.ProjectRaster_management(
                    in_raster, out_raster, output_csr,
                    "NEAREST", "10 10"  # 保持原始分辨率
                )

性能优化技巧

并行计算配置

在 ArcGIS Pro 的 Python 环境中,这个参数能让处理速度翻倍:

arcpy.env.parallelProcessingFactor = "75%"  # 预留 25% 内存给系统 

内存管理

GIS 数据处理最怕内存泄漏,养成好习惯:

large_raster = arcpy.Raster("big_data.tif")
# 处理代码...
del large_raster  # 立即释放
arcpy.ClearWorkspaceCache()  # 清理工作空间缓存 

流程图示例

用 Mermaid 展示决策树分类流程:

graph TD
    A[原始影像] --> B[计算光谱指数]
    B --> C[样本数据提取]
    C --> D{数据质量检查}
    D -->| 通过 | E[训练决策树]
    D -->| 不通过 | F[数据清洗]
    E --> G[模型评估]
    G --> H[分类结果输出]

QGIS 兼容性改造

如果需要迁移到 QGIS,主要修改点:
1. 将 arcpy.sa 替换为 QGIS 的 Processing 算法
2. 用 GDAL 命令替代 ArcGIS 地理处理工具
3. 样本数据建议转存为 GeoPackage 格式

改过最痛的一个项目:原本在 ArcGIS 用 10 行代码实现的流程,QGIS 版写了 80 多行 … 建议提前预留 30% 的改造时间。

结语

决策树分类就像瑞士军刀——不是最锋利的,但绝对是 GIS 工程师包里最实用的。上周刚用这套方法完成了雄安新区 200km²的林地动态监测,从数据准备到成果输出只用了 6 小时。记住:好的分类结果 =60% 的数据质量 +30% 的参数调优 +10% 的运气,祝大家少遇 bug,多出图!

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