这次我们来看一个在 ArcGIS Pro 中结合机器学习进行空间数据预处理的实战教程。对于地理信息科学、城市规划、环境监测等领域的研究者和开发者来说,将机器学习模型应用于空间分析是提升预测精度和洞察深度的关键一步。然而,一个常见的瓶颈在于:如何将复杂的空间数据(如矢量、栅格)高效、正确地转化为机器学习模型能够“消化”的格式。本教程的核心就是打通从 ArcGIS Pro 到主流机器学习框架(如 Scikit-learn)的数据桥梁,让你能专注于模型本身,而非繁琐的数据转换。

本文将重点拆解 ArcGIS Pro 中用于机器学习数据预处理的几个核心工具与流程。我们会先快速了解 ArcGIS Pro 在此场景下的核心能力与硬件门槛,然后通过一套完整的实操流程,从数据准备、特征提取、数据导出到格式转换,一步步带你完成空间数据的“机器学习就绪”处理。无论你是想用栅格数据做土地利用分类,还是用矢量点数据做房价预测,这篇文章提供的思路和步骤都能直接套用。

1. 核心能力速览

在 ArcGIS Pro 中为机器学习准备数据,并非依赖某个单一的“魔法按钮”,而是通过一系列地理处理工具和数据分析流程的组合来实现。下表概括了其核心能力与相关要点:

能力项 说明与工具
数据处理核心 将空间数据(矢量要素、栅格像元)转换为可供机器学习算法使用的结构化表格数据(如 CSV、特征图层)。
关键工具集 “空间分析”工具箱 “转换”工具箱 “Multidimension 工具箱” 、以及 “GeoAI” 相关工具(如“森林”工具用于基于树的模型)。
主要输出格式 CSV 文件、要素类属性表、NumPy 数组(通过 ArcPy)。这些格式可直接被 Pandas、Scikit-learn 等库读取。
核心预处理操作 特征提取(如从栅格提取值到点)、数据清洗(处理空值、异常值)、特征工程(创建新字段,如密度、距离)、数据采样(训练/测试集空间分割)。
环境要求 ArcGIS Pro 软件授权 (核心前提)。对硬件无特殊要求,但处理大规模栅格或复杂分析时, 大内存(≥16GB)和 SSD 硬盘 能显著提升体验。GPU 主要用于深度学习工具(如影像分割),传统机器学习预处理不强制需要。
适合场景 地理空间预测模型(如犯罪热点预测)、遥感影像分类、环境变量建模、社会经济指标空间分析等任何需要将地理位置作为特征或标签的机器学习任务。

2. 适用场景与使用边界

这个教程和技能组合非常适合以下几类人群:

  • GIS 分析师/科学家 :希望超越传统空间统计,利用机器学习挖掘更复杂的地理模式。
  • 数据科学家/机器学习工程师 :业务涉及空间数据,需要将地理信息有效整合到现有机器学习流水线中。
  • 高校相关专业师生 :进行地理信息科学、城市规划、生态学等领域的课题研究或项目开发。

它能解决的核心问题

  1. 格式鸿沟 :解决空间数据(带几何信息)与机器学习标准输入(表格/数组)之间的转换问题。
  2. 特征构建 :利用 GIS 强大的空间分析能力(如缓冲区分析、叠加分析、距离计算)批量创建具有地理意义的特征变量。
  3. 空间化采样 :确保训练集和测试集的划分考虑空间自相关性,避免模型评估过于乐观。

需要注意的边界与限制

  • 软件门槛 :必须拥有可用的 ArcGIS Pro 许可。这是一个商业软件,是开展所有工作的基础平台。
  • 非自动化流水线 :ArcGIS Pro 本身不提供端到端的 AutoML 式机器学习建模流水线。它更擅长于 数据预处理和特征工程 ,建模和调参通常需要在 Python 环境中(如 Jupyter Notebook)利用 Scikit-learn、PyTorch 等库完成。
  • 大数据挑战 :处理全国或全球尺度的高分辨率栅格数据时,可能会遇到性能瓶颈。需要合理的数据切片、采样策略或使用分布式计算框架(如 Spark)进行后续处理。
  • 领域知识依赖 :构建有效的空间特征严重依赖于对具体业务和地理过程的理解,工具只是辅助。

3. 环境准备与前置条件

在开始实操之前,请确保你的工作环境已就绪。

1. 软件基础:

  • ArcGIS Pro :确保已安装并拥有有效许可。建议使用较新版本(如 3.x),以获得更稳定的 Python 环境和工具支持。你可以从 Esri 官网或组织内部分发渠道获取安装包。
  • Python 环境 :ArcGIS Pro 自带一个内置的 Python 环境(通常为 Conda 环境)。我们将主要使用这个环境。确保你知道如何通过 ArcGIS Pro 的“Python”命令面板或外部 IDE(配置好解释器路径)来访问它。

2. 数据准备:

  • 示例数据 :为了跟随本教程,你需要准备一些空间数据。可以是:
    • 矢量数据 :一个包含目标变量(如房价 Price )的点要素类( House_Points.shp ),以及一些可能相关的面状辅助数据(如学区 School_Districts.shp 、公园 Parks.shp )。
    • 栅格数据 :一个或多个栅格图层(如高程 DEM.tif 、土地利用 LandUse.tif )。
  • 数据管理 :建议在 ArcGIS Pro 中创建一个新的工程文件( .aprx ),并将所有数据整理到同一个文件夹或地理数据库中,以便管理。

3. 知识预备:

  • 基本熟悉 ArcGIS Pro 的界面操作(地图视图、目录窗格、地理处理窗格)。
  • 了解机器学习的基本概念(特征、标签、训练集、测试集)。
  • 对 Python 和 Pandas 有基础了解会更佳,但不是必须。

4. 数据预处理核心流程实操

下面我们以一个经典的场景为例: 预测城市房屋价格 。我们拥有房屋点位数据(含价格标签)和多个可能影响房价的空间要素(如到地铁站距离、学区质量、周边绿地情况)。目标是生成一个可供 Scikit-learn 使用的 CSV 文件。

4.1 第一步:数据加载与探索

  1. 启动 ArcGIS Pro ,新建或打开一个工程。
  2. 添加数据 :通过“目录”窗格,将你的房屋点数据( House_Points )和相关的辅助数据(地铁站、学区和公园面数据)拖拽到地图中。
  3. 检查属性表 :右键点击 House_Points 图层,选择“属性表”。确认存在“价格”字段(如 Price ),并查看其他现有字段。同时,检查数据中是否存在空值或明显异常值。

4.2 第二步:空间特征工程 - 计算距离特征

房价很可能与到关键设施的距离有关。我们将计算每个房屋到最近地铁站、公园和学区边界的距离。

  1. 打开地理处理工具 :点击功能区“分析”选项卡下的“工具”,打开地理处理窗格。
  2. 计算点到最近要素的距离
    • 搜索并打开 “近邻分析” 工具。
    • 输入要素 :选择 House_Points
    • 邻近要素 :选择 Subway_Stations (点图层)。
    • 勾选**“位置”**(可选,获取最近点的坐标)。
    • 指定输出要素类名称,如 House_Points_NearSubway
    • 点击“运行”。工具会为 House_Points 的每个点添加一个新字段 NEAR_DIST ,表示到最近地铁站的距离。
  3. 重复操作 :对 Parks School_Districts 图层重复上述“近邻分析”操作。每次可以使用上一步的输出作为输入,逐步累积字段。或者,分别运行,最后通过“连接字段”工具基于房屋ID进行合并。
    • 更高效的做法 :使用 “生成近邻表” 工具,它可以一次性计算输入要素到多个邻近要素类的距离,输出一个独立的表格,再通过连接合并回原数据。

4.3 第三步:空间特征工程 - 提取栅格值到点

如果拥有连续的栅格数据(如高程、噪声污染指数),需要将这些值提取到房屋点位上。

  1. 添加栅格数据 :将高程栅格 DEM.tif 添加到地图。
  2. 使用“提取值至点”工具
    • 搜索并打开 “提取值至点” 工具(位于“Spatial Analyst 工具”->“提取”工具箱)。
    • 输入点要素 :选择当前已包含距离字段的房屋点要素(如 House_Points_WithDistances )。
    • 输入栅格 :选择 DEM.tif
    • 指定输出点要素类,如 House_Points_WithDEM
    • 点击“运行”。输出要素的属性表中将增加一个字段(如 RASTERVALU ),存储了该点位置的高程值。

4.4 第四步:数据清洗与格式化

现在,我们的房屋点要素类已经包含了原始价格、多个距离特征和高程特征。接下来需要将其转换为干净的表格。

  1. 处理空值与异常值
    • 打开最终房屋点要素的属性表。
    • 使用“按属性选择”功能,查找 Price 字段为空或为0的记录。根据业务逻辑决定是删除这些记录还是进行填充(例如,使用字段计算器或空间插值进行估算)。
    • 检查新生成的距离字段、栅格值字段是否有异常(如负距离、极端的栅格值)。
  2. 导出为结构化表格
    • 在属性表视图中,确保所有需要的字段都可见(价格、距离1、距离2、距离3、高程…)。
    • 点击属性表右上角的 “导出” 按钮。
    • 选择输出格式为 “CSV”
    • 指定保存路径和文件名,如 House_Data_For_ML.csv
    • 点击“确定”。这将生成一个不包含几何信息,只包含属性字段的纯表格文件。

4.5 第五步:在 Python 环境中进行最终准备

虽然 CSV 已可直接使用,但通常在 Python 中做最后一步处理更方便。

  1. 打开 ArcGIS Pro 的 Python 窗口 :在“视图”选项卡下,找到“Python”窗口并打开。
  2. 使用 ArcPy 和 Pandas 进行转换 (替代导出CSV的另一种方法):
    import arcpy
    import pandas as pd
    import numpy as np
    
    # 设置工作空间
    arcpy.env.workspace = r"C:\YourProject\YourGeodatabase.gdb"
    
    # 将要素类转换为结构化 NumPy 数组
    # 假设你的最终要素类名为 'Final_House_Points'
    fields = ['Price', 'NEAR_DIST_Subway', 'NEAR_DIST_Park', 'NEAR_DIST_School', 'Elevation'] # 列出所有需要的字段
    arr = arcpy.da.FeatureClassToNumPyArray('Final_House_Points', fields, skip_nulls=True)
    
    # 将 NumPy 数组转换为 Pandas DataFrame
    df = pd.DataFrame(arr)
    
    # 检查数据前几行和基本信息
    print(df.head())
    print(df.info())
    
    # 处理缺失值(示例:用中位数填充)
    df.fillna(df.median(), inplace=True)
    
    # 保存为 CSV
    df.to_csv(r"C:\YourProject\Output\House_Data_For_ML.csv", index=False)
    print("数据已成功导出为 CSV 文件。")
    
  3. 数据标准化/归一化 :机器学习模型通常对尺度敏感。你可以在 Pandas 或 Scikit-learn 中进行这一步。
    from sklearn.preprocessing import StandardScaler
    
    # 假设特征列名为 feature_columns,标签列为 'Price'
    feature_columns = ['NEAR_DIST_Subway', 'NEAR_DIST_Park', 'NEAR_DIST_School', 'Elevation']
    X = df[feature_columns]
    y = df['Price']
    
    # 标准化特征
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    
    # 现在 X_scaled 和 y 就可以直接用于 Scikit-learn 的模型训练了
    

5. 进阶技巧与注意事项

5.1 空间采样:避免数据泄漏

地理数据具有空间自相关性,邻近的样本很可能相似。如果随机划分训练集/测试集,会导致模型在测试集上表现虚高。建议使用 空间分块交叉验证 空间分层抽样

  • 手动创建空间分块 :使用“创建渔网”工具生成规则的网格,将房屋点分配到不同网格,再按网格划分训练测试集。
  • 使用 scikit-learn GroupKFold :将网格ID作为分组变量,确保同一网格的样本不会同时出现在训练集和测试集中。

5.2 处理栅格数据作为直接输入

如果你的模型直接以栅格像元作为样本(如影像分类),流程有所不同:

  1. 栅格转多维数组 :使用 arcpy.RasterToNumPyArray 函数将栅格数据读入 NumPy 数组。
  2. 处理 NoData 值 :在转换过程中或之后,需要识别并处理栅格中的 NoData 值。
  3. 展平与重组 :将多维数组(高度 x 宽度 x 波段)重塑为二维数组(样本数 x 特征数)。每个像元(或像元块)是一个样本,每个波段是一个特征。
  4. 对应标签 :你需要一个同样尺寸的标签栅格(或矢量转栅格结果),进行同样的转换,以获取每个样本的标签。

5.3 特征缩放与编码

  • 缩放 :如距离、高程等连续数值特征,务必进行标准化(StandardScaler)或归一化(MinMaxScaler)。
  • 编码 :如果存在类别型空间特征(如房屋所在行政区划),需要使用独热编码(OneHotEncoder)或标签编码(LabelEncoder)进行处理。这些操作在 Pandas 或 Scikit-learn 中完成更便捷。

6. 常见问题与排查方法

在将空间数据预处理为机器学习格式的过程中,你可能会遇到以下典型问题:

问题现象 可能原因 排查方式 解决方案
导出 CSV 后字段丢失或错乱 字段名包含特殊字符或空格;字段类型不兼容(如几何对象)。 检查原始要素类属性表的字段名和类型。 在导出前,使用“字段计算器”或“添加字段”工具创建简化、合规的新字段来存储所需信息。
“提取值至点”结果大量为 NoData 点要素的坐标范围完全在栅格范围之外;或栅格在该位置确实为 NoData。 将点和栅格叠加在地图上直观检查;使用“标识”工具点击几个点查看栅格值。 确保点要素和栅格数据使用相同的坐标系。对于边缘点,考虑使用插值方法或扩大栅格范围。
Python 环境中 arcpy 导入失败 未在 ArcGIS Pro 自带的 Python 环境中运行;或环境路径配置错误。 在 ArcGIS Pro 的 Python 窗口中直接运行 import arcpy 测试。 确保你的 IDE(如 VS Code, Jupyter)使用的 Python 解释器路径指向 ArcGIS Pro 的安装目录下的 python.exe
数据量太大,处理缓慢或内存不足 原始数据(尤其是栅格)分辨率过高或范围过大。 观察任务管理器中 ArcGIS Pro 的内存占用。 1. 采样 :对待处理的点数据进行随机或系统采样。
2. 分区处理 :使用“迭代要素类”或“栅格分块”工具将研究区分成小块分别处理。
3. 降低分辨率 :对用于特征提取的栅格进行聚合(聚合)操作。
机器学习模型训练后,空间预测结果不合理 特征中存在空间泄漏(训练集和测试集空间上不独立);或特征工程未捕捉核心空间关系。 检查训练集和测试集的空间分布图;分析特征的重要性排序。 采用空间交叉验证方法重新评估模型;重新思考并构建更具解释性的空间特征(如使用网络距离而非直线距离)。

7. 最佳实践与使用建议

  1. 流程脚本化 :一旦你的预处理流程稳定,强烈建议使用 ArcPy 将整个流程编写成 Python 脚本。这能确保结果的可复现性,并便于批量处理不同区域或时期的数据。
  2. 版本控制数据 :对原始数据、中间处理数据和最终导出的 CSV 文件进行清晰的版本管理。使用有意义的文件名和目录结构。
  3. 特征文档化 :创建一个“数据字典”或 README 文件,记录每个生成字段的名称、含义、计算方法和单位。这在团队协作或项目后期回顾时至关重要。
  4. 从简单开始 :先使用一小部分子区域的数据跑通整个预处理和建模流程,验证可行性,再扩展到全量数据。
  5. 利用 ArcGIS Pro 的可视化优势 :在预处理前后,多用地图来可视化你的数据和特征。异常值、空间模式往往在地图上比在表格中更显而易见。
  6. 探索 ArcGIS API for Python :对于更复杂的、云原生的或需要与 ArcGIS Online/Enterprise 集成的机器学习工作流,可以学习使用 arcgis 库,它提供了更丰富的 GeoAI 和数据分析功能。

8. 总结与下一步

通过本教程,你应该已经掌握了在 ArcGIS Pro 中为机器学习模型准备空间数据的核心链路:从原始的空间数据(矢量/栅格)出发,通过一系列空间分析工具(近邻分析、提取值至点)进行特征工程,再经过数据清洗和格式转换,最终输出为 CSV 或 DataFrame,无缝对接 Python 机器学习生态。

最值得尝试的起点 是选择一个你熟悉的小型空间数据集,按照本文的步骤,亲手完成一次“特征提取 -> 导出 -> 简单建模(如线性回归)”的全流程。这个过程中,最容易踩的坑通常是 坐标系统不一致 导致的分析失败,以及 忽略了空间自相关性 导致的模型过拟合。

完成基础流程后,可以深入探索以下方向:

  • 更复杂的特征 :尝试计算坡度、坡向、视线分析、空间插值生成的表面等作为特征。
  • 集成深度学习 :探索 ArcGIS Pro 中的深度学习工具(如“检测对象使用深度学习”、“分类像素使用深度学习”),用于遥感影像解译等任务。
  • 部署预测模型 :将训练好的 Scikit-learn 模型通过 arcpy 集成回 ArcGIS Pro,创建自定义地理处理工具,实现对新空间数据的批量预测,并将结果可视化在地图上。

将机器学习的预测能力与 GIS 的空间分析和可视化能力结合,能极大地拓展你对地理现象的理解和决策支持能力。建议收藏本文,在下次需要处理空间数据用于建模时,可以快速回顾关键步骤。

更多推荐